summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp9
-rw-r--r--api/current.txt569
-rw-r--r--api/system-current.txt160
-rw-r--r--api/test-current.txt151
-rw-r--r--cmds/statsd/src/atoms.proto15
-rw-r--r--cmds/statsd/src/external/StatsCompanionServicePuller.cpp4
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.cpp6
-rw-r--r--cmds/statsd/src/guardrail/StatsdStats.cpp59
-rw-r--r--cmds/statsd/src/guardrail/StatsdStats.h68
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.cpp12
-rw-r--r--cmds/statsd/src/stats_log.proto14
-rw-r--r--cmds/statsd/src/stats_log_util.cpp38
-rw-r--r--cmds/statsd/src/stats_log_util.h4
-rw-r--r--config/hiddenapi-greylist.txt1
-rw-r--r--core/java/android/app/ActivityView.java53
-rw-r--r--core/java/android/app/DownloadManager.java25
-rw-r--r--core/java/android/app/INotificationManager.aidl5
-rw-r--r--core/java/android/app/NotificationManager.java96
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java21
-rw-r--r--core/java/android/app/prediction/AppPredictionContext.java18
-rw-r--r--core/java/android/app/prediction/AppPredictionManager.java2
-rw-r--r--core/java/android/app/prediction/AppPredictionSessionId.java2
-rw-r--r--core/java/android/app/prediction/AppPredictor.java38
-rw-r--r--core/java/android/app/prediction/AppTarget.java40
-rw-r--r--core/java/android/app/prediction/AppTargetEvent.java13
-rw-r--r--core/java/android/app/prediction/AppTargetId.java6
-rw-r--r--core/java/android/content/Intent.java24
-rw-r--r--core/java/android/content/pm/ILauncherApps.aidl10
-rw-r--r--core/java/android/content/pm/LauncherApps.java90
-rw-r--r--core/java/android/content/pm/PackageInstaller.java70
-rw-r--r--core/java/android/content/rollback/PackageRollbackInfo.java69
-rw-r--r--core/java/android/content/rollback/RollbackInfo.java2
-rw-r--r--core/java/android/database/sqlite/SQLiteDatabase.java19
-rw-r--r--core/java/android/database/sqlite/SQLiteOpenHelper.java12
-rw-r--r--core/java/android/net/CaptivePortal.java13
-rw-r--r--core/java/android/net/ConnectivityManager.java52
-rw-r--r--core/java/android/net/DhcpResults.java29
-rw-r--r--core/java/android/net/ICaptivePortal.aidl1
-rw-r--r--core/java/android/net/IConnectivityManager.aidl4
-rw-r--r--core/java/android/net/INetworkMonitorCallbacks.aidl1
-rw-r--r--core/java/android/net/INetworkStackConnector.aidl4
-rw-r--r--core/java/android/net/NetworkAgent.java23
-rw-r--r--core/java/android/net/NetworkFactory.java141
-rw-r--r--core/java/android/net/NetworkStack.java5
-rw-r--r--core/java/android/net/NetworkUtils.java27
-rw-r--r--core/java/android/net/StaticIpConfiguration.java9
-rw-r--r--core/java/android/net/metrics/DhcpClientEvent.java4
-rw-r--r--core/java/android/net/shared/FdEventsReader.java17
-rw-r--r--core/java/android/net/shared/InetAddressUtils.java58
-rw-r--r--core/java/android/os/GraphicsEnvironment.java34
-rw-r--r--core/java/android/os/IncidentManager.java186
-rw-r--r--core/java/android/os/IncidentReportArgs.java26
-rw-r--r--core/java/android/os/OWNERS2
-rw-r--r--core/java/android/provider/CalendarContract.java22
-rw-r--r--core/java/android/provider/DeviceConfig.java46
-rw-r--r--core/java/android/provider/Downloads.java10
-rw-r--r--core/java/android/provider/MediaStore.java54
-rw-r--r--core/java/android/provider/Settings.java70
-rw-r--r--core/java/android/service/appprediction/AppPredictionService.java4
-rw-r--r--core/java/android/service/attention/AttentionService.java4
-rw-r--r--core/java/android/service/dreams/OWNERS2
-rw-r--r--core/java/android/service/notification/INotificationListener.aidl1
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java22
-rw-r--r--core/java/android/service/voice/VoiceInteractionService.java32
-rw-r--r--core/java/android/util/FeatureFlagUtils.java1
-rw-r--r--core/java/android/view/AccessibilityInteractionController.java82
-rw-r--r--core/java/android/view/InputWindowHandle.java8
-rw-r--r--core/java/android/view/LayoutInflater.java23
-rw-r--r--core/java/android/view/RemoteAnimationTarget.java8
-rw-r--r--core/java/android/view/View.java2
-rw-r--r--core/java/android/view/ViewRootImpl.java9
-rw-r--r--core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl2
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureSession.java10
-rw-r--r--core/java/android/view/contentcapture/MainContentCaptureSession.java4
-rw-r--r--core/java/android/view/contentcapture/UserDataRemovalRequest.java11
-rw-r--r--core/java/android/view/textclassifier/ExtrasUtils.java127
-rw-r--r--core/java/android/view/textclassifier/TextClassification.java37
-rw-r--r--core/java/android/view/textclassifier/TextClassificationSession.java21
-rw-r--r--core/java/android/view/textclassifier/TextClassifier.java12
-rw-r--r--core/java/android/view/textclassifier/TextClassifierEvent.java36
-rw-r--r--core/java/android/view/textclassifier/TextClassifierEventTronLogger.java19
-rw-r--r--core/java/android/view/textclassifier/TextClassifierImpl.java49
-rw-r--r--core/java/android/webkit/WebViewZygote.java2
-rw-r--r--core/java/android/widget/Editor.java7
-rw-r--r--core/java/android/widget/SelectionActionModeHelper.java118
-rw-r--r--core/java/android/widget/TextView.java23
-rw-r--r--core/java/com/android/internal/app/ChooserActivity.java193
-rw-r--r--core/java/com/android/internal/app/ResolverActivity.java24
-rw-r--r--core/java/com/android/internal/os/AppZygoteInit.java3
-rw-r--r--core/java/com/android/internal/os/ChildZygoteInit.java8
-rw-r--r--core/java/com/android/internal/os/OWNERS1
-rw-r--r--core/java/com/android/internal/os/RoSystemProperties.java3
-rw-r--r--core/java/com/android/internal/os/WebViewZygoteInit.java13
-rw-r--r--core/java/com/android/internal/os/Zygote.java22
-rw-r--r--core/jni/Android.bp1
-rw-r--r--core/jni/AndroidRuntime.cpp13
-rw-r--r--core/jni/OWNERS3
-rwxr-xr-xcore/jni/android/graphics/Bitmap.cpp14
-rw-r--r--core/jni/android_graphics_Canvas.cpp13
-rw-r--r--core/jni/android_hardware_input_InputWindowHandle.cpp6
-rw-r--r--core/jni/android_media_AudioAttributes.cpp2
-rw-r--r--core/jni/android_media_AudioAttributes.h6
-rw-r--r--core/jni/android_os_VintfObject.cpp15
-rw-r--r--core/proto/android/app/settings_enums.proto5
-rw-r--r--core/proto/android/providers/settings/global.proto6
-rw-r--r--core/res/res/layout/chooser_grid.xml67
-rw-r--r--core/res/res/values/config.xml3
-rw-r--r--core/res/res/values/dimens.xml3
-rw-r--r--core/res/res/values/strings.xml2
-rw-r--r--core/res/res/values/styles_device_defaults.xml4
-rw-r--r--core/res/res/values/symbols.xml7
-rw-r--r--core/tests/coretests/Android.mk2
-rw-r--r--core/tests/coretests/AndroidManifest.xml9
-rw-r--r--core/tests/coretests/res/layout/accessibility_test.xml30
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java2
-rw-r--r--core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java220
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java45
-rw-r--r--core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java2
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java18
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java167
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java13
-rw-r--r--data/etc/privapp-permissions-platform.xml1
-rw-r--r--graphics/java/android/graphics/BaseCanvas.java14
-rw-r--r--graphics/java/android/graphics/BaseRecordingCanvas.java12
-rw-r--r--graphics/java/android/graphics/Bitmap.java46
-rw-r--r--graphics/java/android/graphics/Canvas.java26
-rw-r--r--graphics/java/android/graphics/Paint.java12
-rw-r--r--libs/hwui/RecordingCanvas.cpp18
-rw-r--r--libs/hwui/RecordingCanvas.h31
-rw-r--r--libs/hwui/RenderProperties.h8
-rw-r--r--libs/hwui/pipeline/skia/SkiaDisplayList.cpp1
-rw-r--r--libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp4
-rw-r--r--libs/hwui/private/hwui/DrawVkInfo.h2
-rw-r--r--libs/hwui/renderthread/VulkanManager.cpp12
-rw-r--r--libs/hwui/renderthread/VulkanManager.h2
-rw-r--r--location/java/android/location/GnssMeasurementCorrections.java68
-rw-r--r--location/java/android/location/GnssSingleSatCorrection.java4
-rw-r--r--location/java/android/location/LocationManager.java108
-rw-r--r--location/java/android/location/LocationRequest.java5
-rw-r--r--location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java4
-rw-r--r--media/Android.bp67
-rw-r--r--media/apex/java/android/media/MediaPlayer2.java40
-rw-r--r--media/java/android/media/MediaCodec.java2
-rw-r--r--media/java/android/media/MediaDescription.java23
-rw-r--r--media/java/android/media/MediaParceledListSlice.aidl (renamed from media/apex/java/android/media/MediaParceledListSlice.aidl)0
-rw-r--r--media/java/android/media/MediaParceledListSlice.java (renamed from media/apex/java/android/media/MediaParceledListSlice.java)0
-rw-r--r--media/java/android/media/Rating.java29
-rw-r--r--media/java/android/media/VolumeProvider.java (renamed from media/apex/java/android/media/VolumeProvider.java)0
-rw-r--r--media/java/android/media/browse/MediaBrowser.aidl (renamed from media/apex/java/android/media/browse/MediaBrowser.aidl)0
-rw-r--r--media/java/android/media/browse/MediaBrowser.java (renamed from media/apex/java/android/media/browse/MediaBrowser.java)0
-rw-r--r--media/java/android/media/browse/MediaBrowserUtils.java (renamed from media/apex/java/android/media/browse/MediaBrowserUtils.java)0
-rw-r--r--media/java/android/media/session/ControllerCallbackLink.aidl (renamed from media/apex/java/android/media/session/ControllerCallbackLink.aidl)0
-rw-r--r--media/java/android/media/session/ControllerCallbackLink.java (renamed from media/apex/java/android/media/session/ControllerCallbackLink.java)0
-rw-r--r--media/java/android/media/session/ControllerLink.aidl (renamed from media/apex/java/android/media/session/ControllerLink.aidl)0
-rw-r--r--media/java/android/media/session/ControllerLink.java (renamed from media/apex/java/android/media/session/ControllerLink.java)0
-rw-r--r--media/java/android/media/session/ISession.aidl (renamed from media/apex/java/android/media/session/ISession.aidl)0
-rw-r--r--media/java/android/media/session/ISessionCallback.aidl (renamed from media/apex/java/android/media/session/ISessionCallback.aidl)0
-rw-r--r--media/java/android/media/session/ISessionController.aidl (renamed from media/apex/java/android/media/session/ISessionController.aidl)0
-rw-r--r--media/java/android/media/session/ISessionControllerCallback.aidl (renamed from media/apex/java/android/media/session/ISessionControllerCallback.aidl)0
-rw-r--r--media/java/android/media/session/MediaController.aidl (renamed from media/apex/java/android/media/session/MediaController.aidl)0
-rw-r--r--media/java/android/media/session/MediaController.java (renamed from media/apex/java/android/media/session/MediaController.java)0
-rw-r--r--media/java/android/media/session/MediaSession.java5
-rw-r--r--media/java/android/media/session/MediaSessionEngine.java (renamed from media/apex/java/android/media/session/MediaSessionEngine.java)311
-rw-r--r--media/java/android/media/session/MediaSessionProviderService.java (renamed from media/apex/java/android/media/session/MediaSessionProviderService.java)0
-rw-r--r--media/java/android/media/session/PlaybackState.aidl (renamed from media/apex/java/android/media/session/PlaybackState.aidl)0
-rw-r--r--media/java/android/media/session/PlaybackState.java (renamed from media/apex/java/android/media/session/PlaybackState.java)0
-rw-r--r--media/java/android/media/session/SessionCallbackLink.aidl (renamed from media/apex/java/android/media/session/SessionCallbackLink.aidl)0
-rw-r--r--media/java/android/media/session/SessionCallbackLink.java (renamed from media/apex/java/android/media/session/SessionCallbackLink.java)283
-rw-r--r--media/java/android/media/session/SessionLink.aidl (renamed from media/apex/java/android/media/session/SessionLink.aidl)0
-rw-r--r--media/java/android/media/session/SessionLink.java (renamed from media/apex/java/android/media/session/SessionLink.java)0
-rw-r--r--media/java/android/service/media/IMediaBrowserService.aidl (renamed from media/apex/java/android/service/media/IMediaBrowserService.aidl)0
-rw-r--r--media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl (renamed from media/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl)0
-rw-r--r--media/java/android/service/media/MediaBrowserService.java (renamed from media/apex/java/android/service/media/MediaBrowserService.java)0
-rw-r--r--media/jni/android_media_MediaDrm.cpp20
-rw-r--r--media/jni/android_media_MediaDrm.h7
-rw-r--r--native/webview/plat_support/draw_fn.h2
-rw-r--r--native/webview/plat_support/draw_functor.cpp2
-rw-r--r--packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java5
-rw-r--r--packages/CarSystemUI/res/values/integers_car.xml2
-rw-r--r--packages/ExtServices/Android.bp11
-rw-r--r--packages/ExtServices/AndroidManifest.xml1
-rw-r--r--packages/ExtServices/tests/Android.bp26
-rw-r--r--packages/ExtServices/tests/Android.mk26
-rw-r--r--packages/ExtServices/tests/AndroidManifest.xml2
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java2
-rw-r--r--packages/NetworkStack/Android.bp6
-rw-r--r--packages/NetworkStack/src/android/net/apf/ApfFilter.java15
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpClient.java33
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java2
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpServer.java6
-rw-r--r--packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java12
-rw-r--r--packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java15
-rw-r--r--packages/NetworkStack/src/android/net/ip/IpClient.java13
-rw-r--r--packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java16
-rw-r--r--packages/NetworkStack/src/android/net/util/NetworkStackUtils.java13
-rw-r--r--packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java4
-rw-r--r--packages/NetworkStack/src/com/android/server/NetworkStackService.java14
-rw-r--r--packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java19
-rw-r--r--packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java25
-rw-r--r--packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java19
-rw-r--r--packages/SettingsLib/ActionBarShadow/Android.bp14
-rw-r--r--packages/SettingsLib/ActionBarShadow/AndroidManifest.xml23
-rw-r--r--packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java133
-rw-r--r--packages/SettingsLib/Android.bp1
-rw-r--r--packages/SettingsLib/OWNERS2
-rw-r--r--packages/SettingsLib/res/values/strings.xml88
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java172
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java10
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java43
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java116
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java3
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java2
-rw-r--r--packages/Shell/AndroidManifest.xml1
-rw-r--r--packages/SystemUI/AndroidManifest.xml10
-rw-r--r--packages/SystemUI/OWNERS2
-rw-r--r--packages/SystemUI/res-keyguard/values-af/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-am/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ar/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-as/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-az/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-be/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-bg/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-bn/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-bs/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ca/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-cs/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-da/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-de/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-el/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rAU/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rCA/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rGB/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rIN/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rXC/strings.xml77
-rw-r--r--packages/SystemUI/res-keyguard/values-es-rUS/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-es/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-et/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-eu/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-fa/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-fi/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-fr/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-gl/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-gu/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-hi/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-hr/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-hu/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-hy/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-in/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-is/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-it/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-iw/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ja/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ka/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-kk/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-km/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-kn/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ko/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ky/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-lo/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-lt/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-lv/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-mk/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ml/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-mn/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-mr/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ms/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-my/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-nb/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ne/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-nl/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-or/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-pa/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-pl/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-pt/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ro/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ru/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-si/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-sk/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-sl/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-sq/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-sr/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-sv/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-sw/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ta/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-te/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-th/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-tl/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-tr/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-uk/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-ur/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-uz/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-vi/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values-zu/strings.xml74
-rw-r--r--packages/SystemUI/res-keyguard/values/strings.xml4
-rw-r--r--packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl33
-rw-r--r--packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl8
-rw-r--r--packages/SystemUI/res/values-af/strings.xml37
-rw-r--r--packages/SystemUI/res/values-am/strings.xml37
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml47
-rw-r--r--packages/SystemUI/res/values-as/strings.xml37
-rw-r--r--packages/SystemUI/res/values-az/strings.xml37
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml39
-rw-r--r--packages/SystemUI/res/values-be/strings.xml41
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml37
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml37
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml39
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml37
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml41
-rw-r--r--packages/SystemUI/res/values-da/strings.xml37
-rw-r--r--packages/SystemUI/res/values-de/strings.xml37
-rw-r--r--packages/SystemUI/res/values-el/strings.xml37
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml37
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml37
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml37
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml37
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml5
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml37
-rw-r--r--packages/SystemUI/res/values-es/strings.xml37
-rw-r--r--packages/SystemUI/res/values-et/strings.xml37
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml37
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml37
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml37
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml37
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml37
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml37
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml37
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml37
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml39
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml37
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml37
-rw-r--r--packages/SystemUI/res/values-in/strings.xml37
-rw-r--r--packages/SystemUI/res/values-is/strings.xml37
-rw-r--r--packages/SystemUI/res/values-it/strings.xml37
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml41
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml41
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml37
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml37
-rw-r--r--packages/SystemUI/res/values-km/strings.xml37
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml39
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml37
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml37
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml37
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml41
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml39
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml37
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml37
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml37
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml37
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml37
-rw-r--r--packages/SystemUI/res/values-my/strings.xml37
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml37
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml37
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml37
-rw-r--r--packages/SystemUI/res/values-or/strings.xml37
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml37
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml41
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml37
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml37
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml37
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml39
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml41
-rw-r--r--packages/SystemUI/res/values-si/strings.xml37
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml51
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml41
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml37
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml39
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml37
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml37
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml37
-rw-r--r--packages/SystemUI/res/values-te/strings.xml37
-rw-r--r--packages/SystemUI/res/values-th/strings.xml37
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml37
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml37
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml41
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml37
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml37
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml37
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml37
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml39
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml37
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml37
-rw-r--r--packages/SystemUI/src/com/android/systemui/ImageWallpaper.java159
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIFactory.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java115
-rw-r--r--packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java245
-rw-r--r--packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java144
-rw-r--r--packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java103
-rw-r--r--packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java153
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java100
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java45
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java28
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java30
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java145
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java92
-rw-r--r--packages/VpnDialogs/AndroidManifest.xml1
-rw-r--r--proto/src/metrics_constants/metrics_constants.proto5
-rw-r--r--proto/src/wifi.proto27
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java4
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java16
-rw-r--r--services/backup/java/com/android/server/backup/UserBackupManagerService.java2
-rw-r--r--services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java4
-rw-r--r--services/backup/java/com/android/server/backup/utils/AppBackupUtils.java3
-rw-r--r--services/backup/java/com/android/server/backup/utils/RestoreUtils.java4
-rw-r--r--services/backup/java/com/android/server/backup/utils/TarBackupReader.java5
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java89
-rw-r--r--services/core/java/com/android/server/IpSecService.java2
-rw-r--r--services/core/java/com/android/server/LocationManagerService.java29
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java2
-rw-r--r--services/core/java/com/android/server/PackageWatchdog.java18
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java25
-rw-r--r--services/core/java/com/android/server/ThreadPriorityBooster.java18
-rw-r--r--services/core/java/com/android/server/VibratorService.java2
-rw-r--r--services/core/java/com/android/server/am/ActiveInstrumentation.java5
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java21
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java46
-rw-r--r--services/core/java/com/android/server/am/AppCompactor.java54
-rw-r--r--services/core/java/com/android/server/am/AppErrors.java8
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueue.java2
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java20
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java31
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java34
-rw-r--r--services/core/java/com/android/server/am/SettingsToPropertiesMapper.java1
-rw-r--r--services/core/java/com/android/server/am/UidRecord.java8
-rw-r--r--services/core/java/com/android/server/attention/AttentionManagerService.java8
-rw-r--r--services/core/java/com/android/server/audio/AudioDeviceBroker.java2
-rw-r--r--services/core/java/com/android/server/audio/AudioDeviceInventory.java8
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java4
-rw-r--r--services/core/java/com/android/server/audio/RecordingActivityMonitor.java44
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkAgentInfo.java5
-rw-r--r--services/core/java/com/android/server/connectivity/Vpn.java4
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java61
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java3
-rw-r--r--services/core/java/com/android/server/dreams/OWNERS2
-rw-r--r--services/core/java/com/android/server/gpu/GpuService.java163
-rw-r--r--services/core/java/com/android/server/incident/IncidentCompanionService.java403
-rw-r--r--services/core/java/com/android/server/incident/PendingReports.java477
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java11
-rw-r--r--services/core/java/com/android/server/location/ActivityRecognitionProxy.java4
-rw-r--r--services/core/java/com/android/server/location/GeocoderProxy.java4
-rw-r--r--services/core/java/com/android/server/location/GeofenceProxy.java4
-rw-r--r--services/core/java/com/android/server/location/LocationProviderProxy.java4
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java82
-rw-r--r--services/core/java/com/android/server/notification/PreferencesHelper.java28
-rw-r--r--services/core/java/com/android/server/pm/LauncherAppsService.java93
-rw-r--r--services/core/java/com/android/server/pm/OWNERS2
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java20
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java1
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java55
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java18
-rw-r--r--services/core/java/com/android/server/pm/dex/DexManager.java6
-rw-r--r--services/core/java/com/android/server/role/RoleManagerService.java29
-rw-r--r--services/core/java/com/android/server/role/RoleManagerServiceInternal.java38
-rw-r--r--services/core/java/com/android/server/role/RoleUserState.java31
-rw-r--r--services/core/java/com/android/server/rollback/AppDataRollbackHelper.java236
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerService.java5
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java140
-rw-r--r--services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java31
-rw-r--r--services/core/java/com/android/server/rollback/RollbackStore.java76
-rw-r--r--services/core/java/com/android/server/stats/StatsCompanionService.java61
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperManagerService.java7
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java30
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java4
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java24
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java129
-rw-r--r--services/core/java/com/android/server/wm/TapExcludeRegionHolder.java4
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java45
-rw-r--r--services/core/java/com/android/server/wm/TaskTapPointerEventListener.java15
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java9
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java97
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessListener.java7
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java55
-rw-r--r--services/core/jni/com_android_server_input_InputManagerService.cpp9
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp14
-rw-r--r--services/core/jni/com_android_server_security_VerityUtils.cpp90
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java74
-rw-r--r--services/java/com/android/server/SystemServer.java6
-rw-r--r--services/net/Android.bp8
-rw-r--r--services/net/java/android/net/ip/InterfaceController.java23
-rw-r--r--services/net/java/android/net/ip/IpServer.java2
-rw-r--r--services/net/java/android/net/netlink/NetlinkSocket.java17
-rw-r--r--services/net/java/android/net/shared/InitialConfiguration.java21
-rw-r--r--services/net/java/android/net/shared/IpConfigurationParcelableUtil.java20
-rw-r--r--services/net/java/android/net/util/NetdService.java (renamed from services/net/java/android/net/shared/NetdService.java)2
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java84
-rw-r--r--services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java176
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java35
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java73
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java22
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java46
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java36
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java4
-rw-r--r--services/usb/java/com/android/server/usb/UsbPortManager.java9
-rw-r--r--startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java4
-rw-r--r--startop/iorap/tests/Android.mk3
-rw-r--r--telephony/java/android/telephony/NetworkService.java5
-rw-r--r--telephony/java/android/telephony/RadioAccessFamily.java107
-rw-r--r--telephony/java/android/telephony/ServiceState.java2
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java10
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java165
-rw-r--r--telephony/java/android/telephony/data/DataService.java18
-rwxr-xr-xtelephony/java/com/android/internal/telephony/ISub.aidl2
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl15
-rw-r--r--telephony/java/com/android/internal/telephony/RILConstants.java1
-rw-r--r--telephony/java/com/android/internal/telephony/TelephonyProperties.java7
-rw-r--r--tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java69
-rw-r--r--tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java17
-rw-r--r--tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java55
-rw-r--r--tests/net/java/android/net/ip/InterfaceControllerTest.java88
-rw-r--r--tests/net/java/com/android/server/ConnectivityServiceTest.java133
-rw-r--r--tests/net/java/com/android/server/connectivity/LingerMonitorTest.java4
-rw-r--r--tools/aapt/AaptAssets.cpp1
-rw-r--r--wifi/java/android/net/wifi/WifiEnterpriseConfig.java14
-rw-r--r--wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java45
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pManager.java69
-rw-r--r--wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java7
531 files changed, 17313 insertions, 4634 deletions
diff --git a/Android.bp b/Android.bp
index f97cf72a5d33..9b62b7af4558 100644
--- a/Android.bp
+++ b/Android.bp
@@ -49,8 +49,6 @@ java_defaults {
"rs/java/**/*.java",
":framework-javastream-protos",
- // TODO: Resolve circular library dependency and remove media1-srcs
- ":media1-srcs",
"core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl",
"core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl",
@@ -505,7 +503,11 @@ java_defaults {
"media/java/android/media/session/ICallback.aidl",
"media/java/android/media/session/IOnMediaKeyListener.aidl",
"media/java/android/media/session/IOnVolumeKeyLongPressListener.aidl",
+ "media/java/android/media/session/ISession.aidl",
"media/java/android/media/session/ISession2TokensListener.aidl",
+ "media/java/android/media/session/ISessionCallback.aidl",
+ "media/java/android/media/session/ISessionController.aidl",
+ "media/java/android/media/session/ISessionControllerCallback.aidl",
"media/java/android/media/session/ISessionManager.aidl",
"media/java/android/media/soundtrigger/ISoundTriggerDetectionService.aidl",
"media/java/android/media/soundtrigger/ISoundTriggerDetectionServiceClient.aidl",
@@ -520,6 +522,8 @@ java_defaults {
"media/java/android/media/tv/ITvInputSessionCallback.aidl",
"media/java/android/media/tv/ITvRemoteProvider.aidl",
"media/java/android/media/tv/ITvRemoteServiceInput.aidl",
+ "media/java/android/service/media/IMediaBrowserService.aidl",
+ "media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl",
"telecomm/java/com/android/internal/telecom/ICallRedirectionAdapter.aidl",
"telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl",
"telecomm/java/com/android/internal/telecom/ICallScreeningAdapter.aidl",
@@ -922,6 +926,7 @@ filegroup {
"core/java/android/annotation/UnsupportedAppUsage.java",
"core/java/android/net/DhcpResults.java",
"core/java/android/util/LocalLog.java",
+ "core/java/com/android/internal/annotations/GuardedBy.java",
"core/java/com/android/internal/annotations/VisibleForTesting.java",
"core/java/com/android/internal/util/HexDump.java",
"core/java/com/android/internal/util/IndentingPrintWriter.java",
diff --git a/api/current.txt b/api/current.txt
index 10d1697e36ee..4a1fccf0b5ae 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5811,6 +5811,7 @@ package android.app {
method public final void setInterruptionFilter(int);
method public void setNotificationDelegate(@NonNull String);
method public void setNotificationPolicy(@NonNull android.app.NotificationManager.Policy);
+ method public boolean shouldHideSilentStatusBarIcons();
method public boolean updateAutomaticZenRule(String, android.app.AutomaticZenRule);
field public static final String ACTION_APP_BLOCK_STATE_CHANGED = "android.app.action.APP_BLOCK_STATE_CHANGED";
field public static final String ACTION_AUTOMATIC_ZEN_RULE = "android.app.action.AUTOMATIC_ZEN_RULE";
@@ -11232,6 +11233,7 @@ package android.content.pm {
public class LauncherApps {
method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(String, android.os.UserHandle);
+ method @NonNull public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllPackageInstallerSessions();
method @Nullable public android.content.pm.LauncherApps.AppUsageLimit getAppUsageLimit(String, android.os.UserHandle);
method public android.content.pm.ApplicationInfo getApplicationInfo(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
method public android.content.pm.LauncherApps.PinItemRequest getPinItemRequest(android.content.Intent);
@@ -11248,13 +11250,16 @@ package android.content.pm {
method public void pinShortcuts(@NonNull String, @NonNull java.util.List<java.lang.String>, @NonNull android.os.UserHandle);
method public void registerCallback(android.content.pm.LauncherApps.Callback);
method public void registerCallback(android.content.pm.LauncherApps.Callback, android.os.Handler);
+ method public void registerPackageInstallerSessionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.content.pm.PackageInstaller.SessionCallback);
method public android.content.pm.LauncherActivityInfo resolveActivity(android.content.Intent, android.os.UserHandle);
method public boolean shouldHideFromSuggestions(@NonNull String, @NonNull android.os.UserHandle);
method public void startAppDetailsActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
method public void startMainActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle);
+ method public void startPackageInstallerSessionDetailsActivity(android.content.pm.PackageInstaller.SessionInfo, android.graphics.Rect, android.os.Bundle);
method public void startShortcut(@NonNull String, @NonNull String, @Nullable android.graphics.Rect, @Nullable android.os.Bundle, @NonNull android.os.UserHandle);
method public void startShortcut(@NonNull android.content.pm.ShortcutInfo, @Nullable android.graphics.Rect, @Nullable android.os.Bundle);
method public void unregisterCallback(android.content.pm.LauncherApps.Callback);
+ method public void unregisterPackageInstallerSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
field public static final String ACTION_CONFIRM_PIN_APPWIDGET = "android.content.pm.action.CONFIRM_PIN_APPWIDGET";
field public static final String ACTION_CONFIRM_PIN_SHORTCUT = "android.content.pm.action.CONFIRM_PIN_SHORTCUT";
field public static final String EXTRA_PIN_ITEM_REQUEST = "android.content.pm.extra.PIN_ITEM_REQUEST";
@@ -11444,6 +11449,7 @@ package android.content.pm {
method public long getSize();
method public int getStagedSessionErrorCode();
method public String getStagedSessionErrorMessage();
+ method public android.os.UserHandle getUser();
method public boolean isActive();
method public boolean isMultiPackage();
method public boolean isSealed();
@@ -12978,7 +12984,7 @@ package android.database.sqlite {
method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder removeOpenFlags(int);
method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setCursorFactory(@Nullable android.database.sqlite.SQLiteDatabase.CursorFactory);
method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setErrorHandler(@Nullable android.database.DatabaseErrorHandler);
- method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setIdleConnectionTimeout(@IntRange(from=0) long);
+ method @Deprecated @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setIdleConnectionTimeout(@IntRange(from=0) long);
method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setJournalMode(@NonNull String);
method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setLookasideConfig(@IntRange(from=0) int, @IntRange(from=0) int);
method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setOpenFlags(int);
@@ -13039,7 +13045,7 @@ package android.database.sqlite {
method public void onDowngrade(android.database.sqlite.SQLiteDatabase, int, int);
method public void onOpen(android.database.sqlite.SQLiteDatabase);
method public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase, int, int);
- method public void setIdleConnectionTimeout(@IntRange(from=0) long);
+ method @Deprecated public void setIdleConnectionTimeout(@IntRange(from=0) long);
method public void setLookasideConfig(@IntRange(from=0) int, @IntRange(from=0) int);
method public void setOpenParams(@NonNull android.database.sqlite.SQLiteDatabase.OpenParams);
method public void setWriteAheadLoggingEnabled(boolean);
@@ -13551,10 +13557,12 @@ package android.graphics {
method public static android.graphics.Bitmap createScaledBitmap(@NonNull android.graphics.Bitmap, int, int, boolean);
method public int describeContents();
method public void eraseColor(@ColorInt int);
+ method public void eraseColor(@ColorLong long);
method @CheckResult public android.graphics.Bitmap extractAlpha();
method @CheckResult public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
method public int getAllocationByteCount();
method public int getByteCount();
+ method public android.graphics.Color getColor(int, int);
method @Nullable public android.graphics.ColorSpace getColorSpace();
method public android.graphics.Bitmap.Config getConfig();
method public int getDensity();
@@ -13580,6 +13588,7 @@ package android.graphics {
method public void reconfigure(int, int, android.graphics.Bitmap.Config);
method public void recycle();
method public boolean sameAs(android.graphics.Bitmap);
+ method public void setColorSpace(@NonNull android.graphics.ColorSpace);
method public void setConfig(android.graphics.Bitmap.Config);
method public void setDensity(int);
method public void setHasAlpha(boolean);
@@ -13766,8 +13775,10 @@ package android.graphics {
method public void drawBitmapMesh(@NonNull android.graphics.Bitmap, int, int, @NonNull float[], int, @Nullable int[], int, @Nullable android.graphics.Paint);
method public void drawCircle(float, float, float, @NonNull android.graphics.Paint);
method public void drawColor(@ColorInt int);
+ method public void drawColor(@ColorLong long);
method @Deprecated public void drawColor(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode);
method public void drawColor(@ColorInt int, @NonNull android.graphics.BlendMode);
+ method public void drawColor(@ColorLong long, @NonNull android.graphics.BlendMode);
method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float, float, @NonNull android.graphics.RectF, float, float, @NonNull android.graphics.Paint);
method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float[], @NonNull android.graphics.RectF, float[], @NonNull android.graphics.Paint);
method public void drawLine(float, float, float, float, @NonNull android.graphics.Paint);
@@ -14379,6 +14390,7 @@ package android.graphics {
method @Nullable public android.graphics.BlendMode getBlendMode();
method @ColorInt public int getColor();
method public android.graphics.ColorFilter getColorFilter();
+ method @ColorLong public long getColorLong();
method public boolean getFillPath(android.graphics.Path, android.graphics.Path);
method public int getFlags();
method public String getFontFeatureSettings();
@@ -14399,6 +14411,7 @@ package android.graphics {
method public float getRunAdvance(CharSequence, int, int, int, int, boolean, int);
method public android.graphics.Shader getShader();
method @ColorInt public int getShadowLayerColor();
+ method @ColorLong public long getShadowLayerColorLong();
method public float getShadowLayerDx();
method public float getShadowLayerDy();
method public float getShadowLayerRadius();
@@ -14453,6 +14466,7 @@ package android.graphics {
method public void setAntiAlias(boolean);
method public void setBlendMode(@Nullable android.graphics.BlendMode);
method public void setColor(@ColorInt int);
+ method public void setColor(@ColorLong long);
method public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter);
method public void setDither(boolean);
method public void setElegantTextHeight(boolean);
@@ -14469,6 +14483,7 @@ package android.graphics {
method public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
method public android.graphics.Shader setShader(android.graphics.Shader);
method public void setShadowLayer(float, float, float, @ColorInt int);
+ method public void setShadowLayer(float, float, float, @ColorLong long);
method public void setStrikeThruText(boolean);
method public void setStrokeCap(android.graphics.Paint.Cap);
method public void setStrokeJoin(android.graphics.Paint.Join);
@@ -25572,6 +25587,14 @@ package android.media {
field public static final int PLAYER_STATE_PAUSED = 1003; // 0x3eb
field public static final int PLAYER_STATE_PLAYING = 1004; // 0x3ec
field public static final int PLAYER_STATE_PREPARED = 1002; // 0x3ea
+ field public static final int PREPARE_DRM_STATUS_KEY_EXCHANGE_ERROR = 7; // 0x7
+ field public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3; // 0x3
+ field public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1; // 0x1
+ field public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2; // 0x2
+ field public static final int PREPARE_DRM_STATUS_RESOURCE_BUSY = 5; // 0x5
+ field public static final int PREPARE_DRM_STATUS_RESTORE_ERROR = 6; // 0x6
+ field public static final int PREPARE_DRM_STATUS_SUCCESS = 0; // 0x0
+ field public static final int PREPARE_DRM_STATUS_UNSUPPORTED_SCHEME = 4; // 0x4
field public static final int SEEK_CLOSEST = 3; // 0x3
field public static final int SEEK_CLOSEST_SYNC = 2; // 0x2
field public static final int SEEK_NEXT_SYNC = 1; // 0x1
@@ -30390,6 +30413,7 @@ package android.net.wifi.p2p {
method public void removeLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void removeServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestDeviceInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DeviceInfoListener);
method public void requestDiscoveryState(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DiscoveryStateListener);
method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener);
method public void requestNetworkInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.NetworkInfoListener);
@@ -30438,6 +30462,10 @@ package android.net.wifi.p2p {
method public void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo);
}
+ public static interface WifiP2pManager.DeviceInfoListener {
+ method public void onDeviceInfoAvailable(android.net.wifi.p2p.WifiP2pDevice);
+ }
+
public static interface WifiP2pManager.DiscoveryStateListener {
method public void onDiscoveryStateAvailable(int);
}
@@ -36522,7 +36550,7 @@ package android.provider {
field public static final String ACCOUNT_TYPE_LOCAL = "LOCAL";
field public static final String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER";
field public static final String ACTION_HANDLE_CUSTOM_EVENT = "android.provider.calendar.action.HANDLE_CUSTOM_EVENT";
- field public static final String ACTION_VIEW_WORK_CALENDAR_EVENT = "android.provider.calendar.action.VIEW_WORK_CALENDAR_EVENT";
+ field public static final String ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT = "android.provider.calendar.action.VIEW_MANAGED_PROFILE_CALENDAR_EVENT";
field public static final String AUTHORITY = "com.android.calendar";
field public static final String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
field public static final android.net.Uri CONTENT_URI;
@@ -38482,13 +38510,13 @@ package android.provider {
field public static final String BUCKET_ID = "bucket_id";
field public static final String DATE_TAKEN = "datetaken";
field public static final String DESCRIPTION = "description";
+ field public static final String GROUP_ID = "group_id";
field public static final String IS_PRIVATE = "isprivate";
field @Deprecated public static final String LATITUDE = "latitude";
field @Deprecated public static final String LONGITUDE = "longitude";
field @Deprecated public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
field public static final String ORIENTATION = "orientation";
field @Deprecated public static final String PICASA_ID = "picasa_id";
- field public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
}
public static final class MediaStore.Images.Media implements android.provider.MediaStore.Images.ImageColumns {
@@ -38542,6 +38570,8 @@ package android.provider {
field public static final String IS_TRASHED = "is_trashed";
field public static final String MIME_TYPE = "mime_type";
field public static final String OWNER_PACKAGE_NAME = "owner_package_name";
+ field public static final String PRIMARY_DIRECTORY = "primary_directory";
+ field public static final String SECONDARY_DIRECTORY = "secondary_directory";
field public static final String SIZE = "_size";
field public static final String TITLE = "title";
field public static final String WIDTH = "width";
@@ -38609,13 +38639,13 @@ package android.provider {
field public static final String DATE_TAKEN = "datetaken";
field public static final String DESCRIPTION = "description";
field public static final String DURATION = "duration";
+ field public static final String GROUP_ID = "group_id";
field public static final String IS_PRIVATE = "isprivate";
field public static final String LANGUAGE = "language";
field @Deprecated public static final String LATITUDE = "latitude";
field @Deprecated public static final String LONGITUDE = "longitude";
field @Deprecated public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
field public static final String RESOLUTION = "resolution";
- field public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
field public static final String TAGS = "tags";
}
@@ -38839,6 +38869,7 @@ package android.provider {
field @Deprecated public static final int LOCATION_MODE_BATTERY_SAVING = 2; // 0x2
field @Deprecated public static final int LOCATION_MODE_HIGH_ACCURACY = 3; // 0x3
field @Deprecated public static final int LOCATION_MODE_OFF = 0; // 0x0
+ field @Deprecated public static final int LOCATION_MODE_ON = 3; // 0x3
field @Deprecated public static final int LOCATION_MODE_SENSORS_ONLY = 1; // 0x1
field @Deprecated public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
field @Deprecated public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
@@ -41550,6 +41581,7 @@ package android.service.notification {
method public void onNotificationRemoved(android.service.notification.StatusBarNotification);
method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap);
method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap, int);
+ method public void onStatusBarIconsBehaviorChanged(boolean);
method public final void requestInterruptionFilter(int);
method public final void requestListenerHints(int);
method public static void requestRebind(android.content.ComponentName);
@@ -41862,10 +41894,6 @@ package android.service.voice {
method public void showSession(android.os.Bundle, int);
field public static final String SERVICE_INTERFACE = "android.service.voice.VoiceInteractionService";
field public static final String SERVICE_META_DATA = "android.voice_interaction";
- field public static final int VOICE_STATE_CONDITIONAL_LISTENING = 1; // 0x1
- field public static final int VOICE_STATE_FULFILLING = 3; // 0x3
- field public static final int VOICE_STATE_LISTENING = 2; // 0x2
- field public static final int VOICE_STATE_NONE = 0; // 0x0
}
public class VoiceInteractionSession implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback {
@@ -45057,6 +45085,7 @@ package android.telephony {
method public boolean setVoiceMailNumber(String, String);
method @Deprecated public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri);
method @Deprecated public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void switchMultiSimConfig(int);
method public boolean updateAvailableNetworks(java.util.List<android.telephony.AvailableNetworkInfo>);
field public static final String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL";
field public static final String ACTION_NETWORK_COUNTRY_CHANGED = "android.telephony.action.NETWORK_COUNTRY_CHANGED";
@@ -52869,7 +52898,7 @@ package android.view.contentcapture {
method @NonNull public final android.view.ViewStructure newVirtualViewStructure(@NonNull android.view.autofill.AutofillId, long);
method public final void notifyViewAppeared(@NonNull android.view.ViewStructure);
method public final void notifyViewDisappeared(@NonNull android.view.autofill.AutofillId);
- method public final void notifyViewTextChanged(@NonNull android.view.autofill.AutofillId, @Nullable CharSequence, int);
+ method public final void notifyViewTextChanged(@NonNull android.view.autofill.AutofillId, @Nullable CharSequence);
method public final void notifyViewsDisappeared(@NonNull android.view.autofill.AutofillId, @NonNull long[]);
}
@@ -52881,6 +52910,9 @@ package android.view.contentcapture {
public final class UserDataRemovalRequest implements android.os.Parcelable {
method public int describeContents();
+ method @NonNull public String getPackageName();
+ method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.UriRequest> getUriRequests();
+ method public boolean isForEverything();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.contentcapture.UserDataRemovalRequest> CREATOR;
}
@@ -52892,6 +52924,11 @@ package android.view.contentcapture {
method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything();
}
+ public final class UserDataRemovalRequest.UriRequest {
+ method @NonNull public android.net.Uri getUri();
+ method @NonNull public boolean isRecursive();
+ }
+
}
package android.view.inputmethod {
@@ -58111,13 +58148,13 @@ package java.io {
ctor public ByteArrayOutputStream(int);
method public void reset();
method public int size();
- method public byte[] toByteArray();
+ method @NonNull public byte[] toByteArray();
method @NonNull public String toString(@NonNull String) throws java.io.UnsupportedEncodingException;
method @Deprecated @NonNull public String toString(int);
method public void write(int);
- method public void write(byte[], int, int);
+ method public void write(@NonNull byte[], int, int);
method public void writeTo(@NonNull java.io.OutputStream) throws java.io.IOException;
- field protected byte[] buf;
+ field @NonNull protected byte[] buf;
field protected int count;
}
@@ -58288,12 +58325,12 @@ package java.io {
method public boolean isHidden();
method public long lastModified();
method public long length();
- method public String[] list();
- method public String[] list(@Nullable java.io.FilenameFilter);
- method public java.io.File[] listFiles();
- method public java.io.File[] listFiles(@Nullable java.io.FilenameFilter);
- method public java.io.File[] listFiles(@Nullable java.io.FileFilter);
- method public static java.io.File[] listRoots();
+ method @Nullable public String[] list();
+ method @Nullable public String[] list(@Nullable java.io.FilenameFilter);
+ method @Nullable public java.io.File[] listFiles();
+ method @Nullable public java.io.File[] listFiles(@Nullable java.io.FilenameFilter);
+ method @Nullable public java.io.File[] listFiles(@Nullable java.io.FileFilter);
+ method @NonNull public static java.io.File[] listRoots();
method public boolean mkdir();
method public boolean mkdirs();
method public boolean renameTo(@NonNull java.io.File);
@@ -58782,8 +58819,8 @@ package java.io {
method protected void clearError();
method public void close();
method public void flush();
- method @NonNull public java.io.PrintWriter format(@NonNull String, java.lang.Object...);
- method @NonNull public java.io.PrintWriter format(@Nullable java.util.Locale, @NonNull String, java.lang.Object...);
+ method @NonNull public java.io.PrintWriter format(@NonNull String, @NonNull java.lang.Object...);
+ method @NonNull public java.io.PrintWriter format(@Nullable java.util.Locale, @NonNull String, @NonNull java.lang.Object...);
method public void print(boolean);
method public void print(char);
method public void print(int);
@@ -58793,8 +58830,8 @@ package java.io {
method public void print(char[]);
method public void print(@Nullable String);
method public void print(@Nullable Object);
- method @NonNull public java.io.PrintWriter printf(@NonNull String, java.lang.Object...);
- method @NonNull public java.io.PrintWriter printf(@Nullable java.util.Locale, @NonNull String, java.lang.Object...);
+ method @NonNull public java.io.PrintWriter printf(@NonNull String, @NonNull java.lang.Object...);
+ method @NonNull public java.io.PrintWriter printf(@Nullable java.util.Locale, @NonNull String, @NonNull java.lang.Object...);
method public void println();
method public void println(boolean);
method public void println(char);
@@ -59620,45 +59657,45 @@ package java.lang {
method @NonNull public static Class<?> forName(@NonNull String) throws java.lang.ClassNotFoundException;
method @NonNull public static Class<?> forName(@NonNull String, boolean, @Nullable ClassLoader) throws java.lang.ClassNotFoundException;
method @Nullable public <A extends java.lang.annotation.Annotation> A getAnnotation(@NonNull Class<A>);
- method public java.lang.annotation.Annotation[] getAnnotations();
+ method @NonNull public java.lang.annotation.Annotation[] getAnnotations();
method @NonNull public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(@NonNull Class<A>);
method @Nullable public String getCanonicalName();
method @Nullable public ClassLoader getClassLoader();
- method public Class<?>[] getClasses();
+ method @NonNull public Class<?>[] getClasses();
method @Nullable public Class<?> getComponentType();
- method @NonNull public java.lang.reflect.Constructor<T> getConstructor(Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
- method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
+ method @NonNull public java.lang.reflect.Constructor<T> getConstructor(@Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+ method @NonNull public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
method @Nullable public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(@NonNull Class<A>);
- method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- method public Class<?>[] getDeclaredClasses();
- method @NonNull public java.lang.reflect.Constructor<T> getDeclaredConstructor(Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
- method public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException;
+ method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method @NonNull public Class<?>[] getDeclaredClasses();
+ method @NonNull public java.lang.reflect.Constructor<T> getDeclaredConstructor(@Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+ method @NonNull public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException;
method @NonNull public java.lang.reflect.Field getDeclaredField(@NonNull String) throws java.lang.NoSuchFieldException;
- method public java.lang.reflect.Field[] getDeclaredFields();
- method @NonNull public java.lang.reflect.Method getDeclaredMethod(@NonNull String, Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
- method public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException;
+ method @NonNull public java.lang.reflect.Field[] getDeclaredFields();
+ method @NonNull public java.lang.reflect.Method getDeclaredMethod(@NonNull String, @Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+ method @NonNull public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException;
method @Nullable public Class<?> getDeclaringClass();
method @Nullable public Class<?> getEnclosingClass();
method @Nullable public java.lang.reflect.Constructor<?> getEnclosingConstructor();
method @Nullable public java.lang.reflect.Method getEnclosingMethod();
- method public T[] getEnumConstants();
+ method @Nullable public T[] getEnumConstants();
method @NonNull public java.lang.reflect.Field getField(@NonNull String) throws java.lang.NoSuchFieldException;
- method public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException;
- method public java.lang.reflect.Type[] getGenericInterfaces();
+ method @NonNull public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException;
+ method @NonNull public java.lang.reflect.Type[] getGenericInterfaces();
method @Nullable public java.lang.reflect.Type getGenericSuperclass();
- method public Class<?>[] getInterfaces();
- method @NonNull public java.lang.reflect.Method getMethod(@NonNull String, Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
- method public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException;
+ method @NonNull public Class<?>[] getInterfaces();
+ method @NonNull public java.lang.reflect.Method getMethod(@NonNull String, @Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
+ method @NonNull public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException;
method public int getModifiers();
method @NonNull public String getName();
method @Nullable public Package getPackage();
method @Nullable public java.security.ProtectionDomain getProtectionDomain();
method @Nullable public java.net.URL getResource(@NonNull String);
method @Nullable public java.io.InputStream getResourceAsStream(@NonNull String);
- method public Object[] getSigners();
+ method @Nullable public Object[] getSigners();
method @NonNull public String getSimpleName();
method @Nullable public Class<? super T> getSuperclass();
- method public java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
+ method @NonNull public java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
method public boolean isAnnotation();
method public boolean isAnonymousClass();
method public boolean isArray();
@@ -60545,8 +60582,8 @@ package java.lang {
method @NonNull public static String copyValueOf(char[]);
method public boolean endsWith(@NonNull String);
method public boolean equalsIgnoreCase(@Nullable String);
- method @NonNull public static String format(@NonNull String, java.lang.Object...);
- method @NonNull public static String format(@NonNull java.util.Locale, @NonNull String, java.lang.Object...);
+ method @NonNull public static String format(@NonNull String, @NonNull java.lang.Object...);
+ method @NonNull public static String format(@NonNull java.util.Locale, @NonNull String, @NonNull java.lang.Object...);
method @Deprecated public void getBytes(int, int, byte[], int);
method public byte[] getBytes(@NonNull String) throws java.io.UnsupportedEncodingException;
method public byte[] getBytes(@NonNull java.nio.charset.Charset);
@@ -60558,7 +60595,7 @@ package java.lang {
method public int indexOf(@NonNull String, int);
method @NonNull public String intern();
method public boolean isEmpty();
- method @NonNull public static String join(@NonNull CharSequence, java.lang.CharSequence...);
+ method @NonNull public static String join(@NonNull CharSequence, @Nullable java.lang.CharSequence...);
method @NonNull public static String join(@NonNull CharSequence, @NonNull Iterable<? extends java.lang.CharSequence>);
method public int lastIndexOf(int);
method public int lastIndexOf(int, int);
@@ -60573,8 +60610,8 @@ package java.lang {
method @NonNull public String replace(@NonNull CharSequence, @NonNull CharSequence);
method @NonNull public String replaceAll(@NonNull String, @NonNull String);
method @NonNull public String replaceFirst(@NonNull String, @NonNull String);
- method public String[] split(@NonNull String, int);
- method public String[] split(@NonNull String);
+ method @NonNull public String[] split(@NonNull String, int);
+ method @NonNull public String[] split(@NonNull String);
method public boolean startsWith(@NonNull String, int);
method public boolean startsWith(@NonNull String);
method @NonNull public CharSequence subSequence(int, int);
@@ -60775,7 +60812,7 @@ package java.lang {
method public long getId();
method @NonNull public final String getName();
method public final int getPriority();
- method public StackTraceElement[] getStackTrace();
+ method @NonNull public StackTraceElement[] getStackTrace();
method @NonNull public java.lang.Thread.State getState();
method @Nullable public final ThreadGroup getThreadGroup();
method @Nullable public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
@@ -60873,13 +60910,13 @@ package java.lang {
method @Nullable public Throwable getCause();
method @Nullable public String getLocalizedMessage();
method @Nullable public String getMessage();
- method public StackTraceElement[] getStackTrace();
- method public final Throwable[] getSuppressed();
+ method @NonNull public StackTraceElement[] getStackTrace();
+ method @NonNull public final Throwable[] getSuppressed();
method @NonNull public Throwable initCause(@Nullable Throwable);
method public void printStackTrace();
method public void printStackTrace(@NonNull java.io.PrintStream);
method public void printStackTrace(@NonNull java.io.PrintWriter);
- method public void setStackTrace(StackTraceElement[]);
+ method public void setStackTrace(@NonNull StackTraceElement[]);
}
public class TypeNotPresentException extends java.lang.RuntimeException {
@@ -61202,8 +61239,8 @@ package java.lang.reflect {
public class AccessibleObject implements java.lang.reflect.AnnotatedElement {
ctor protected AccessibleObject();
method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>);
- method public java.lang.annotation.Annotation[] getAnnotations();
- method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method @NonNull public java.lang.annotation.Annotation[] getAnnotations();
+ method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations();
method public boolean isAccessible();
method public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean) throws java.lang.SecurityException;
method public void setAccessible(boolean) throws java.lang.SecurityException;
@@ -61211,10 +61248,10 @@ package java.lang.reflect {
public interface AnnotatedElement {
method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>);
- method public java.lang.annotation.Annotation[] getAnnotations();
+ method @NonNull public java.lang.annotation.Annotation[] getAnnotations();
method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(@NonNull Class<T>);
method @Nullable public default <T extends java.lang.annotation.Annotation> T getDeclaredAnnotation(@NonNull Class<T>);
- method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations();
method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(@NonNull Class<T>);
method public default boolean isAnnotationPresent(@NonNull Class<? extends java.lang.annotation.Annotation>);
}
@@ -61249,20 +61286,20 @@ package java.lang.reflect {
method public int getModifiers();
method @NonNull public String getName();
method public java.lang.annotation.Annotation[][] getParameterAnnotations();
- method public Class<?>[] getParameterTypes();
+ method @NonNull public Class<?>[] getParameterTypes();
method public java.lang.reflect.TypeVariable<java.lang.reflect.Constructor<T>>[] getTypeParameters();
method @NonNull public T newInstance(java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
method @NonNull public String toGenericString();
}
public abstract class Executable extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
- method public abstract Class<?>[] getExceptionTypes();
- method public java.lang.reflect.Type[] getGenericExceptionTypes();
- method public java.lang.reflect.Type[] getGenericParameterTypes();
- method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
+ method @NonNull public abstract Class<?>[] getExceptionTypes();
+ method @NonNull public java.lang.reflect.Type[] getGenericExceptionTypes();
+ method @NonNull public java.lang.reflect.Type[] getGenericParameterTypes();
+ method @NonNull public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
method public int getParameterCount();
- method public abstract Class<?>[] getParameterTypes();
- method public java.lang.reflect.Parameter[] getParameters();
+ method @NonNull public abstract Class<?>[] getParameterTypes();
+ method @NonNull public java.lang.reflect.Parameter[] getParameters();
method public final boolean isAnnotationPresent(@NonNull Class<? extends java.lang.annotation.Annotation>);
method public boolean isSynthetic();
method public boolean isVarArgs();
@@ -61351,7 +61388,7 @@ package java.lang.reflect {
method @NonNull public Class<?>[] getParameterTypes();
method @NonNull public Class<?> getReturnType();
method @NonNull public java.lang.reflect.TypeVariable<java.lang.reflect.Method>[] getTypeParameters();
- method @Nullable public Object invoke(@Nullable Object, java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
+ method @Nullable public Object invoke(@Nullable Object, @Nullable java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
method public boolean isBridge();
method public boolean isDefault();
method @NonNull public String toGenericString();
@@ -61394,8 +61431,8 @@ package java.lang.reflect {
public final class Parameter implements java.lang.reflect.AnnotatedElement {
method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>);
- method public java.lang.annotation.Annotation[] getAnnotations();
- method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
+ method @NonNull public java.lang.annotation.Annotation[] getAnnotations();
+ method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations();
method @NonNull public java.lang.reflect.Executable getDeclaringExecutable();
method public int getModifiers();
method @NonNull public String getName();
@@ -61408,7 +61445,7 @@ package java.lang.reflect {
}
public interface ParameterizedType extends java.lang.reflect.Type {
- method public java.lang.reflect.Type[] getActualTypeArguments();
+ method @NonNull public java.lang.reflect.Type[] getActualTypeArguments();
method @Nullable public java.lang.reflect.Type getOwnerType();
method @NonNull public java.lang.reflect.Type getRawType();
}
@@ -61416,9 +61453,9 @@ package java.lang.reflect {
public class Proxy implements java.io.Serializable {
ctor protected Proxy(@NonNull java.lang.reflect.InvocationHandler);
method @NonNull public static java.lang.reflect.InvocationHandler getInvocationHandler(@NonNull Object) throws java.lang.IllegalArgumentException;
- method @NonNull public static Class<?> getProxyClass(@Nullable ClassLoader, Class<?>...) throws java.lang.IllegalArgumentException;
+ method @NonNull public static Class<?> getProxyClass(@Nullable ClassLoader, @NonNull Class<?>...) throws java.lang.IllegalArgumentException;
method public static boolean isProxyClass(@NonNull Class<?>);
- method @NonNull public static Object newProxyInstance(@Nullable ClassLoader, Class<?>[], @NonNull java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException;
+ method @NonNull public static Object newProxyInstance(@Nullable ClassLoader, @NonNull Class<?>[], @NonNull java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException;
field protected java.lang.reflect.InvocationHandler h;
}
@@ -61432,7 +61469,7 @@ package java.lang.reflect {
}
public interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> extends java.lang.reflect.Type {
- method public java.lang.reflect.Type[] getBounds();
+ method @NonNull public java.lang.reflect.Type[] getBounds();
method @NonNull public D getGenericDeclaration();
method @NonNull public String getName();
}
@@ -61444,8 +61481,8 @@ package java.lang.reflect {
}
public interface WildcardType extends java.lang.reflect.Type {
- method public java.lang.reflect.Type[] getLowerBounds();
- method public java.lang.reflect.Type[] getUpperBounds();
+ method @NonNull public java.lang.reflect.Type[] getLowerBounds();
+ method @NonNull public java.lang.reflect.Type[] getUpperBounds();
}
}
@@ -62489,7 +62526,7 @@ package java.nio {
public abstract class ByteBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.ByteBuffer> {
method @NonNull public static java.nio.ByteBuffer allocate(int);
method @NonNull public static java.nio.ByteBuffer allocateDirect(int);
- method public final byte[] array();
+ method @NonNull public final byte[] array();
method public final int arrayOffset();
method @NonNull public abstract java.nio.CharBuffer asCharBuffer();
method @NonNull public abstract java.nio.DoubleBuffer asDoubleBuffer();
@@ -62503,8 +62540,8 @@ package java.nio {
method @NonNull public abstract java.nio.ByteBuffer duplicate();
method public abstract byte get();
method public abstract byte get(int);
- method @NonNull public java.nio.ByteBuffer get(byte[], int, int);
- method @NonNull public java.nio.ByteBuffer get(byte[]);
+ method @NonNull public java.nio.ByteBuffer get(@NonNull byte[], int, int);
+ method @NonNull public java.nio.ByteBuffer get(@NonNull byte[]);
method public abstract char getChar();
method public abstract char getChar(int);
method public abstract double getDouble();
@@ -62523,8 +62560,8 @@ package java.nio {
method @NonNull public abstract java.nio.ByteBuffer put(byte);
method @NonNull public abstract java.nio.ByteBuffer put(int, byte);
method @NonNull public java.nio.ByteBuffer put(@NonNull java.nio.ByteBuffer);
- method @NonNull public java.nio.ByteBuffer put(byte[], int, int);
- method @NonNull public final java.nio.ByteBuffer put(byte[]);
+ method @NonNull public java.nio.ByteBuffer put(@NonNull byte[], int, int);
+ method @NonNull public final java.nio.ByteBuffer put(@NonNull byte[]);
method @NonNull public abstract java.nio.ByteBuffer putChar(char);
method @NonNull public abstract java.nio.ByteBuffer putChar(int, char);
method @NonNull public abstract java.nio.ByteBuffer putDouble(double);
@@ -62538,8 +62575,8 @@ package java.nio {
method @NonNull public abstract java.nio.ByteBuffer putShort(short);
method @NonNull public abstract java.nio.ByteBuffer putShort(int, short);
method @NonNull public abstract java.nio.ByteBuffer slice();
- method @NonNull public static java.nio.ByteBuffer wrap(byte[], int, int);
- method @NonNull public static java.nio.ByteBuffer wrap(byte[]);
+ method @NonNull public static java.nio.ByteBuffer wrap(@NonNull byte[], int, int);
+ method @NonNull public static java.nio.ByteBuffer wrap(@NonNull byte[]);
}
public final class ByteOrder {
@@ -64372,20 +64409,20 @@ package java.security {
public abstract class MessageDigest extends java.security.MessageDigestSpi {
ctor protected MessageDigest(@NonNull String);
- method public byte[] digest();
- method public int digest(byte[], int, int) throws java.security.DigestException;
- method public byte[] digest(byte[]);
+ method @NonNull public byte[] digest();
+ method public int digest(@NonNull byte[], int, int) throws java.security.DigestException;
+ method @NonNull public byte[] digest(@NonNull byte[]);
method @NonNull public final String getAlgorithm();
method public final int getDigestLength();
method @NonNull public static java.security.MessageDigest getInstance(@NonNull String) throws java.security.NoSuchAlgorithmException;
method @NonNull public static java.security.MessageDigest getInstance(@NonNull String, @NonNull String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
method @NonNull public static java.security.MessageDigest getInstance(@NonNull String, @NonNull java.security.Provider) throws java.security.NoSuchAlgorithmException;
method @NonNull public final java.security.Provider getProvider();
- method public static boolean isEqual(byte[], byte[]);
+ method public static boolean isEqual(@Nullable byte[], @Nullable byte[]);
method public void reset();
method public void update(byte);
- method public void update(byte[], int, int);
- method public void update(byte[]);
+ method public void update(@NonNull byte[], int, int);
+ method public void update(@NonNull byte[]);
method public final void update(@NonNull java.nio.ByteBuffer);
}
@@ -66992,7 +67029,7 @@ package java.text {
method @NonNull public final StringBuffer format(@NonNull Object, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
method @NonNull public abstract StringBuffer format(@NonNull java.util.Date, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
method @NonNull public final String format(@NonNull java.util.Date);
- method public static java.util.Locale[] getAvailableLocales();
+ method @NonNull public static java.util.Locale[] getAvailableLocales();
method @NonNull public java.util.Calendar getCalendar();
method @NonNull public static final java.text.DateFormat getDateInstance();
method @NonNull public static final java.text.DateFormat getDateInstance(int);
@@ -67232,7 +67269,7 @@ package java.text {
method @NonNull public final String format(long);
method @NonNull public abstract StringBuffer format(double, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
method @NonNull public abstract StringBuffer format(long, @NonNull StringBuffer, @NonNull java.text.FieldPosition);
- method public static java.util.Locale[] getAvailableLocales();
+ method @NonNull public static java.util.Locale[] getAvailableLocales();
method @Nullable public java.util.Currency getCurrency();
method @NonNull public static final java.text.NumberFormat getCurrencyInstance();
method @NonNull public static java.text.NumberFormat getCurrencyInstance(@NonNull java.util.Locale);
@@ -68886,8 +68923,8 @@ package java.util {
method public boolean remove(@Nullable Object);
method public boolean removeAll(@NonNull java.util.Collection<?>);
method public boolean retainAll(@NonNull java.util.Collection<?>);
- method public Object[] toArray();
- method public <T> T[] toArray(T[]);
+ method @NonNull public Object[] toArray();
+ method @NonNull public <T> T[] toArray(@NonNull T[]);
}
public abstract class AbstractList<E> extends java.util.AbstractCollection<E> implements java.util.List<E> {
@@ -68996,161 +69033,161 @@ package java.util {
}
public class Arrays {
- method @NonNull @java.lang.SafeVarargs public static <T> java.util.List<T> asList(T...);
- method public static int binarySearch(long[], long);
- method public static int binarySearch(long[], int, int, long);
- method public static int binarySearch(int[], int);
- method public static int binarySearch(int[], int, int, int);
- method public static int binarySearch(short[], short);
- method public static int binarySearch(short[], int, int, short);
- method public static int binarySearch(char[], char);
- method public static int binarySearch(char[], int, int, char);
- method public static int binarySearch(byte[], byte);
- method public static int binarySearch(byte[], int, int, byte);
- method public static int binarySearch(double[], double);
- method public static int binarySearch(double[], int, int, double);
- method public static int binarySearch(float[], float);
- method public static int binarySearch(float[], int, int, float);
- method public static int binarySearch(Object[], @NonNull Object);
- method public static int binarySearch(Object[], int, int, @NonNull Object);
- method public static <T> int binarySearch(T[], T, @Nullable java.util.Comparator<? super T>);
- method public static <T> int binarySearch(T[], int, int, T, @Nullable java.util.Comparator<? super T>);
- method public static <T> T[] copyOf(T[], int);
- method public static <T, U> T[] copyOf(U[], int, @NonNull Class<? extends T[]>);
- method public static byte[] copyOf(byte[], int);
- method public static short[] copyOf(short[], int);
- method public static int[] copyOf(int[], int);
- method public static long[] copyOf(long[], int);
- method public static char[] copyOf(char[], int);
- method public static float[] copyOf(float[], int);
- method public static double[] copyOf(double[], int);
- method public static boolean[] copyOf(boolean[], int);
- method public static <T> T[] copyOfRange(T[], int, int);
- method public static <T, U> T[] copyOfRange(U[], int, int, @NonNull Class<? extends T[]>);
- method public static byte[] copyOfRange(byte[], int, int);
- method public static short[] copyOfRange(short[], int, int);
- method public static int[] copyOfRange(int[], int, int);
- method public static long[] copyOfRange(long[], int, int);
- method public static char[] copyOfRange(char[], int, int);
- method public static float[] copyOfRange(float[], int, int);
- method public static double[] copyOfRange(double[], int, int);
- method public static boolean[] copyOfRange(boolean[], int, int);
- method public static boolean deepEquals(Object[], Object[]);
- method public static int deepHashCode(Object[]);
- method @NonNull public static String deepToString(Object[]);
- method public static boolean equals(long[], long[]);
- method public static boolean equals(int[], int[]);
- method public static boolean equals(short[], short[]);
- method public static boolean equals(char[], char[]);
- method public static boolean equals(byte[], byte[]);
- method public static boolean equals(boolean[], boolean[]);
- method public static boolean equals(double[], double[]);
- method public static boolean equals(float[], float[]);
- method public static boolean equals(Object[], Object[]);
- method public static void fill(long[], long);
- method public static void fill(long[], int, int, long);
- method public static void fill(int[], int);
- method public static void fill(int[], int, int, int);
- method public static void fill(short[], short);
- method public static void fill(short[], int, int, short);
- method public static void fill(char[], char);
- method public static void fill(char[], int, int, char);
- method public static void fill(byte[], byte);
- method public static void fill(byte[], int, int, byte);
- method public static void fill(boolean[], boolean);
- method public static void fill(boolean[], int, int, boolean);
- method public static void fill(double[], double);
- method public static void fill(double[], int, int, double);
- method public static void fill(float[], float);
- method public static void fill(float[], int, int, float);
- method public static void fill(Object[], @Nullable Object);
- method public static void fill(Object[], int, int, @Nullable Object);
- method public static int hashCode(long[]);
- method public static int hashCode(int[]);
- method public static int hashCode(short[]);
- method public static int hashCode(char[]);
- method public static int hashCode(byte[]);
- method public static int hashCode(boolean[]);
- method public static int hashCode(float[]);
- method public static int hashCode(double[]);
- method public static int hashCode(Object[]);
- method public static <T> void parallelPrefix(T[], @NonNull java.util.function.BinaryOperator<T>);
- method public static <T> void parallelPrefix(T[], int, int, @NonNull java.util.function.BinaryOperator<T>);
- method public static void parallelPrefix(long[], @NonNull java.util.function.LongBinaryOperator);
- method public static void parallelPrefix(long[], int, int, @NonNull java.util.function.LongBinaryOperator);
- method public static void parallelPrefix(double[], @NonNull java.util.function.DoubleBinaryOperator);
- method public static void parallelPrefix(double[], int, int, @NonNull java.util.function.DoubleBinaryOperator);
- method public static void parallelPrefix(int[], @NonNull java.util.function.IntBinaryOperator);
- method public static void parallelPrefix(int[], int, int, @NonNull java.util.function.IntBinaryOperator);
- method public static <T> void parallelSetAll(T[], @NonNull java.util.function.IntFunction<? extends T>);
- method public static void parallelSetAll(int[], @NonNull java.util.function.IntUnaryOperator);
- method public static void parallelSetAll(long[], @NonNull java.util.function.IntToLongFunction);
- method public static void parallelSetAll(double[], @NonNull java.util.function.IntToDoubleFunction);
- method public static void parallelSort(byte[]);
- method public static void parallelSort(byte[], int, int);
- method public static void parallelSort(char[]);
- method public static void parallelSort(char[], int, int);
- method public static void parallelSort(short[]);
- method public static void parallelSort(short[], int, int);
- method public static void parallelSort(int[]);
- method public static void parallelSort(int[], int, int);
- method public static void parallelSort(long[]);
- method public static void parallelSort(long[], int, int);
- method public static void parallelSort(float[]);
- method public static void parallelSort(float[], int, int);
- method public static void parallelSort(double[]);
- method public static void parallelSort(double[], int, int);
- method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]);
- method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int);
- method public static <T> void parallelSort(T[], @Nullable java.util.Comparator<? super T>);
- method public static <T> void parallelSort(T[], int, int, @Nullable java.util.Comparator<? super T>);
- method public static <T> void setAll(T[], @NonNull java.util.function.IntFunction<? extends T>);
- method public static void setAll(int[], @NonNull java.util.function.IntUnaryOperator);
- method public static void setAll(long[], @NonNull java.util.function.IntToLongFunction);
- method public static void setAll(double[], @NonNull java.util.function.IntToDoubleFunction);
- method public static void sort(int[]);
- method public static void sort(int[], int, int);
- method public static void sort(long[]);
- method public static void sort(long[], int, int);
- method public static void sort(short[]);
- method public static void sort(short[], int, int);
- method public static void sort(char[]);
- method public static void sort(char[], int, int);
- method public static void sort(byte[]);
- method public static void sort(byte[], int, int);
- method public static void sort(float[]);
- method public static void sort(float[], int, int);
- method public static void sort(double[]);
- method public static void sort(double[], int, int);
- method public static void sort(Object[]);
- method public static void sort(Object[], int, int);
- method public static <T> void sort(T[], @Nullable java.util.Comparator<? super T>);
- method public static <T> void sort(T[], int, int, @Nullable java.util.Comparator<? super T>);
- method @NonNull public static <T> java.util.Spliterator<T> spliterator(T[]);
- method @NonNull public static <T> java.util.Spliterator<T> spliterator(T[], int, int);
- method @NonNull public static java.util.Spliterator.OfInt spliterator(int[]);
- method @NonNull public static java.util.Spliterator.OfInt spliterator(int[], int, int);
- method @NonNull public static java.util.Spliterator.OfLong spliterator(long[]);
- method @NonNull public static java.util.Spliterator.OfLong spliterator(long[], int, int);
- method @NonNull public static java.util.Spliterator.OfDouble spliterator(double[]);
- method @NonNull public static java.util.Spliterator.OfDouble spliterator(double[], int, int);
- method @NonNull public static <T> java.util.stream.Stream<T> stream(T[]);
- method @NonNull public static <T> java.util.stream.Stream<T> stream(T[], int, int);
- method @NonNull public static java.util.stream.IntStream stream(int[]);
- method @NonNull public static java.util.stream.IntStream stream(int[], int, int);
- method @NonNull public static java.util.stream.LongStream stream(long[]);
- method @NonNull public static java.util.stream.LongStream stream(long[], int, int);
- method @NonNull public static java.util.stream.DoubleStream stream(double[]);
- method @NonNull public static java.util.stream.DoubleStream stream(double[], int, int);
- method @NonNull public static String toString(long[]);
- method @NonNull public static String toString(int[]);
- method @NonNull public static String toString(short[]);
- method @NonNull public static String toString(char[]);
- method @NonNull public static String toString(byte[]);
- method @NonNull public static String toString(boolean[]);
- method @NonNull public static String toString(float[]);
- method @NonNull public static String toString(double[]);
- method @NonNull public static String toString(Object[]);
+ method @NonNull @java.lang.SafeVarargs public static <T> java.util.List<T> asList(@NonNull T...);
+ method public static int binarySearch(@NonNull long[], long);
+ method public static int binarySearch(@NonNull long[], int, int, long);
+ method public static int binarySearch(@NonNull int[], int);
+ method public static int binarySearch(@NonNull int[], int, int, int);
+ method public static int binarySearch(@NonNull short[], short);
+ method public static int binarySearch(@NonNull short[], int, int, short);
+ method public static int binarySearch(@NonNull char[], char);
+ method public static int binarySearch(@NonNull char[], int, int, char);
+ method public static int binarySearch(@NonNull byte[], byte);
+ method public static int binarySearch(@NonNull byte[], int, int, byte);
+ method public static int binarySearch(@NonNull double[], double);
+ method public static int binarySearch(@NonNull double[], int, int, double);
+ method public static int binarySearch(@NonNull float[], float);
+ method public static int binarySearch(@NonNull float[], int, int, float);
+ method public static int binarySearch(@NonNull Object[], @NonNull Object);
+ method public static int binarySearch(@NonNull Object[], int, int, @NonNull Object);
+ method public static <T> int binarySearch(@NonNull T[], T, @Nullable java.util.Comparator<? super T>);
+ method public static <T> int binarySearch(@NonNull T[], int, int, T, @Nullable java.util.Comparator<? super T>);
+ method @NonNull public static <T> T[] copyOf(@NonNull T[], int);
+ method @NonNull public static <T, U> T[] copyOf(@NonNull U[], int, @NonNull Class<? extends T[]>);
+ method @NonNull public static byte[] copyOf(@NonNull byte[], int);
+ method @NonNull public static short[] copyOf(@NonNull short[], int);
+ method @NonNull public static int[] copyOf(@NonNull int[], int);
+ method @NonNull public static long[] copyOf(@NonNull long[], int);
+ method @NonNull public static char[] copyOf(@NonNull char[], int);
+ method @NonNull public static float[] copyOf(@NonNull float[], int);
+ method @NonNull public static double[] copyOf(@NonNull double[], int);
+ method @NonNull public static boolean[] copyOf(@NonNull boolean[], int);
+ method @NonNull public static <T> T[] copyOfRange(@NonNull T[], int, int);
+ method @NonNull public static <T, U> T[] copyOfRange(@NonNull U[], int, int, @NonNull Class<? extends T[]>);
+ method @NonNull public static byte[] copyOfRange(@NonNull byte[], int, int);
+ method @NonNull public static short[] copyOfRange(@NonNull short[], int, int);
+ method @NonNull public static int[] copyOfRange(@NonNull int[], int, int);
+ method @NonNull public static long[] copyOfRange(@NonNull long[], int, int);
+ method @NonNull public static char[] copyOfRange(@NonNull char[], int, int);
+ method @NonNull public static float[] copyOfRange(@NonNull float[], int, int);
+ method @NonNull public static double[] copyOfRange(@NonNull double[], int, int);
+ method @NonNull public static boolean[] copyOfRange(@NonNull boolean[], int, int);
+ method public static boolean deepEquals(@Nullable Object[], @Nullable Object[]);
+ method public static int deepHashCode(@Nullable Object[]);
+ method @NonNull public static String deepToString(@Nullable Object[]);
+ method public static boolean equals(@Nullable long[], @Nullable long[]);
+ method public static boolean equals(@Nullable int[], @Nullable int[]);
+ method public static boolean equals(@Nullable short[], @Nullable short[]);
+ method public static boolean equals(@Nullable char[], @Nullable char[]);
+ method public static boolean equals(@Nullable byte[], @Nullable byte[]);
+ method public static boolean equals(@Nullable boolean[], @Nullable boolean[]);
+ method public static boolean equals(@Nullable double[], @Nullable double[]);
+ method public static boolean equals(@Nullable float[], @Nullable float[]);
+ method public static boolean equals(@Nullable Object[], @Nullable Object[]);
+ method public static void fill(@NonNull long[], long);
+ method public static void fill(@NonNull long[], int, int, long);
+ method public static void fill(@NonNull int[], int);
+ method public static void fill(@NonNull int[], int, int, int);
+ method public static void fill(@NonNull short[], short);
+ method public static void fill(@NonNull short[], int, int, short);
+ method public static void fill(@NonNull char[], char);
+ method public static void fill(@NonNull char[], int, int, char);
+ method public static void fill(@NonNull byte[], byte);
+ method public static void fill(@NonNull byte[], int, int, byte);
+ method public static void fill(@NonNull boolean[], boolean);
+ method public static void fill(@NonNull boolean[], int, int, boolean);
+ method public static void fill(@NonNull double[], double);
+ method public static void fill(@NonNull double[], int, int, double);
+ method public static void fill(@NonNull float[], float);
+ method public static void fill(@NonNull float[], int, int, float);
+ method public static void fill(@NonNull Object[], @Nullable Object);
+ method public static void fill(@NonNull Object[], int, int, @Nullable Object);
+ method public static int hashCode(@Nullable long[]);
+ method public static int hashCode(@Nullable int[]);
+ method public static int hashCode(@Nullable short[]);
+ method public static int hashCode(@Nullable char[]);
+ method public static int hashCode(@Nullable byte[]);
+ method public static int hashCode(@Nullable boolean[]);
+ method public static int hashCode(@Nullable float[]);
+ method public static int hashCode(@Nullable double[]);
+ method public static int hashCode(@Nullable Object[]);
+ method public static <T> void parallelPrefix(@NonNull T[], @NonNull java.util.function.BinaryOperator<T>);
+ method public static <T> void parallelPrefix(@NonNull T[], int, int, @NonNull java.util.function.BinaryOperator<T>);
+ method public static void parallelPrefix(@NonNull long[], @NonNull java.util.function.LongBinaryOperator);
+ method public static void parallelPrefix(@NonNull long[], int, int, @NonNull java.util.function.LongBinaryOperator);
+ method public static void parallelPrefix(@NonNull double[], @NonNull java.util.function.DoubleBinaryOperator);
+ method public static void parallelPrefix(@NonNull double[], int, int, @NonNull java.util.function.DoubleBinaryOperator);
+ method public static void parallelPrefix(@NonNull int[], @NonNull java.util.function.IntBinaryOperator);
+ method public static void parallelPrefix(@NonNull int[], int, int, @NonNull java.util.function.IntBinaryOperator);
+ method public static <T> void parallelSetAll(@NonNull T[], @NonNull java.util.function.IntFunction<? extends T>);
+ method public static void parallelSetAll(@NonNull int[], @NonNull java.util.function.IntUnaryOperator);
+ method public static void parallelSetAll(@NonNull long[], @NonNull java.util.function.IntToLongFunction);
+ method public static void parallelSetAll(@NonNull double[], @NonNull java.util.function.IntToDoubleFunction);
+ method public static void parallelSort(@NonNull byte[]);
+ method public static void parallelSort(@NonNull byte[], int, int);
+ method public static void parallelSort(@NonNull char[]);
+ method public static void parallelSort(@NonNull char[], int, int);
+ method public static void parallelSort(@NonNull short[]);
+ method public static void parallelSort(@NonNull short[], int, int);
+ method public static void parallelSort(@NonNull int[]);
+ method public static void parallelSort(@NonNull int[], int, int);
+ method public static void parallelSort(@NonNull long[]);
+ method public static void parallelSort(@NonNull long[], int, int);
+ method public static void parallelSort(@NonNull float[]);
+ method public static void parallelSort(@NonNull float[], int, int);
+ method public static void parallelSort(@NonNull double[]);
+ method public static void parallelSort(@NonNull double[], int, int);
+ method public static <T extends java.lang.Comparable<? super T>> void parallelSort(@NonNull T[]);
+ method public static <T extends java.lang.Comparable<? super T>> void parallelSort(@NonNull T[], int, int);
+ method public static <T> void parallelSort(@NonNull T[], @Nullable java.util.Comparator<? super T>);
+ method public static <T> void parallelSort(@NonNull T[], int, int, @Nullable java.util.Comparator<? super T>);
+ method public static <T> void setAll(@NonNull T[], @NonNull java.util.function.IntFunction<? extends T>);
+ method public static void setAll(@NonNull int[], @NonNull java.util.function.IntUnaryOperator);
+ method public static void setAll(@NonNull long[], @NonNull java.util.function.IntToLongFunction);
+ method public static void setAll(@NonNull double[], @NonNull java.util.function.IntToDoubleFunction);
+ method public static void sort(@NonNull int[]);
+ method public static void sort(@NonNull int[], int, int);
+ method public static void sort(@NonNull long[]);
+ method public static void sort(@NonNull long[], int, int);
+ method public static void sort(@NonNull short[]);
+ method public static void sort(@NonNull short[], int, int);
+ method public static void sort(@NonNull char[]);
+ method public static void sort(@NonNull char[], int, int);
+ method public static void sort(@NonNull byte[]);
+ method public static void sort(@NonNull byte[], int, int);
+ method public static void sort(@NonNull float[]);
+ method public static void sort(@NonNull float[], int, int);
+ method public static void sort(@NonNull double[]);
+ method public static void sort(@NonNull double[], int, int);
+ method public static void sort(@NonNull Object[]);
+ method public static void sort(@NonNull Object[], int, int);
+ method public static <T> void sort(@NonNull T[], @Nullable java.util.Comparator<? super T>);
+ method public static <T> void sort(@NonNull T[], int, int, @Nullable java.util.Comparator<? super T>);
+ method @NonNull public static <T> java.util.Spliterator<T> spliterator(@NonNull T[]);
+ method @NonNull public static <T> java.util.Spliterator<T> spliterator(@NonNull T[], int, int);
+ method @NonNull public static java.util.Spliterator.OfInt spliterator(@NonNull int[]);
+ method @NonNull public static java.util.Spliterator.OfInt spliterator(@NonNull int[], int, int);
+ method @NonNull public static java.util.Spliterator.OfLong spliterator(@NonNull long[]);
+ method @NonNull public static java.util.Spliterator.OfLong spliterator(@NonNull long[], int, int);
+ method @NonNull public static java.util.Spliterator.OfDouble spliterator(@NonNull double[]);
+ method @NonNull public static java.util.Spliterator.OfDouble spliterator(@NonNull double[], int, int);
+ method @NonNull public static <T> java.util.stream.Stream<T> stream(@NonNull T[]);
+ method @NonNull public static <T> java.util.stream.Stream<T> stream(@NonNull T[], int, int);
+ method @NonNull public static java.util.stream.IntStream stream(@NonNull int[]);
+ method @NonNull public static java.util.stream.IntStream stream(@NonNull int[], int, int);
+ method @NonNull public static java.util.stream.LongStream stream(@NonNull long[]);
+ method @NonNull public static java.util.stream.LongStream stream(@NonNull long[], int, int);
+ method @NonNull public static java.util.stream.DoubleStream stream(@NonNull double[]);
+ method @NonNull public static java.util.stream.DoubleStream stream(@NonNull double[], int, int);
+ method @NonNull public static String toString(@Nullable long[]);
+ method @NonNull public static String toString(@Nullable int[]);
+ method @NonNull public static String toString(@Nullable short[]);
+ method @NonNull public static String toString(@Nullable char[]);
+ method @NonNull public static String toString(@Nullable byte[]);
+ method @NonNull public static String toString(@Nullable boolean[]);
+ method @NonNull public static String toString(@Nullable float[]);
+ method @NonNull public static String toString(@Nullable double[]);
+ method @NonNull public static String toString(@Nullable Object[]);
}
public class Base64 {
@@ -69234,7 +69271,7 @@ package java.util {
method public int getActualMaximum(int);
method public int getActualMinimum(int);
method @NonNull public static java.util.Set<java.lang.String> getAvailableCalendarTypes();
- method public static java.util.Locale[] getAvailableLocales();
+ method @NonNull public static java.util.Locale[] getAvailableLocales();
method @NonNull public String getCalendarType();
method @Nullable public String getDisplayName(int, int, @NonNull java.util.Locale);
method @Nullable public java.util.Map<java.lang.String,java.lang.Integer> getDisplayNames(int, int, @NonNull java.util.Locale);
@@ -69322,8 +69359,8 @@ package java.util {
field public static final int YEAR = 1; // 0x1
field public static final int ZONE_OFFSET = 15; // 0xf
field protected boolean areFieldsSet;
- field protected int[] fields;
- field protected boolean[] isSet;
+ field @NonNull protected int[] fields;
+ field @NonNull protected boolean[] isSet;
field protected boolean isTimeSet;
field protected long time;
}
@@ -69334,7 +69371,7 @@ package java.util {
method @NonNull public java.util.Calendar.Builder set(int, int);
method @NonNull public java.util.Calendar.Builder setCalendarType(@NonNull String);
method @NonNull public java.util.Calendar.Builder setDate(int, int, int);
- method @NonNull public java.util.Calendar.Builder setFields(int...);
+ method @NonNull public java.util.Calendar.Builder setFields(@NonNull int...);
method @NonNull public java.util.Calendar.Builder setInstant(long);
method @NonNull public java.util.Calendar.Builder setInstant(@NonNull java.util.Date);
method @NonNull public java.util.Calendar.Builder setLenient(boolean);
@@ -69364,12 +69401,12 @@ package java.util {
method public int size();
method @NonNull public default java.util.Spliterator<E> spliterator();
method @NonNull public default java.util.stream.Stream<E> stream();
- method public Object[] toArray();
- method public <T> T[] toArray(T[]);
+ method @NonNull public Object[] toArray();
+ method @NonNull public <T> T[] toArray(@NonNull T[]);
}
public class Collections {
- method @java.lang.SafeVarargs public static <T> boolean addAll(@NonNull java.util.Collection<? super T>, T...);
+ method @java.lang.SafeVarargs public static <T> boolean addAll(@NonNull java.util.Collection<? super T>, @NonNull T...);
method @NonNull public static <T> java.util.Queue<T> asLifoQueue(@NonNull java.util.Deque<T>);
method public static <T> int binarySearch(@NonNull java.util.List<? extends java.lang.Comparable<? super T>>, @NonNull T);
method public static <T> int binarySearch(@NonNull java.util.List<? extends T>, T, @Nullable java.util.Comparator<? super T>);
@@ -69887,7 +69924,7 @@ package java.util {
method @NonNull public static java.util.List<java.lang.String> filterTags(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.lang.String>, @NonNull java.util.Locale.FilteringMode);
method @NonNull public static java.util.List<java.lang.String> filterTags(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.lang.String>);
method @NonNull public static java.util.Locale forLanguageTag(@NonNull String);
- method public static java.util.Locale[] getAvailableLocales();
+ method @NonNull public static java.util.Locale[] getAvailableLocales();
method @NonNull public String getCountry();
method @NonNull public static java.util.Locale getDefault();
method @NonNull public static java.util.Locale getDefault(@NonNull java.util.Locale.Category);
@@ -69905,8 +69942,8 @@ package java.util {
method @NonNull public java.util.Set<java.lang.Character> getExtensionKeys();
method @NonNull public String getISO3Country() throws java.util.MissingResourceException;
method @NonNull public String getISO3Language() throws java.util.MissingResourceException;
- method public static String[] getISOCountries();
- method public static String[] getISOLanguages();
+ method @NonNull public static String[] getISOCountries();
+ method @NonNull public static String[] getISOLanguages();
method @NonNull public String getLanguage();
method @NonNull public String getScript();
method @NonNull public java.util.Set<java.lang.String> getUnicodeLocaleAttributes();
@@ -70100,7 +70137,7 @@ package java.util {
method public static <T> int compare(T, T, @NonNull java.util.Comparator<? super T>);
method public static boolean deepEquals(@Nullable Object, @Nullable Object);
method public static boolean equals(@Nullable Object, @Nullable Object);
- method public static int hash(java.lang.Object...);
+ method public static int hash(@Nullable java.lang.Object...);
method public static int hashCode(@Nullable Object);
method public static boolean isNull(@Nullable Object);
method public static boolean nonNull(@Nullable Object);
@@ -70765,7 +70802,7 @@ package java.util {
method public void addElement(E);
method public int capacity();
method @NonNull public Object clone();
- method public void copyInto(Object[]);
+ method public void copyInto(@NonNull Object[]);
method public E elementAt(int);
method @NonNull public java.util.Enumeration<E> elements();
method public void ensureCapacity(int);
@@ -70785,7 +70822,7 @@ package java.util {
method public void trimToSize();
field protected int capacityIncrement;
field protected int elementCount;
- field protected Object[] elementData;
+ field @NonNull protected Object[] elementData;
}
public class WeakHashMap<K, V> extends java.util.AbstractMap<K,V> implements java.util.Map<K,V> {
@@ -71176,7 +71213,7 @@ package java.util.concurrent {
public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List<E> java.util.RandomAccess java.io.Serializable {
ctor public CopyOnWriteArrayList();
ctor public CopyOnWriteArrayList(@NonNull java.util.Collection<? extends E>);
- ctor public CopyOnWriteArrayList(E[]);
+ ctor public CopyOnWriteArrayList(@NonNull E[]);
method public boolean add(E);
method public void add(int, E);
method public boolean addAll(@NonNull java.util.Collection<? extends E>);
@@ -71204,8 +71241,8 @@ package java.util.concurrent {
method public E set(int, E);
method public int size();
method @NonNull public java.util.List<E> subList(int, int);
- method public Object[] toArray();
- method public <T> T[] toArray(T[]);
+ method @NonNull public Object[] toArray();
+ method @NonNull public <T> T[] toArray(@NonNull T[]);
}
public class CopyOnWriteArraySet<E> extends java.util.AbstractSet<E> implements java.io.Serializable {
@@ -72957,7 +72994,7 @@ package java.util.logging {
method public void config(@NonNull java.util.function.Supplier<java.lang.String>);
method public void entering(@Nullable String, @Nullable String);
method public void entering(@Nullable String, @Nullable String, @Nullable Object);
- method public void entering(@Nullable String, @Nullable String, Object[]);
+ method public void entering(@Nullable String, @Nullable String, @Nullable Object[]);
method public void exiting(@Nullable String, @Nullable String);
method public void exiting(@Nullable String, @Nullable String, @Nullable Object);
method public void fine(@Nullable String);
@@ -72970,7 +73007,7 @@ package java.util.logging {
method @NonNull public static java.util.logging.Logger getAnonymousLogger(@Nullable String);
method @Nullable public java.util.logging.Filter getFilter();
method @NonNull public static final java.util.logging.Logger getGlobal();
- method public java.util.logging.Handler[] getHandlers();
+ method @NonNull public java.util.logging.Handler[] getHandlers();
method @Nullable public java.util.logging.Level getLevel();
method @NonNull public static java.util.logging.Logger getLogger(@NonNull String);
method @NonNull public static java.util.logging.Logger getLogger(@NonNull String, @Nullable String);
@@ -72986,7 +73023,7 @@ package java.util.logging {
method public void log(@NonNull java.util.logging.Level, @Nullable String);
method public void log(@NonNull java.util.logging.Level, @NonNull java.util.function.Supplier<java.lang.String>);
method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Object);
- method public void log(@NonNull java.util.logging.Level, @Nullable String, Object[]);
+ method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Object[]);
method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Throwable);
method public void log(@NonNull java.util.logging.Level, @Nullable Throwable, @NonNull java.util.function.Supplier<java.lang.String>);
method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String);
@@ -72997,8 +73034,8 @@ package java.util.logging {
method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable Throwable, @NonNull java.util.function.Supplier<java.lang.String>);
method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String);
method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Object);
- method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, Object[]);
- method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, java.lang.Object...);
+ method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Object[]);
+ method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, @Nullable java.lang.Object...);
method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Throwable);
method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, @Nullable Throwable);
method public void removeHandler(@Nullable java.util.logging.Handler) throws java.lang.SecurityException;
@@ -73260,8 +73297,8 @@ package java.util.regex {
method public static boolean matches(@NonNull String, @NonNull CharSequence);
method @NonNull public String pattern();
method @NonNull public static String quote(@NonNull String);
- method public String[] split(@NonNull CharSequence, int);
- method public String[] split(@NonNull CharSequence);
+ method @NonNull public String[] split(@NonNull CharSequence, int);
+ method @NonNull public String[] split(@NonNull CharSequence);
method @NonNull public java.util.stream.Stream<java.lang.String> splitAsStream(@NonNull CharSequence);
field public static final int CANON_EQ = 128; // 0x80
field public static final int CASE_INSENSITIVE = 2; // 0x2
diff --git a/api/system-current.txt b/api/system-current.txt
index d3d9c220f12a..d67974b3bf72 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -501,6 +501,13 @@ package android.app {
method public org.json.JSONObject toJson() throws org.json.JSONException;
}
+ public class NotificationManager {
+ method @Nullable public android.content.ComponentName getAllowedNotificationAssistant();
+ method @Nullable public android.content.ComponentName getAllowedNotificationAssistantForUser(android.os.UserHandle);
+ method public void setNotificationAssistantAccessGranted(android.content.ComponentName, boolean);
+ method public void setNotificationAssistantAccessGrantedForUser(android.content.ComponentName, android.os.UserHandle, boolean);
+ }
+
public final class StatsManager {
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]);
@@ -983,6 +990,7 @@ package android.app.prediction {
}
public static final class AppPredictionContext.Builder {
+ ctor public AppPredictionContext.Builder(@NonNull android.content.Context);
method public android.app.prediction.AppPredictionContext build();
method public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle);
method public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(int);
@@ -1014,6 +1022,8 @@ package android.app.prediction {
}
public final class AppTarget implements android.os.Parcelable {
+ ctor public AppTarget(@NonNull android.app.prediction.AppTargetId, @NonNull String, @Nullable String, @NonNull android.os.UserHandle);
+ ctor public AppTarget(@NonNull android.app.prediction.AppTargetId, @NonNull android.content.pm.ShortcutInfo, @Nullable String);
method public int describeContents();
method @Nullable public String getClassName();
method @NonNull public android.app.prediction.AppTargetId getId();
@@ -1044,6 +1054,7 @@ package android.app.prediction {
}
public final class AppTargetId implements android.os.Parcelable {
+ ctor public AppTargetId(@NonNull String);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR;
@@ -1312,6 +1323,7 @@ package android.content {
field public static final String ACTION_DEVICE_CUSTOMIZATION_READY = "android.intent.action.DEVICE_CUSTOMIZATION_READY";
field public static final String ACTION_FACTORY_RESET = "android.intent.action.FACTORY_RESET";
field public static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
+ field public static final String ACTION_INCIDENT_REPORT_READY = "android.intent.action.INCIDENT_REPORT_READY";
field public static final String ACTION_INSTALL_INSTANT_APP_PACKAGE = "android.intent.action.INSTALL_INSTANT_APP_PACKAGE";
field public static final String ACTION_INSTANT_APP_RESOLVER_SETTINGS = "android.intent.action.INSTANT_APP_RESOLVER_SETTINGS";
field public static final String ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION";
@@ -1717,9 +1729,9 @@ package android.content.rollback {
public final class RollbackInfo implements android.os.Parcelable {
method public int describeContents();
method public java.util.List<android.content.pm.VersionedPackage> getCausePackages();
+ method public int getCommittedSessionId();
method public java.util.List<android.content.rollback.PackageRollbackInfo> getPackages();
method public int getRollbackId();
- method public int getSessionId();
method public boolean isStaged();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.rollback.RollbackInfo> CREATOR;
@@ -2959,10 +2971,12 @@ package android.location {
public final class GnssMeasurementCorrections implements android.os.Parcelable {
method public int describeContents();
method public double getAltitudeMeters();
+ method public double getHorizontalPositionUncertaintyMeters();
method public double getLatitudeDegrees();
method public double getLongitudeDegrees();
method @Nullable public java.util.List<android.location.GnssSingleSatCorrection> getSingleSatCorrectionList();
method public long getToaGpsNanosecondsOfWeek();
+ method public double getVerticalPositionUncertaintyMeters();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.location.GnssMeasurementCorrections> CREATOR;
}
@@ -2971,10 +2985,12 @@ package android.location {
ctor public GnssMeasurementCorrections.Builder();
method public android.location.GnssMeasurementCorrections build();
method public android.location.GnssMeasurementCorrections.Builder setAltitudeMeters(double);
+ method public android.location.GnssMeasurementCorrections.Builder setHorizontalPositionUncertaintyMeters(double);
method public android.location.GnssMeasurementCorrections.Builder setLatitudeDegrees(double);
method public android.location.GnssMeasurementCorrections.Builder setLongitudeDegrees(double);
method public android.location.GnssMeasurementCorrections.Builder setSingleSatCorrectionList(@Nullable java.util.List<android.location.GnssSingleSatCorrection>);
method public android.location.GnssMeasurementCorrections.Builder setToaGpsNanosecondsOfWeek(long);
+ method public android.location.GnssMeasurementCorrections.Builder setVerticalPositionUncertaintyMeters(double);
}
public final class GnssReflectingPlane implements android.os.Parcelable {
@@ -3659,7 +3675,7 @@ package android.media.session {
}
public final class MediaSessionEngine implements java.lang.AutoCloseable {
- ctor public MediaSessionEngine(@NonNull android.content.Context, @NonNull android.media.session.SessionLink, @NonNull android.media.session.SessionCallbackLink, @NonNull android.media.session.MediaSessionEngine.CallbackStub);
+ ctor public MediaSessionEngine(@NonNull android.content.Context, @NonNull android.media.session.SessionLink, @NonNull android.media.session.SessionCallbackLink);
method public void close();
method public String getCallingPackage();
method @NonNull public android.media.session.MediaController getController();
@@ -3684,33 +3700,6 @@ package android.media.session {
method public void setSessionActivity(@Nullable android.app.PendingIntent);
}
- public static final class MediaSessionEngine.CallbackStub {
- ctor public MediaSessionEngine.CallbackStub();
- method public void onAdjustVolume(String, int, int, android.media.session.ControllerCallbackLink, int);
- method public void onCommand(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle, android.os.ResultReceiver);
- method public void onCustomAction(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
- method public void onFastForward(String, int, int, android.media.session.ControllerCallbackLink);
- method public void onMediaButton(String, int, int, android.content.Intent, int, android.os.ResultReceiver);
- method public void onMediaButtonFromController(String, int, int, android.media.session.ControllerCallbackLink, android.content.Intent);
- method public void onNext(String, int, int, android.media.session.ControllerCallbackLink);
- method public void onPause(String, int, int, android.media.session.ControllerCallbackLink);
- method public void onPlay(String, int, int, android.media.session.ControllerCallbackLink);
- method public void onPlayFromMediaId(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
- method public void onPlayFromSearch(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
- method public void onPlayFromUri(String, int, int, android.media.session.ControllerCallbackLink, android.net.Uri, android.os.Bundle);
- method public void onPrepare(String, int, int, android.media.session.ControllerCallbackLink);
- method public void onPrepareFromMediaId(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
- method public void onPrepareFromSearch(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle);
- method public void onPrepareFromUri(String, int, int, android.media.session.ControllerCallbackLink, android.net.Uri, android.os.Bundle);
- method public void onPrevious(String, int, int, android.media.session.ControllerCallbackLink);
- method public void onRate(String, int, int, android.media.session.ControllerCallbackLink, android.media.Rating);
- method public void onRewind(String, int, int, android.media.session.ControllerCallbackLink);
- method public void onSeekTo(String, int, int, android.media.session.ControllerCallbackLink, long);
- method public void onSetVolumeTo(String, int, int, android.media.session.ControllerCallbackLink, int);
- method public void onSkipToTrack(String, int, int, android.media.session.ControllerCallbackLink, long);
- method public void onStop(String, int, int, android.media.session.ControllerCallbackLink);
- }
-
public static interface MediaSessionEngine.MediaButtonEventDelegate {
method public boolean onMediaButtonIntent(android.content.Intent);
}
@@ -4090,6 +4079,7 @@ package android.net {
public class CaptivePortal implements android.os.Parcelable {
ctor public CaptivePortal(android.os.IBinder);
+ method public void logEvent(int, String);
method public void useNetwork();
field public static final int APP_RETURN_DISMISSED = 0; // 0x0
field public static final int APP_RETURN_UNWANTED = 1; // 0x1
@@ -4972,8 +4962,16 @@ package android.net.wifi {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.WifiUsabilityStatsEntry> CREATOR;
+ field public static final int PROBE_STATUS_FAILURE = 3; // 0x3
+ field public static final int PROBE_STATUS_NO_PROBE = 1; // 0x1
+ field public static final int PROBE_STATUS_SUCCESS = 2; // 0x2
+ field public static final int PROBE_STATUS_UNKNOWN = 0; // 0x0
field public final int linkSpeedMbps;
+ field public final int probeElapsedTimeMsSinceLastUpdate;
+ field public final int probeMcsRateSinceLastUpdate;
+ field public final int probeStatusSinceLastUpdate;
field public final int rssi;
+ field public final int rxLinkSpeedMbps;
field public final long timeStampMs;
field public final long totalBackgroundScanTimeMs;
field public final long totalBeaconRx;
@@ -5350,11 +5348,17 @@ package android.os {
public class IncidentManager {
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void approveReport(android.net.Uri);
method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri);
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @NonNull public java.util.List<android.net.Uri> getIncidentReportList(String);
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports();
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs);
method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener);
field public static final int FLAG_CONFIRMATION_DIALOG = 1; // 0x1
+ field public static final int PRIVACY_POLICY_AUTO = 200; // 0xc8
+ field public static final int PRIVACY_POLICY_EXPLICIT = 100; // 0x64
+ field public static final int PRIVACY_POLICY_LOCAL = 0; // 0x0
}
public static class IncidentManager.AuthListener {
@@ -5363,6 +5367,17 @@ package android.os {
method public void onReportDenied();
}
+ public static class IncidentManager.IncidentReport implements java.io.Closeable android.os.Parcelable {
+ ctor public IncidentManager.IncidentReport(android.os.Parcel);
+ method public void close();
+ method public int describeContents();
+ method public java.io.InputStream getInputStream() throws java.io.IOException;
+ method public long getPrivacyPolicy();
+ method public long getTimestamp();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.IncidentManager.IncidentReport> CREATOR;
+ }
+
public static class IncidentManager.PendingReport {
ctor public IncidentManager.PendingReport(@NonNull android.net.Uri);
method public int getFlags();
@@ -5802,6 +5817,7 @@ package android.provider {
public static interface DeviceConfig.ActivityManager {
field public static final String KEY_COMPACT_ACTION_1 = "compact_action_1";
field public static final String KEY_COMPACT_ACTION_2 = "compact_action_2";
+ field public static final String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate";
field public static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1";
field public static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
field public static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
@@ -5811,26 +5827,31 @@ package android.provider {
field public static final String NAMESPACE = "activity_manager";
}
+ 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";
- field public static final String PROPERTY_COMPONENT_NAME = "component_name";
- field public static final String PROPERTY_SERVICE_ENABLED = "service_enabled";
+ field public static final String SERVICE_ENABLED = "service_enabled";
}
public static interface DeviceConfig.ContentCapture {
field public static final String NAMESPACE = "content_capture";
}
- public static interface DeviceConfig.FsiBoot {
- field public static final String NAMESPACE = "fsi_boot";
- field public static final String OOB_ENABLED = "oob_enabled";
- field public static final String OOB_WHITELIST = "oob_whitelist";
+ public static interface DeviceConfig.DexBoot {
+ field public static final String NAMESPACE = "dex_boot";
+ field public static final String PRIV_APPS_OOB_ENABLED = "priv_apps_oob_enabled";
+ field public static final String PRIV_APPS_OOB_WHITELIST = "priv_apps_oob_whitelist";
}
public static interface DeviceConfig.IntelligenceAttention {
+ field public static final String ATTENTION_ENABLED = "attention_enabled";
+ field public static final String ATTENTION_SETTINGS = "attention_settings";
field public static final String NAMESPACE = "intelligence_attention";
- field public static final String PROPERTY_ATTENTION_ENABLED = "attention_enabled";
- field public static final String PROPERTY_ATTENTION_SETTINGS = "attention_settings";
}
public static interface DeviceConfig.NotificationAssistant {
@@ -5845,8 +5866,8 @@ package android.provider {
public static interface DeviceConfig.Privacy {
field public static final String NAMESPACE = "privacy";
- field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "enable_location_access_check";
- field public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "enable_permissions_hub";
+ field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "location_access_check_enabled";
+ field public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled";
}
public static interface DeviceConfig.RuntimeNative {
@@ -5860,8 +5881,9 @@ package android.provider {
public static interface DeviceConfig.Telephony {
field public static final String NAMESPACE = "telephony";
- field public static final String PROPERTY_ENABLE_RAMPING_RINGER = "enable_ramping_ringer";
- field public static final String PROPERTY_RAMPING_RINGER_DURATION = "ramping_duration";
+ field public static final String RAMPING_RINGER_DURATION = "ramping_ringer_duration";
+ field public static final String RAMPING_RINGER_ENABLED = "ramping_ringer_enabled";
+ field public static final String RAMPING_RINGER_VIBRATION_DURATION = "ramping_ringer_vibration_duration";
}
public final class DocumentsContract {
@@ -7884,12 +7906,12 @@ package android.telephony {
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 @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getPreferredNetworkTypeBitmap();
+ 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();
method public int getSimCardState();
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getSimLocale();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSupportedRadioAccessFamily();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getSupportedRadioAccessFamily();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.UiccSlotInfo[] getUiccSlotsInfo();
method @Nullable public android.os.Bundle getVisualVoicemailSettings();
@@ -7917,7 +7939,7 @@ package android.telephony {
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(int, boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataRoamingEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMultisimCarrierRestriction(boolean);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmap(int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmap(long);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadio(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadioPower(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerState(int);
@@ -7942,25 +7964,26 @@ package android.telephony {
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 int NETWORK_TYPE_BITMASK_1xRTT = 128; // 0x80
- field public static final int NETWORK_TYPE_BITMASK_CDMA = 16; // 0x10
- field public static final int NETWORK_TYPE_BITMASK_EDGE = 4; // 0x4
- field public static final int NETWORK_TYPE_BITMASK_EHRPD = 16384; // 0x4000
- field public static final int NETWORK_TYPE_BITMASK_EVDO_0 = 32; // 0x20
- field public static final int NETWORK_TYPE_BITMASK_EVDO_A = 64; // 0x40
- field public static final int NETWORK_TYPE_BITMASK_EVDO_B = 4096; // 0x1000
- field public static final int NETWORK_TYPE_BITMASK_GPRS = 2; // 0x2
- field public static final int NETWORK_TYPE_BITMASK_GSM = 65536; // 0x10000
- field public static final int NETWORK_TYPE_BITMASK_HSDPA = 256; // 0x100
- field public static final int NETWORK_TYPE_BITMASK_HSPA = 1024; // 0x400
- field public static final int NETWORK_TYPE_BITMASK_HSPAP = 32768; // 0x8000
- field public static final int NETWORK_TYPE_BITMASK_HSUPA = 512; // 0x200
- field public static final int NETWORK_TYPE_BITMASK_LTE = 8192; // 0x2000
- field public static final int NETWORK_TYPE_BITMASK_LTE_CA = 524288; // 0x80000
- field public static final int NETWORK_TYPE_BITMASK_NR = 1048576; // 0x100000
- field public static final int NETWORK_TYPE_BITMASK_TD_SCDMA = 131072; // 0x20000
- field public static final int NETWORK_TYPE_BITMASK_UMTS = 8; // 0x8
- field public static final int NETWORK_TYPE_BITMASK_UNKNOWN = 1; // 0x1
+ 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
+ field public static final long NETWORK_TYPE_BITMASK_EHRPD = 8192L; // 0x2000L
+ field public static final long NETWORK_TYPE_BITMASK_EVDO_0 = 16L; // 0x10L
+ field public static final long NETWORK_TYPE_BITMASK_EVDO_A = 32L; // 0x20L
+ field public static final long NETWORK_TYPE_BITMASK_EVDO_B = 2048L; // 0x800L
+ field public static final long NETWORK_TYPE_BITMASK_GPRS = 1L; // 0x1L
+ field public static final long NETWORK_TYPE_BITMASK_GSM = 32768L; // 0x8000L
+ field public static final long NETWORK_TYPE_BITMASK_HSDPA = 128L; // 0x80L
+ field public static final long NETWORK_TYPE_BITMASK_HSPA = 512L; // 0x200L
+ field public static final long NETWORK_TYPE_BITMASK_HSPAP = 16384L; // 0x4000L
+ field public static final long NETWORK_TYPE_BITMASK_HSUPA = 256L; // 0x100L
+ field public static final long NETWORK_TYPE_BITMASK_IWLAN = 131072L; // 0x20000L
+ field public static final long NETWORK_TYPE_BITMASK_LTE = 4096L; // 0x1000L
+ field public static final long NETWORK_TYPE_BITMASK_LTE_CA = 262144L; // 0x40000L
+ field public static final long NETWORK_TYPE_BITMASK_NR = 524288L; // 0x80000L
+ field public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = 65536L; // 0x10000L
+ field public static final long NETWORK_TYPE_BITMASK_UMTS = 4L; // 0x4L
+ field public static final long NETWORK_TYPE_BITMASK_UNKNOWN = 0L; // 0x0L
field public static final int RADIO_POWER_OFF = 0; // 0x0
field public static final int RADIO_POWER_ON = 1; // 0x1
field public static final int RADIO_POWER_UNAVAILABLE = 2; // 0x2
@@ -9374,17 +9397,6 @@ package android.view.contentcapture {
method public void setContentCaptureFeatureEnabled(boolean);
}
- public final class UserDataRemovalRequest implements android.os.Parcelable {
- method @NonNull public String getPackageName();
- method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.UriRequest> getUriRequests();
- method public boolean isForEverything();
- }
-
- public final class UserDataRemovalRequest.UriRequest {
- method @NonNull public android.net.Uri getUri();
- method @NonNull public boolean isRecursive();
- }
-
public final class ViewNode extends android.app.assist.AssistStructure.ViewNode {
method @Nullable public android.view.autofill.AutofillId getParentAutofillId();
}
diff --git a/api/test-current.txt b/api/test-current.txt
index b1603bc884e0..2f4d45594d89 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -242,6 +242,7 @@ package android.app {
public class NotificationManager {
method public android.content.ComponentName getEffectsSuppressor();
+ method public boolean matchesCallFilter(android.os.Bundle);
}
public final class PictureInPictureParams implements android.os.Parcelable {
@@ -332,6 +333,91 @@ package android.app.backup {
}
+package android.app.prediction {
+
+ public final class AppPredictionContext implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public android.os.Bundle getExtras();
+ method @NonNull public String getPackageName();
+ method public int getPredictedTargetCount();
+ method public String getUiSurface();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionContext> CREATOR;
+ }
+
+ public static final class AppPredictionContext.Builder {
+ ctor public AppPredictionContext.Builder(@NonNull android.content.Context);
+ method public android.app.prediction.AppPredictionContext build();
+ method public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle);
+ method public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(int);
+ method public android.app.prediction.AppPredictionContext.Builder setUiSurface(@Nullable String);
+ }
+
+ public final class AppPredictionManager {
+ method public android.app.prediction.AppPredictor createAppPredictionSession(@NonNull android.app.prediction.AppPredictionContext);
+ }
+
+ public final class AppPredictionSessionId implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionSessionId> CREATOR;
+ }
+
+ public final class AppPredictor {
+ method public void destroy();
+ method public android.app.prediction.AppPredictionSessionId getSessionId();
+ method public void notifyAppTargetEvent(@NonNull android.app.prediction.AppTargetEvent);
+ method public void notifyLocationShown(@NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>);
+ method public void registerPredictionUpdates(@NonNull java.util.concurrent.Executor, @NonNull android.app.prediction.AppPredictor.Callback);
+ method public void requestPredictionUpdate();
+ method @Nullable public void sortTargets(@NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>);
+ method public void unregisterPredictionUpdates(@NonNull android.app.prediction.AppPredictor.Callback);
+ }
+
+ public static interface AppPredictor.Callback {
+ method public void onTargetsAvailable(@NonNull java.util.List<android.app.prediction.AppTarget>);
+ }
+
+ public final class AppTarget implements android.os.Parcelable {
+ ctor public AppTarget(@NonNull android.app.prediction.AppTargetId, @NonNull String, @Nullable String, @NonNull android.os.UserHandle);
+ method public int describeContents();
+ method @Nullable public String getClassName();
+ method @NonNull public android.app.prediction.AppTargetId getId();
+ method @NonNull public String getPackageName();
+ method public int getRank();
+ method @Nullable public android.content.pm.ShortcutInfo getShortcutInfo();
+ method @NonNull public android.os.UserHandle getUser();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppTarget> CREATOR;
+ }
+
+ public final class AppTargetEvent implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public int getAction();
+ method @NonNull public String getLaunchLocation();
+ method @Nullable public android.app.prediction.AppTarget getTarget();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int ACTION_DISMISS = 2; // 0x2
+ field public static final int ACTION_LAUNCH = 1; // 0x1
+ field public static final int ACTION_PIN = 3; // 0x3
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetEvent> CREATOR;
+ }
+
+ public static final class AppTargetEvent.Builder {
+ ctor public AppTargetEvent.Builder(@Nullable android.app.prediction.AppTarget, int);
+ method public android.app.prediction.AppTargetEvent build();
+ method public android.app.prediction.AppTargetEvent.Builder setLaunchLocation(String);
+ }
+
+ public final class AppTargetId implements android.os.Parcelable {
+ ctor public AppTargetId(@NonNull String);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR;
+ }
+
+}
+
package android.app.role {
public final class RoleManager {
@@ -518,22 +604,10 @@ package android.database.sqlite {
package android.graphics {
- public final class Bitmap implements android.os.Parcelable {
- method public void eraseColor(@ColorLong long);
- method public void setColorSpace(@NonNull android.graphics.ColorSpace);
- }
-
public final class ImageDecoder implements java.lang.AutoCloseable {
method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(android.content.res.Resources, java.io.InputStream, int);
}
- public class Paint {
- method @ColorLong public long getColorLong();
- method @ColorLong public long getShadowLayerColorLong();
- method public void setColor(@ColorLong long);
- method public void setShadowLayer(float, float, float, @ColorLong long);
- }
-
}
package android.graphics.drawable {
@@ -753,6 +827,17 @@ package android.media {
method public android.media.BufferingParams.Builder setResumePlaybackMarkMs(int);
}
+ public class MediaPlayer2 implements android.media.AudioRouting java.lang.AutoCloseable {
+ 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 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;
+ method public void setDrmPropertyString(@NonNull android.media.DataSourceDesc, @NonNull String, @NonNull String) throws android.media.MediaPlayer2.NoDrmSchemeException;
+ }
+
public final class PlaybackParams implements android.os.Parcelable {
method public int getAudioStretchMode();
method public android.media.PlaybackParams setAudioStretchMode(int);
@@ -803,6 +888,7 @@ package android.net {
public class CaptivePortal implements android.os.Parcelable {
ctor public CaptivePortal(android.os.IBinder);
+ method public void logEvent(int, String);
method public void useNetwork();
field public static final int APP_RETURN_DISMISSED = 0; // 0x0
field public static final int APP_RETURN_UNWANTED = 1; // 0x1
@@ -1285,11 +1371,17 @@ package android.os {
public class IncidentManager {
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void approveReport(android.net.Uri);
method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri);
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri);
+ method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @NonNull public java.util.List<android.net.Uri> getIncidentReportList(String);
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports();
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs);
method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener);
field public static final int FLAG_CONFIRMATION_DIALOG = 1; // 0x1
+ field public static final int PRIVACY_POLICY_AUTO = 200; // 0xc8
+ field public static final int PRIVACY_POLICY_EXPLICIT = 100; // 0x64
+ field public static final int PRIVACY_POLICY_LOCAL = 0; // 0x0
}
public static class IncidentManager.AuthListener {
@@ -1298,6 +1390,17 @@ package android.os {
method public void onReportDenied();
}
+ public static class IncidentManager.IncidentReport implements java.io.Closeable android.os.Parcelable {
+ ctor public IncidentManager.IncidentReport(android.os.Parcel);
+ method public void close();
+ method public int describeContents();
+ method public java.io.InputStream getInputStream() throws java.io.IOException;
+ method public long getPrivacyPolicy();
+ method public long getTimestamp();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.IncidentManager.IncidentReport> CREATOR;
+ }
+
public static class IncidentManager.PendingReport {
ctor public IncidentManager.PendingReport(@NonNull android.net.Uri);
method public int getFlags();
@@ -1641,7 +1744,7 @@ package android.provider {
public static interface DeviceConfig.Privacy {
field public static final String NAMESPACE = "privacy";
- field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "enable_location_access_check";
+ field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "location_access_check_enabled";
}
public final class MediaStore {
@@ -1755,6 +1858,24 @@ package android.security.keystore {
}
+package android.service.appprediction {
+
+ public abstract class AppPredictionService extends android.app.Service {
+ ctor public AppPredictionService();
+ method @MainThread public abstract void onAppTargetEvent(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull android.app.prediction.AppTargetEvent);
+ method public final android.os.IBinder onBind(android.content.Intent);
+ method public void onCreatePredictionSession(@NonNull android.app.prediction.AppPredictionContext, @NonNull android.app.prediction.AppPredictionSessionId);
+ method @MainThread public void onDestroyPredictionSession(@NonNull android.app.prediction.AppPredictionSessionId);
+ method @MainThread public abstract void onLocationShown(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>);
+ method @MainThread public abstract void onRequestPredictionUpdate(@NonNull android.app.prediction.AppPredictionSessionId);
+ method @MainThread public abstract void onSortAppTargets(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>);
+ method @MainThread public void onStartPredictionUpdates();
+ method @MainThread public void onStopPredictionUpdates();
+ method public final void updatePredictions(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>);
+ }
+
+}
+
package android.service.autofill {
public abstract class AutofillFieldClassificationService extends android.app.Service {
@@ -2368,6 +2489,10 @@ package android.view {
method public boolean isSystemGroup();
}
+ public abstract class LayoutInflater {
+ method public void setPrecompiledLayoutsEnabledForTesting(boolean);
+ }
+
public final class MotionEvent extends android.view.InputEvent implements android.os.Parcelable {
method public void setActionButton(int);
method public void setButtonState(int);
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 4718143c3ef1..427662aa9eaa 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -289,6 +289,7 @@ message Atom {
DebugElapsedClock debug_elapsed_clock = 10046;
DebugFailingElapsedClock debug_failing_elapsed_clock = 10047;
NumBiometricsEnrolled num_faces_enrolled = 10048;
+ RoleHolder role_holder = 10049;
}
// DO NOT USE field numbers above 100,000 in AOSP.
@@ -3974,6 +3975,20 @@ message NumBiometricsEnrolled {
optional int32 num_enrolled = 2;
}
+/**
+ * A mapping of role holder -> role
+ */
+message RoleHolder {
+ // uid of the role holder
+ optional int32 uid = 1 [(is_uid) = true];
+
+ // package name of the role holder
+ optional string package_name = 2;
+
+ // the role held
+ optional string role = 3;
+}
+
message AggStats {
optional int64 min = 1;
diff --git a/cmds/statsd/src/external/StatsCompanionServicePuller.cpp b/cmds/statsd/src/external/StatsCompanionServicePuller.cpp
index 4e4b8f35726d..f37d2bedf8c2 100644
--- a/cmds/statsd/src/external/StatsCompanionServicePuller.cpp
+++ b/cmds/statsd/src/external/StatsCompanionServicePuller.cpp
@@ -55,6 +55,10 @@ bool StatsCompanionServicePuller::PullInternal(vector<shared_ptr<LogEvent> >* da
Status status = statsCompanionServiceCopy->pullData(mTagId, &returned_value);
if (!status.isOk()) {
ALOGW("StatsCompanionServicePuller::pull failed for %d", mTagId);
+ StatsdStats::getInstance().noteStatsCompanionPullFailed(mTagId);
+ if (status.exceptionCode() == Status::Exception::EX_TRANSACTION_FAILED) {
+ StatsdStats::getInstance().noteStatsCompanionPullBinderTransactionFailed(mTagId);
+ }
return false;
}
data->clear();
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index ba7bcc437d74..6f3eeaa71703 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -220,6 +220,9 @@ const std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
// BuildInformation.
{android::util::BUILD_INFORMATION,
{.puller = new StatsCompanionServicePuller(android::util::BUILD_INFORMATION)}},
+ // RoleHolder.
+ {android::util::ROLE_HOLDER,
+ {.puller = new StatsCompanionServicePuller(android::util::ROLE_HOLDER)}},
};
StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) {
@@ -231,6 +234,9 @@ bool StatsPullerManager::Pull(int tagId, vector<shared_ptr<LogEvent>>* data) {
if (kAllPullAtomInfo.find(tagId) != kAllPullAtomInfo.end()) {
bool ret = kAllPullAtomInfo.find(tagId)->second.puller->Pull(data);
VLOG("pulled %d items", (int)data->size());
+ if (!ret) {
+ StatsdStats::getInstance().notePullFailed(tagId);
+ }
return ret;
} else {
VLOG("Unknown tagId %d", tagId);
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index f4d0144e8878..37ccad5f4a49 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -403,6 +403,60 @@ void StatsdStats::noteSystemServerRestart(int32_t timeSec) {
mSystemServerRestartSec.push_back(timeSec);
}
+void StatsdStats::notePullFailed(int atomId) {
+ lock_guard<std::mutex> lock(mLock);
+ mPulledAtomStats[atomId].pullFailed++;
+}
+
+void StatsdStats::noteStatsCompanionPullFailed(int atomId) {
+ lock_guard<std::mutex> lock(mLock);
+ mPulledAtomStats[atomId].statsCompanionPullFailed++;
+}
+
+void StatsdStats::noteStatsCompanionPullBinderTransactionFailed(int atomId) {
+ lock_guard<std::mutex> lock(mLock);
+ mPulledAtomStats[atomId].statsCompanionPullBinderTransactionFailed++;
+}
+
+void StatsdStats::noteEmptyData(int atomId) {
+ lock_guard<std::mutex> lock(mLock);
+ mPulledAtomStats[atomId].emptyData++;
+}
+
+void StatsdStats::noteHardDimensionLimitReached(int metricId) {
+ lock_guard<std::mutex> lock(mLock);
+ getAtomMetricStats(metricId).hardDimensionLimitReached++;
+}
+
+void StatsdStats::noteLateLogEventSkipped(int metricId) {
+ lock_guard<std::mutex> lock(mLock);
+ getAtomMetricStats(metricId).lateLogEventSkipped++;
+}
+
+void StatsdStats::noteSkippedForwardBuckets(int metricId) {
+ lock_guard<std::mutex> lock(mLock);
+ getAtomMetricStats(metricId).skippedForwardBuckets++;
+}
+
+void StatsdStats::noteBadValueType(int metricId) {
+ lock_guard<std::mutex> lock(mLock);
+ getAtomMetricStats(metricId).badValueType++;
+}
+
+void StatsdStats::noteConditionChangeInNextBucket(int metricId) {
+ lock_guard<std::mutex> lock(mLock);
+ getAtomMetricStats(metricId).conditionChangeInNextBucket++;
+}
+
+StatsdStats::AtomMetricStats& StatsdStats::getAtomMetricStats(int metricId) {
+ auto atomMetricStatsIter = mAtomMetricStats.find(metricId);
+ if (atomMetricStatsIter != mAtomMetricStats.end()) {
+ return atomMetricStatsIter->second;
+ }
+ auto emplaceResult = mAtomMetricStats.emplace(metricId, AtomMetricStats());
+ return emplaceResult.first->second;
+}
+
void StatsdStats::reset() {
lock_guard<std::mutex> lock(mLock);
resetInternalLocked();
@@ -442,6 +496,7 @@ void StatsdStats::resetInternalLocked() {
pullStats.second.pullTimeout = 0;
pullStats.second.pullExceedMaxDelay = 0;
}
+ mAtomMetricStats.clear();
}
string buildTimeString(int64_t timeSec) {
@@ -713,6 +768,10 @@ void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) {
android::os::statsd::writePullerStatsToStream(pair, &proto);
}
+ for (const auto& pair : mAtomMetricStats) {
+ android::os::statsd::writeAtomMetricStatsToStream(pair, &proto);
+ }
+
if (mAnomalyAlarmRegisteredStats > 0) {
uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_ANOMALY_ALARM_STATS);
proto.write(FIELD_TYPE_INT32 | FIELD_ID_ANOMALY_ALARMS_REGISTERED,
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index dc647f888b6f..01e9ca17e5fd 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -318,6 +318,53 @@ public:
void noteLogLost(int32_t wallClockTimeSec, int32_t count, int lastError);
/**
+ * Records that the pull of an atom has failed
+ */
+ void notePullFailed(int atomId);
+
+ /**
+ * Records that the pull of StatsCompanionService atom has failed
+ */
+ void noteStatsCompanionPullFailed(int atomId);
+
+ /**
+ * Records that the pull of a StatsCompanionService atom has failed due to a failed binder
+ * transaction. This can happen when StatsCompanionService returns too
+ * much data (the max Binder parcel size is 1MB)
+ */
+ void noteStatsCompanionPullBinderTransactionFailed(int atomId);
+
+ /**
+ * A pull with no data occurred
+ */
+ void noteEmptyData(int atomId);
+
+ /**
+ * Hard limit was reached in the cardinality of an atom
+ */
+ void noteHardDimensionLimitReached(int atomId);
+
+ /**
+ * A log event was too late, arrived in the wrong bucket and was skipped
+ */
+ void noteLateLogEventSkipped(int atomId);
+
+ /**
+ * Buckets were skipped as time elapsed without any data for them
+ */
+ void noteSkippedForwardBuckets(int atomId);
+
+ /**
+ * An unsupported value type was received
+ */
+ void noteBadValueType(int atomId);
+
+ /**
+ * A condition change was too late, arrived in the wrong bucket and was skipped
+ */
+ void noteConditionChangeInNextBucket(int atomId);
+
+ /**
* Reset the historical stats. Including all stats in icebox, and the tracked stats about
* metrics, matchers, and atoms. The active configs will be kept and StatsdStats will continue
* to collect stats after reset() has been called.
@@ -349,8 +396,20 @@ public:
long dataError = 0;
long pullTimeout = 0;
long pullExceedMaxDelay = 0;
+ long pullFailed = 0;
+ long statsCompanionPullFailed = 0;
+ long statsCompanionPullBinderTransactionFailed = 0;
+ long emptyData = 0;
} PulledAtomStats;
+ typedef struct {
+ long hardDimensionLimitReached = 0;
+ long lateLogEventSkipped = 0;
+ long skippedForwardBuckets = 0;
+ long badValueType = 0;
+ long conditionChangeInNextBucket = 0;
+ } AtomMetricStats;
+
private:
StatsdStats();
@@ -378,6 +437,9 @@ private:
// Maps PullAtomId to its stats. The size is capped by the puller atom counts.
std::map<int, PulledAtomStats> mPulledAtomStats;
+ // Maps metric ID to its stats. The size is capped by the number of metrics.
+ std::map<int, AtomMetricStats> mAtomMetricStats;
+
struct LogLossStats {
LogLossStats(int32_t sec, int32_t count, int32_t error)
: mWallClockSec(sec), mCount(count), mLastError(error) {
@@ -414,6 +476,12 @@ private:
void addToIceBoxLocked(std::shared_ptr<ConfigStats>& stats);
+ /**
+ * Get a reference to AtomMetricStats for a metric. If none exists, create it. The reference
+ * will live as long as `this`.
+ */
+ StatsdStats::AtomMetricStats& getAtomMetricStats(int metricId);
+
FRIEND_TEST(StatsdStatsTest, TestValidConfigAdd);
FRIEND_TEST(StatsdStatsTest, TestInvalidConfigAdd);
FRIEND_TEST(StatsdStatsTest, TestConfigRemove);
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index 5645461cc3ab..6aa8e842b021 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -322,6 +322,7 @@ void ValueMetricProducer::onConditionChangedLocked(const bool condition,
if (eventTimeNs < mCurrentBucketStartTimeNs) {
VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs,
(long long)mCurrentBucketStartTimeNs);
+ StatsdStats::getInstance().noteConditionChangeInNextBucket(mMetricId);
return;
}
@@ -359,6 +360,12 @@ void ValueMetricProducer::pullAndMatchEventsLocked(const int64_t timestampNs) {
}
StatsdStats::getInstance().notePullDelay(mPullTagId, pullDelayNs);
+ if (timestampNs < mCurrentBucketStartTimeNs) {
+ // The data will be skipped in onMatchedLogEventInternalLocked, but we don't want to report
+ // for every event, just the pull
+ StatsdStats::getInstance().noteLateLogEventSkipped(mMetricId);
+ }
+
for (const auto& data : allData) {
// make a copy before doing and changes
LogEvent localCopy = data->makeCopy();
@@ -380,6 +387,7 @@ void ValueMetricProducer::onDataPulled(const std::vector<std::shared_ptr<LogEven
if (mCondition) {
if (allData.size() == 0) {
VLOG("Data pulled is empty");
+ StatsdStats::getInstance().noteEmptyData(mPullTagId);
return;
}
// For scheduled pulled data, the effective event time is snap to the nearest
@@ -394,6 +402,7 @@ void ValueMetricProducer::onDataPulled(const std::vector<std::shared_ptr<LogEven
if (bucketEndTime < mCurrentBucketStartTimeNs) {
VLOG("Skip bucket end pull due to late arrival: %lld vs %lld", (long long)bucketEndTime,
(long long)mCurrentBucketStartTimeNs);
+ StatsdStats::getInstance().noteLateLogEventSkipped(mMetricId);
return;
}
for (const auto& data : allData) {
@@ -442,6 +451,7 @@ bool ValueMetricProducer::hitGuardRailLocked(const MetricDimensionKey& newKey) {
if (newTupleCount > mDimensionHardLimit) {
ALOGE("ValueMetric %lld dropping data for dimension key %s", (long long)mMetricId,
newKey.toString().c_str());
+ StatsdStats::getInstance().noteHardDimensionLimitReached(mMetricId);
return true;
}
}
@@ -539,6 +549,7 @@ void ValueMetricProducer::onMatchedLogEventInternalLocked(const size_t matcherIn
Value value;
if (!getDoubleOrLong(event, matcher, value)) {
VLOG("Failed to get value %d from event %s", i, event.ToString().c_str());
+ StatsdStats::getInstance().noteBadValueType(mMetricId);
return;
}
interval.seenNewData = true;
@@ -656,6 +667,7 @@ void ValueMetricProducer::flushIfNeededLocked(const int64_t& eventTimeNs) {
if (numBucketsForward > 1) {
VLOG("Skipping forward %lld buckets", (long long)numBucketsForward);
+ StatsdStats::getInstance().noteSkippedForwardBuckets(mMetricId);
// take base again in future good bucket.
resetBase();
}
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index e8de875a461b..cca09ac017a3 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -403,9 +403,23 @@ message StatsdStatsReport {
optional int64 data_error = 9;
optional int64 pull_timeout = 10;
optional int64 pull_exceed_max_delay = 11;
+ optional int64 pull_failed = 12;
+ optional int64 stats_companion_pull_failed = 13;
+ optional int64 stats_companion_pull_binder_transaction_failed = 14;
+ optional int64 empty_data = 15;
}
repeated PulledAtomStats pulled_atom_stats = 10;
+ message AtomMetricStats {
+ optional int64 metric_id = 1;
+ optional int64 hard_dimension_limit_reached = 2;
+ optional int64 late_log_event_skipped = 3;
+ optional int64 skipped_forward_buckets = 4;
+ optional int64 bad_value_type = 5;
+ optional int64 condition_change_in_next_bucket = 6;
+ }
+ repeated AtomMetricStats atom_metric_stats = 17;
+
message LoggerErrorStats {
optional int32 logger_disconnection_sec = 1;
optional int32 error_code = 2;
diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp
index 7de0bb3290a7..9c9985ed271c 100644
--- a/cmds/statsd/src/stats_log_util.cpp
+++ b/cmds/statsd/src/stats_log_util.cpp
@@ -66,6 +66,18 @@ const int FIELD_ID_MAX_PULL_DELAY_NANOS = 8;
const int FIELD_ID_DATA_ERROR = 9;
const int FIELD_ID_PULL_TIMEOUT = 10;
const int FIELD_ID_PULL_EXCEED_MAX_DELAY = 11;
+const int FIELD_ID_PULL_FAILED = 12;
+const int FIELD_ID_STATS_COMPANION_FAILED = 13;
+const int FIELD_ID_STATS_COMPANION_BINDER_TRANSACTION_FAILED = 14;
+const int FIELD_ID_EMPTY_DATA = 15;
+// for AtomMetricStats proto
+const int FIELD_ID_ATOM_METRIC_STATS = 17;
+const int FIELD_ID_METRIC_ID = 1;
+const int FIELD_ID_HARD_DIMENSION_LIMIT_REACHED = 2;
+const int FIELD_ID_LATE_LOG_EVENT_SKIPPED = 3;
+const int FIELD_ID_SKIPPED_FORWARD_BUCKETS = 4;
+const int FIELD_ID_BAD_VALUE_TYPE = 5;
+const int FIELD_ID_CONDITION_CHANGE_IN_NEXT_BUCKET = 6;
namespace {
@@ -456,6 +468,32 @@ void writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats>
(long long)pair.second.pullTimeout);
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_EXCEED_MAX_DELAY,
(long long)pair.second.pullExceedMaxDelay);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_FAILED,
+ (long long)pair.second.pullFailed);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_STATS_COMPANION_FAILED,
+ (long long)pair.second.statsCompanionPullFailed);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_STATS_COMPANION_BINDER_TRANSACTION_FAILED,
+ (long long)pair.second.statsCompanionPullBinderTransactionFailed);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_EMPTY_DATA,
+ (long long)pair.second.emptyData);
+ protoOutput->end(token);
+}
+
+void writeAtomMetricStatsToStream(const std::pair<int, StatsdStats::AtomMetricStats> &pair,
+ util::ProtoOutputStream *protoOutput) {
+ uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOM_METRIC_STATS |
+ FIELD_COUNT_REPEATED);
+ protoOutput->write(FIELD_TYPE_INT32 | FIELD_ID_METRIC_ID, (int32_t)pair.first);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_HARD_DIMENSION_LIMIT_REACHED,
+ (long long)pair.second.hardDimensionLimitReached);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_LATE_LOG_EVENT_SKIPPED,
+ (long long)pair.second.lateLogEventSkipped);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_SKIPPED_FORWARD_BUCKETS,
+ (long long)pair.second.skippedForwardBuckets);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_BAD_VALUE_TYPE,
+ (long long)pair.second.badValueType);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_CONDITION_CHANGE_IN_NEXT_BUCKET,
+ (long long)pair.second.conditionChangeInNextBucket);
protoOutput->end(token);
}
diff --git a/cmds/statsd/src/stats_log_util.h b/cmds/statsd/src/stats_log_util.h
index 61f31eb3fa17..dcea0e653e22 100644
--- a/cmds/statsd/src/stats_log_util.h
+++ b/cmds/statsd/src/stats_log_util.h
@@ -73,6 +73,10 @@ int64_t MillisToNano(const int64_t millis);
void writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats>& pair,
util::ProtoOutputStream* protoOutput);
+// Helper function to write AtomMetricStats to ProtoOutputStream
+void writeAtomMetricStatsToStream(const std::pair<int, StatsdStats::AtomMetricStats> &pair,
+ util::ProtoOutputStream *protoOutput);
+
template<class T>
bool parseProtoOutputStream(util::ProtoOutputStream& protoOutput, T* message) {
std::string pbBytes;
diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt
index 8e7a58b40d0c..a74895947450 100644
--- a/config/hiddenapi-greylist.txt
+++ b/config/hiddenapi-greylist.txt
@@ -1942,7 +1942,6 @@ Lcom/android/internal/R$id;->title:I
Lcom/android/internal/R$id;->titleDivider:I
Lcom/android/internal/R$id;->titleDividerTop:I
Lcom/android/internal/R$id;->title_container:I
-Lcom/android/internal/R$id;->title_icon:I
Lcom/android/internal/R$id;->title_template:I
Lcom/android/internal/R$id;->topPanel:I
Lcom/android/internal/R$id;->up:I
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index ce5d8a5cfeb2..eae7d6b79f67 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -28,15 +28,12 @@ import android.content.Context;
import android.content.Intent;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
-import android.hardware.input.InputManager;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.IWindowManager;
-import android.view.InputDevice;
-import android.view.MotionEvent;
import android.view.SurfaceControl;
import android.view.SurfaceHolder;
import android.view.SurfaceSession;
@@ -51,9 +48,7 @@ import dalvik.system.CloseGuard;
import java.util.List;
/**
- * Activity container that allows launching activities into itself and does input forwarding.
- * <p>Creation of this view is only allowed to callers who have
- * {@link android.Manifest.permission#INJECT_EVENTS} permission.
+ * Activity container that allows launching activities into itself.
* <p>Activity launching into this container is restricted by the same rules that apply to launching
* on VirtualDisplays.
* @hide
@@ -76,9 +71,8 @@ public class ActivityView extends ViewGroup {
private StateCallback mActivityViewCallback;
private IActivityTaskManager mActivityTaskManager;
- private IInputForwarder mInputForwarder;
- // Temp container to store view coordinates on screen.
- private final int[] mLocationOnScreen = new int[2];
+ // Temp container to store view coordinates in window.
+ private final int[] mLocationInWindow = new int[2];
private TaskStackListener mTaskStackListener;
@@ -280,7 +274,7 @@ public class ActivityView extends ViewGroup {
}
/**
- * Triggers an update of {@link ActivityView}'s location on screen to properly set touch exclude
+ * Triggers an update of {@link ActivityView}'s location in window to properly set touch exclude
* regions and avoid focus switches by touches on this view.
*/
public void onLocationChanged() {
@@ -295,45 +289,14 @@ public class ActivityView extends ViewGroup {
/** Send current location and size to the WM to set tap exclude region for this view. */
private void updateLocation() {
try {
- getLocationOnScreen(mLocationOnScreen);
+ getLocationInWindow(mLocationInWindow);
WindowManagerGlobal.getWindowSession().updateTapExcludeRegion(getWindow(), hashCode(),
- mLocationOnScreen[0], mLocationOnScreen[1], getWidth(), getHeight());
+ mLocationInWindow[0], mLocationInWindow[1], getWidth(), getHeight());
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
}
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return injectInputEvent(event) || super.onTouchEvent(event);
- }
-
- @Override
- public boolean onGenericMotionEvent(MotionEvent event) {
- if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) {
- if (injectInputEvent(event)) {
- return true;
- }
- }
- return super.onGenericMotionEvent(event);
- }
-
- private boolean injectInputEvent(MotionEvent event) {
- if (mInputForwarder != null) {
- try {
- // The touch event that the ActivityView gets is in View space, but the event needs
- // to get forwarded in screen space. This offsets the touch event by the location
- // the ActivityView is on screen and sends it to the input forwarder.
- getLocationOnScreen(mLocationOnScreen);
- event.offsetLocation(mLocationOnScreen[0], mLocationOnScreen[1]);
- return mInputForwarder.forwardEvent(event);
- } catch (RemoteException e) {
- e.rethrowAsRuntimeException();
- }
- }
- return false;
- }
-
private class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
@@ -416,7 +379,6 @@ public class ActivityView extends ViewGroup {
}
mTmpTransaction.show(mRootSurfaceControl).apply();
- mInputForwarder = InputManager.getInstance().createInputForwarder(displayId);
mTaskStackListener = new TaskStackListenerImpl();
try {
mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
@@ -432,9 +394,6 @@ public class ActivityView extends ViewGroup {
mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
- if (mInputForwarder != null) {
- mInputForwarder = null;
- }
cleanTapExcludeRegion();
if (mTaskStackListener != null) {
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index acc70944abf0..fde1d29eb709 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -26,7 +26,6 @@ import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
-import android.content.Intent;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.net.ConnectivityManager;
@@ -37,7 +36,6 @@ import android.os.Environment;
import android.os.FileUtils;
import android.os.ParcelFileDescriptor;
import android.provider.Downloads;
-import android.provider.MediaStore.Images;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.text.TextUtils;
@@ -399,14 +397,14 @@ public class DownloadManager {
/** if a file is designated as a MediaScanner scannable file, the following value is
* stored in the database column {@link Downloads.Impl#COLUMN_MEDIA_SCANNED}.
*/
- private static final int SCANNABLE_VALUE_YES = 0;
+ private static final int SCANNABLE_VALUE_YES = Downloads.Impl.MEDIA_NOT_SCANNED;
// value of 1 is stored in the above column by DownloadProvider after it is scanned by
// MediaScanner
/** if a file is designated as a file that should not be scanned by MediaScanner,
* the following value is stored in the database column
* {@link Downloads.Impl#COLUMN_MEDIA_SCANNED}.
*/
- private static final int SCANNABLE_VALUE_NO = 2;
+ private static final int SCANNABLE_VALUE_NO = Downloads.Impl.MEDIA_NOT_SCANNABLE;
/**
* This download is visible but only shows in the notifications
@@ -1264,19 +1262,6 @@ public class DownloadManager {
throw new IllegalStateException("Failed to rename to " + after);
}
- // Update MediaProvider if necessary
- if (mimeType.startsWith("image/")) {
- context.getContentResolver().delete(Images.Media.EXTERNAL_CONTENT_URI,
- Images.Media.DATA + "=?",
- new String[] {
- before.getAbsolutePath()
- });
-
- Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
- intent.setData(Uri.fromFile(after));
- context.sendBroadcast(intent);
- }
-
ContentValues values = new ContentValues();
values.put(Downloads.Impl.COLUMN_TITLE, displayName);
values.put(Downloads.Impl._DATA, after.toString());
@@ -1329,8 +1314,7 @@ public class DownloadManager {
* @param description the description that would appear for this file in Downloads App.
* @param isMediaScannerScannable true if the file is to be scanned by MediaScanner. Files
* scanned by MediaScanner appear in the applications used to view media (for example,
- * Gallery app). Starting from {@link android.os.Build.VERSION_CODES#Q}, this argument is
- * ignored and the file is always scanned by MediaScanner.
+ * Gallery app).
* @param mimeType mimetype of the file.
* @param path absolute pathname to the file. The file should be world-readable, so that it can
* be managed by the Downloads App and any other app that is used to read it (for example,
@@ -1359,8 +1343,7 @@ public class DownloadManager {
* @param description the description that would appear for this file in Downloads App.
* @param isMediaScannerScannable true if the file is to be scanned by MediaScanner. Files
* scanned by MediaScanner appear in the applications used to view media (for example,
- * Gallery app). Starting from {@link android.os.Build.VERSION_CODES#Q}, this argument is
- * ignored and the file is always scanned by MediaScanner.
+ * Gallery app).
* @param mimeType mimetype of the file.
* @param path absolute pathname to the file. The file should be world-readable, so that it can
* be managed by the Downloads App and any other app that is used to read it (for example,
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 8953940952a8..df04a6b4d134 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -65,6 +65,9 @@ interface INotificationManager
boolean areNotificationsEnabled(String pkg);
int getPackageImportance(String pkg);
+ boolean shouldHideSilentStatusIcons(String callingPkg);
+ void setHideSilentStatusIcons(boolean hide);
+
void setBubblesAllowed(String pkg, int uid, boolean allowed);
boolean areBubblesAllowed(String pkg);
boolean areBubblesAllowedForPackage(String pkg, int uid);
@@ -151,6 +154,8 @@ interface INotificationManager
void setNotificationAssistantAccessGrantedForUser(in ComponentName assistant, int userId, boolean enabled);
List<String> getEnabledNotificationListenerPackages();
List<ComponentName> getEnabledNotificationListeners(int userId);
+ ComponentName getAllowedNotificationAssistantForUser(int userId);
+ ComponentName getAllowedNotificationAssistant();
int getZenMode();
ZenModeConfig getZenModeConfig();
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 621f134dc68e..8207e0a112c5 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -20,6 +20,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
@@ -353,7 +354,8 @@ public class NotificationManager {
public static final int IMPORTANCE_MIN = 1;
/**
- * Low notification importance: shows everywhere, but is not intrusive.
+ * Low notification importance: Shows in the shade, and potentially in the status bar
+ * (see {@link #shouldHideSilentStatusBarIcons()}), but is not audibly intrusive.
*/
public static final int IMPORTANCE_LOW = 2;
@@ -826,6 +828,7 @@ public class NotificationManager {
/**
* @hide
*/
+ @TestApi
public boolean matchesCallFilter(Bundle extras) {
INotificationManager service = getService();
try {
@@ -1153,6 +1156,19 @@ public class NotificationManager {
}
}
+ /**
+ * Checks whether the user has approved a given
+ * {@link android.service.notification.NotificationAssistantService}.
+ *
+ * <p>
+ * The assistant service must belong to the calling app.
+ *
+ * <p>
+ * Apps can request notification assistant access by sending the user to the activity that
+ * matches the system intent action
+ * TODO: STOPSHIP: Add correct intent
+ * {@link android.provider.Settings#ACTION_MANAGE_DEFAULT_APPS_SETTINGS}.
+ */
public boolean isNotificationAssistantAccessGranted(ComponentName assistant) {
INotificationManager service = getService();
try {
@@ -1162,6 +1178,22 @@ public class NotificationManager {
}
}
+ /**
+ * Returns whether the user wants silent notifications (see {@link #IMPORTANCE_LOW} to appear
+ * in the status bar.
+ *
+ * <p>Only available for {@link #isNotificationListenerAccessGranted(ComponentName) notification
+ * listeners}.
+ */
+ public boolean shouldHideSilentStatusBarIcons() {
+ INotificationManager service = getService();
+ try {
+ return service.shouldHideSilentStatusIcons(mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/** @hide */
public boolean isNotificationPolicyAccessGrantedForPackage(String pkg) {
INotificationManager service = getService();
@@ -1248,6 +1280,45 @@ public class NotificationManager {
}
}
+ /**
+ * Grants/revokes Notification Assistant access to {@code assistant} for current user.
+ *
+ * @param assistant Name of component to grant/revoke access or {@code null} to revoke access to
+ * current assistant
+ * @param granted Grant/revoke access
+ * @hide
+ */
+ @SystemApi
+ public void setNotificationAssistantAccessGranted(ComponentName assistant, boolean granted) {
+ INotificationManager service = getService();
+ try {
+ service.setNotificationAssistantAccessGranted(assistant, granted);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Grants/revokes Notification Assistant access to {@code assistant} for given user.
+ *
+ * @param assistant Name of component to grant/revoke access or {@code null} to revoke access to
+ * current assistant
+ * @param user handle to associate assistant with
+ * @param granted Grant/revoke access
+ * @hide
+ */
+ @SystemApi
+ public void setNotificationAssistantAccessGrantedForUser(ComponentName assistant,
+ UserHandle user, boolean granted) {
+ INotificationManager service = getService();
+ try {
+ service.setNotificationAssistantAccessGrantedForUser(assistant, user.getIdentifier(),
+ granted);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/** @hide */
public List<ComponentName> getEnabledNotificationListeners(int userId) {
INotificationManager service = getService();
@@ -1258,6 +1329,29 @@ public class NotificationManager {
}
}
+ /** @hide */
+ @SystemApi
+ public @Nullable ComponentName getAllowedNotificationAssistantForUser(UserHandle user) {
+ INotificationManager service = getService();
+ try {
+ return service.getAllowedNotificationAssistantForUser(user.getIdentifier());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /** @hide */
+ @SystemApi
+ public @Nullable ComponentName getAllowedNotificationAssistant() {
+ INotificationManager service = getService();
+ try {
+ return service.getAllowedNotificationAssistant();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+
private Context mContext;
private static void checkRequired(String name, Object value) {
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index b8f4385ea74b..f0d0aad76f98 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -9614,12 +9614,18 @@ public class DevicePolicyManager {
}
/**
- * Allows the device owner to enable or disable the backup service.
+ * Allows the device owner or profile owner to enable or disable the backup service.
*
- * <p> Backup service manages all backup and restore mechanisms on the device. Setting this to
- * false will prevent data from being backed up or restored.
+ * <p> Each user has its own backup service which manages the backup and restore mechanisms in
+ * that user. Disabling the backup service will prevent data from being backed up or restored.
*
- * <p> Backup service is off by default when device owner is present.
+ * <p> Device owner calls this API to control backup services across all users on the device.
+ * Profile owner can use this API to enable or disable the profile's backup service. However,
+ * for a managed profile its backup functionality is only enabled if both the device owner
+ * and the profile owner have enabled the backup service.
+ *
+ * <p> By default, backup service is disabled on a device with device owner, and within a
+ * managed profile.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param enabled {@code true} to enable the backup service, {@code false} to disable it.
@@ -9635,7 +9641,12 @@ public class DevicePolicyManager {
}
/**
- * Return whether the backup service is enabled by the device owner.
+ * Return whether the backup service is enabled by the device owner or profile owner for the
+ * current user, as previously set by {@link #setBackupServiceEnabled(ComponentName, boolean)}.
+ *
+ * <p> Whether the backup functionality is actually enabled or not depends on settings from both
+ * the current user and the device owner, please see
+ * {@link #setBackupServiceEnabled(ComponentName, boolean)} for details.
*
* <p> Backup service manages all backup and restore mechanisms on the device.
*
diff --git a/core/java/android/app/prediction/AppPredictionContext.java b/core/java/android/app/prediction/AppPredictionContext.java
index 87ccb660e5bd..2fbe6e360085 100644
--- a/core/java/android/app/prediction/AppPredictionContext.java
+++ b/core/java/android/app/prediction/AppPredictionContext.java
@@ -18,6 +18,7 @@ package android.app.prediction;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcel;
@@ -29,6 +30,7 @@ import android.os.Parcelable;
* @hide
*/
@SystemApi
+@TestApi
public final class AppPredictionContext implements Parcelable {
private final int mPredictedTargetCount;
@@ -73,6 +75,17 @@ public final class AppPredictionContext implements Parcelable {
}
@Override
+ public boolean equals(Object o) {
+ if (o == this) return true;
+ if (!getClass().equals(o != null ? o.getClass() : null)) return false;
+
+ AppPredictionContext other = (AppPredictionContext) o;
+ return mPredictedTargetCount == other.mPredictedTargetCount
+ && mUiSurface.equals(other.mUiSurface)
+ && mPackageName.equals(other.mPackageName);
+ }
+
+ @Override
public int describeContents() {
return 0;
}
@@ -104,6 +117,7 @@ public final class AppPredictionContext implements Parcelable {
* @hide
*/
@SystemApi
+ @TestApi
public static final class Builder {
@NonNull
@@ -116,8 +130,12 @@ public final class AppPredictionContext implements Parcelable {
private Bundle mExtras;
/**
+ * TODO(b/123591863): Add java docs
+ *
* @hide
*/
+ @SystemApi
+ @TestApi
public Builder(@NonNull Context context) {
mPackageName = context.getPackageName();
}
diff --git a/core/java/android/app/prediction/AppPredictionManager.java b/core/java/android/app/prediction/AppPredictionManager.java
index f8578d4533ef..99f78f1957b9 100644
--- a/core/java/android/app/prediction/AppPredictionManager.java
+++ b/core/java/android/app/prediction/AppPredictionManager.java
@@ -17,6 +17,7 @@ package android.app.prediction;
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.Context;
import com.android.internal.util.Preconditions;
@@ -26,6 +27,7 @@ import com.android.internal.util.Preconditions;
* @hide
*/
@SystemApi
+@TestApi
public final class AppPredictionManager {
private final Context mContext;
diff --git a/core/java/android/app/prediction/AppPredictionSessionId.java b/core/java/android/app/prediction/AppPredictionSessionId.java
index 1d7308ec2404..1e76c241f8e9 100644
--- a/core/java/android/app/prediction/AppPredictionSessionId.java
+++ b/core/java/android/app/prediction/AppPredictionSessionId.java
@@ -17,6 +17,7 @@ package android.app.prediction;
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -26,6 +27,7 @@ import android.os.Parcelable;
* @hide
*/
@SystemApi
+@TestApi
public final class AppPredictionSessionId implements Parcelable {
private final String mId;
diff --git a/core/java/android/app/prediction/AppPredictor.java b/core/java/android/app/prediction/AppPredictor.java
index 2ddbd08c7477..12d6ce3c5b90 100644
--- a/core/java/android/app/prediction/AppPredictor.java
+++ b/core/java/android/app/prediction/AppPredictor.java
@@ -19,6 +19,7 @@ import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.app.prediction.IPredictionCallback.Stub;
import android.content.Context;
import android.content.pm.ParceledListSlice;
@@ -63,6 +64,7 @@ import java.util.function.Consumer;
* @hide
*/
@SystemApi
+@TestApi
public final class AppPredictor {
private static final String TAG = AppPredictor.class.getSimpleName();
@@ -102,6 +104,10 @@ public final class AppPredictor {
* Notifies the prediction service of an app target event.
*/
public void notifyAppTargetEvent(@NonNull AppTargetEvent event) {
+ if (mIsClosed.get()) {
+ throw new IllegalStateException("This client has already been destroyed.");
+ }
+
try {
mPredictionManager.notifyAppTargetEvent(mSessionId, event);
} catch (RemoteException e) {
@@ -114,6 +120,10 @@ public final class AppPredictor {
*/
public void notifyLocationShown(@NonNull String launchLocation,
@NonNull List<AppTargetId> targetIds) {
+ if (mIsClosed.get()) {
+ throw new IllegalStateException("This client has already been destroyed.");
+ }
+
try {
mPredictionManager.notifyLocationShown(mSessionId, launchLocation,
new ParceledListSlice<>(targetIds));
@@ -130,6 +140,10 @@ public final class AppPredictor {
*/
public void registerPredictionUpdates(@NonNull @CallbackExecutor Executor callbackExecutor,
@NonNull AppPredictor.Callback callback) {
+ if (mIsClosed.get()) {
+ throw new IllegalStateException("This client has already been destroyed.");
+ }
+
if (mRegisteredCallbacks.containsKey(callback)) {
// Skip if this callback is already registered
return;
@@ -149,6 +163,10 @@ public final class AppPredictor {
* callback until the callback is re-registered.
*/
public void unregisterPredictionUpdates(@NonNull AppPredictor.Callback callback) {
+ if (mIsClosed.get()) {
+ throw new IllegalStateException("This client has already been destroyed.");
+ }
+
if (!mRegisteredCallbacks.containsKey(callback)) {
// Skip if this callback was never registered
return;
@@ -168,6 +186,10 @@ public final class AppPredictor {
* @see Callback#onTargetsAvailable(List)
*/
public void requestPredictionUpdate() {
+ if (mIsClosed.get()) {
+ throw new IllegalStateException("This client has already been destroyed.");
+ }
+
try {
mPredictionManager.requestPredictionUpdate(mSessionId);
} catch (RemoteException e) {
@@ -182,6 +204,10 @@ public final class AppPredictor {
@Nullable
public void sortTargets(@NonNull List<AppTarget> targets,
@NonNull Executor callbackExecutor, @NonNull Consumer<List<AppTarget>> callback) {
+ if (mIsClosed.get()) {
+ throw new IllegalStateException("This client has already been destroyed.");
+ }
+
try {
mPredictionManager.sortAppTargets(mSessionId, new ParceledListSlice(targets),
new CallbackWrapper(callbackExecutor, callback));
@@ -206,6 +232,8 @@ public final class AppPredictor {
} catch (RemoteException e) {
Log.e(TAG, "Failed to notify app target event", e);
}
+ } else {
+ throw new IllegalStateException("This client has already been destroyed.");
}
}
@@ -222,6 +250,16 @@ public final class AppPredictor {
}
/**
+ * TODO(b/123591863): Add java docs
+ *
+ * @hide
+ */
+ @TestApi
+ public AppPredictionSessionId getSessionId() {
+ return mSessionId;
+ }
+
+ /**
* Callback for receiving prediction updates.
*/
public interface Callback {
diff --git a/core/java/android/app/prediction/AppTarget.java b/core/java/android/app/prediction/AppTarget.java
index 99c1c44866fe..b924cec63823 100644
--- a/core/java/android/app/prediction/AppTarget.java
+++ b/core/java/android/app/prediction/AppTarget.java
@@ -18,6 +18,7 @@ package android.app.prediction;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.pm.ShortcutInfo;
import android.os.Parcel;
import android.os.Parcelable;
@@ -30,6 +31,7 @@ import com.android.internal.util.Preconditions;
* @hide
*/
@SystemApi
+@TestApi
public final class AppTarget implements Parcelable {
private final AppTargetId mId;
@@ -42,8 +44,12 @@ public final class AppTarget implements Parcelable {
private int mRank;
/**
+ * TODO(b/123591863): Add java docs
+ *
* @hide
*/
+ @SystemApi
+ @TestApi
public AppTarget(@NonNull AppTargetId id, @NonNull String packageName,
@Nullable String className, @NonNull UserHandle user) {
mId = id;
@@ -55,15 +61,19 @@ public final class AppTarget implements Parcelable {
}
/**
+ * TODO(b/123591863): Add java docs
+ *
* @hide
*/
- public AppTarget(@NonNull AppTargetId id, @NonNull ShortcutInfo shortcutInfo) {
+ @SystemApi
+ public AppTarget(@NonNull AppTargetId id, @NonNull ShortcutInfo shortcutInfo,
+ @Nullable String className) {
mId = id;
mShortcutInfo = Preconditions.checkNotNull(shortcutInfo);
mPackageName = mShortcutInfo.getPackage();
mUser = mShortcutInfo.getUserHandle();
- mClassName = null;
+ mClassName = className;
}
private AppTarget(Parcel parcel) {
@@ -71,13 +81,12 @@ public final class AppTarget implements Parcelable {
mShortcutInfo = parcel.readTypedObject(ShortcutInfo.CREATOR);
if (mShortcutInfo == null) {
mPackageName = parcel.readString();
- mClassName = parcel.readString();
mUser = UserHandle.of(parcel.readInt());
} else {
mPackageName = mShortcutInfo.getPackage();
mUser = mShortcutInfo.getUserHandle();
- mClassName = null;
}
+ mClassName = parcel.readString();
mRank = parcel.readInt();
}
@@ -129,11 +138,32 @@ public final class AppTarget implements Parcelable {
mRank = rank;
}
+ /**
+ * Returns the rank for the target.
+ */
public int getRank() {
return mRank;
}
@Override
+ public boolean equals(Object o) {
+ if (!getClass().equals(o != null ? o.getClass() : null)) return false;
+
+ AppTarget other = (AppTarget) o;
+ boolean sameClassName = (mClassName == null && other.mClassName == null)
+ || (mClassName != null && mClassName.equals(other.mClassName));
+ boolean sameShortcutInfo = (mShortcutInfo == null && other.mShortcutInfo == null)
+ || (mShortcutInfo != null && other.mShortcutInfo != null
+ && mShortcutInfo.getId() == other.mShortcutInfo.getId());
+ return mId.equals(other.mId)
+ && mPackageName.equals(other.mPackageName)
+ && sameClassName
+ && mUser.equals(other.mUser)
+ && sameShortcutInfo
+ && mRank == other.mRank;
+ }
+
+ @Override
public int describeContents() {
return 0;
}
@@ -144,9 +174,9 @@ public final class AppTarget implements Parcelable {
dest.writeTypedObject(mShortcutInfo, flags);
if (mShortcutInfo == null) {
dest.writeString(mPackageName);
- dest.writeString(mClassName);
dest.writeInt(mUser.getIdentifier());
}
+ dest.writeString(mClassName);
dest.writeInt(mRank);
}
diff --git a/core/java/android/app/prediction/AppTargetEvent.java b/core/java/android/app/prediction/AppTargetEvent.java
index 18317e1bf99d..37e41deba544 100644
--- a/core/java/android/app/prediction/AppTargetEvent.java
+++ b/core/java/android/app/prediction/AppTargetEvent.java
@@ -19,6 +19,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -30,6 +31,7 @@ import java.lang.annotation.RetentionPolicy;
* @hide
*/
@SystemApi
+@TestApi
public final class AppTargetEvent implements Parcelable {
/**
@@ -96,6 +98,16 @@ public final class AppTargetEvent implements Parcelable {
}
@Override
+ public boolean equals(Object o) {
+ if (!getClass().equals(o != null ? o.getClass() : null)) return false;
+
+ AppTargetEvent other = (AppTargetEvent) o;
+ return mTarget.equals(other.mTarget)
+ && mLocation.equals(other.mLocation)
+ && mAction == other.mAction;
+ }
+
+ @Override
public int describeContents() {
return 0;
}
@@ -126,6 +138,7 @@ public final class AppTargetEvent implements Parcelable {
* @hide
*/
@SystemApi
+ @TestApi
public static final class Builder {
private AppTarget mTarget;
private String mLocation;
diff --git a/core/java/android/app/prediction/AppTargetId.java b/core/java/android/app/prediction/AppTargetId.java
index 0b8fb47377d2..639ba78f76f5 100644
--- a/core/java/android/app/prediction/AppTargetId.java
+++ b/core/java/android/app/prediction/AppTargetId.java
@@ -17,6 +17,7 @@ package android.app.prediction;
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -25,14 +26,19 @@ import android.os.Parcelable;
* @hide
*/
@SystemApi
+@TestApi
public final class AppTargetId implements Parcelable {
@NonNull
private final String mId;
/**
+ * TODO(b/123591863): Add java docs
+ *
* @hide
*/
+ @SystemApi
+ @TestApi
public AppTargetId(@NonNull String id) {
mId = id;
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 8d14091478c3..a3021f371e19 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -971,7 +971,8 @@ public class Intent implements Parcelable, Cloneable {
*
* @param target The Intent that the user will be selecting an activity
* to perform.
- * @param title Optional title that will be displayed in the chooser.
+ * @param title Optional title that will be displayed in the chooser,
+ * only when the target action is not ACTION_SEND or ACTION_SEND_MULTIPLE.
* @return Return a new Intent object that you can hand to
* {@link Context#startActivity(Intent) Context.startActivity()} and
* related methods.
@@ -998,7 +999,8 @@ public class Intent implements Parcelable, Cloneable {
*
* @param target The Intent that the user will be selecting an activity
* to perform.
- * @param title Optional title that will be displayed in the chooser.
+ * @param title Optional title that will be displayed in the chooser,
+ * only when the target action is not ACTION_SEND or ACTION_SEND_MULTIPLE.
* @param sender Optional IntentSender to be called when a choice is made.
* @return Return a new Intent object that you can hand to
* {@link Context#startActivity(Intent) Context.startActivity()} and
@@ -1487,6 +1489,24 @@ public class Intent implements Parcelable, Cloneable {
"android.intent.action.PENDING_INCIDENT_REPORTS_CHANGED";
/**
+ * An incident report has been taken, and the user has approved it for sharing.
+ * <p>
+ * This will be sent directly to the registered receiver, which must have
+ * both the DUMP and USAGE_STATS permissions.
+ * <p>
+ * After receiving this, the application should wait until a suitable time
+ * (e.g. network available), get the list of available reports with
+ * {@link IncidentManager#getIncidentReportList IncidentManager.getIncidentReportList(String)}
+ * and then when the reports have been successfully uploaded, call
+ * {@link IncidentManager#deleteIncidentReport IncidentManager.deleteIncidentReport(Uri)}.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String ACTION_INCIDENT_REPORT_READY =
+ "android.intent.action.INCIDENT_REPORT_READY";
+
+ /**
* Activity Action: Show power usage information to the user.
* <p>Input: Nothing.
* <p>Output: Nothing.
diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl
index d1bc37791d40..50bb3c721763 100644
--- a/core/java/android/content/pm/ILauncherApps.aidl
+++ b/core/java/android/content/pm/ILauncherApps.aidl
@@ -24,6 +24,8 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.IOnAppsChangedListener;
import android.content.pm.LauncherApps;
+import android.content.pm.IPackageInstallerCallback;
+import android.content.pm.PackageInstaller;
import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
@@ -44,6 +46,9 @@ interface ILauncherApps {
String callingPackage, String packageName, in UserHandle user);
ActivityInfo resolveActivity(
String callingPackage, in ComponentName component, in UserHandle user);
+ void startSessionDetailsActivityAsUser(in IApplicationThread caller, String callingPackage,
+ in PackageInstaller.SessionInfo sessionInfo, in Rect sourceBounds, in Bundle opts,
+ in UserHandle user);
void startActivityAsUser(in IApplicationThread caller, String callingPackage,
in ComponentName component, in Rect sourceBounds,
in Bundle opts, in UserHandle user);
@@ -79,4 +84,9 @@ interface ILauncherApps {
String callingPackage, String packageName, in UserHandle user);
IntentSender getShortcutConfigActivityIntent(String callingPackage, in ComponentName component,
in UserHandle user);
+
+ // Unregister is performed using package installer
+ void registerPackageInstallerCallback(String callingPackage,
+ in IPackageInstallerCallback callback);
+ ParceledListSlice getAllSessions(String callingPackage);
}
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index 98dd9b3aa30b..b0d16cdace21 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -16,6 +16,7 @@
package android.content.pm;
+import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -32,6 +33,9 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
+import android.content.pm.PackageInstaller.SessionCallback;
+import android.content.pm.PackageInstaller.SessionCallbackDelegate;
+import android.content.pm.PackageInstaller.SessionInfo;
import android.content.pm.PackageManager.ApplicationInfoFlags;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
@@ -65,7 +69,9 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
+import java.util.concurrent.Executor;
/**
* Class for retrieving a list of launchable activities for the current user and any associated
@@ -154,8 +160,8 @@ public class LauncherApps {
private final PackageManager mPm;
private final UserManager mUserManager;
- private List<CallbackMessageHandler> mCallbacks
- = new ArrayList<CallbackMessageHandler>();
+ private final List<CallbackMessageHandler> mCallbacks = new ArrayList<>();
+ private final List<SessionCallbackDelegate> mDelegates = new ArrayList<>();
/**
* Callbacks for package changes to this and related managed profiles.
@@ -572,6 +578,24 @@ public class LauncherApps {
}
/**
+ * Starts an activity to show the details of the specified session.
+ *
+ * @param sessionInfo The SessionInfo of the session
+ * @param sourceBounds The Rect containing the source bounds of the clicked icon
+ * @param opts Options to pass to startActivity
+ */
+ public void startPackageInstallerSessionDetailsActivity(SessionInfo sessionInfo,
+ Rect sourceBounds, Bundle opts) {
+ try {
+ mService.startSessionDetailsActivityAsUser(mContext.getIApplicationThread(),
+ mContext.getPackageName(), sessionInfo, sourceBounds, opts,
+ sessionInfo.getUser());
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Starts the settings activity to show the application details for a
* package in the specified profile.
*
@@ -1131,7 +1155,7 @@ public class LauncherApps {
}
/**
- * Registers a callback for changes to packages in current and managed profiles.
+ * Registers a callback for changes to packages in this user and managed profiles.
*
* @param callback The callback to register.
*/
@@ -1140,7 +1164,7 @@ public class LauncherApps {
}
/**
- * Registers a callback for changes to packages in current and managed profiles.
+ * Registers a callback for changes to packages in this user and managed profiles.
*
* @param callback The callback to register.
* @param handler that should be used to post callbacks on, may be null.
@@ -1446,6 +1470,64 @@ public class LauncherApps {
}
/**
+ * Register a callback to watch for session lifecycle events in this user and managed profiles.
+ * @param callback The callback to register.
+ * @param executor {@link Executor} to handle the callbacks, cannot be null.
+ *
+ * @see PackageInstaller#registerSessionCallback(SessionCallback)
+ */
+ public void registerPackageInstallerSessionCallback(
+ @NonNull @CallbackExecutor Executor executor, @NonNull SessionCallback callback) {
+ if (executor == null) {
+ throw new NullPointerException("Executor must not be null");
+ }
+
+ synchronized (mDelegates) {
+ final SessionCallbackDelegate delegate = new SessionCallbackDelegate(callback,
+ executor);
+ try {
+ mService.registerPackageInstallerCallback(mContext.getPackageName(),
+ delegate);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ mDelegates.add(delegate);
+ }
+ }
+
+ /**
+ * Unregisters a callback that was previously registered.
+ *
+ * @param callback The callback to unregister.
+ * @see #registerPackageInstallerSessionCallback(Executor, SessionCallback)
+ */
+ public void unregisterPackageInstallerSessionCallback(SessionCallback callback) {
+ synchronized (mDelegates) {
+ for (Iterator<SessionCallbackDelegate> i = mDelegates.iterator(); i.hasNext();) {
+ final SessionCallbackDelegate delegate = i.next();
+ if (delegate.mCallback == callback) {
+ mPm.getPackageInstaller().unregisterSessionCallback(delegate.mCallback);
+ i.remove();
+ }
+ }
+ }
+ }
+
+ /**
+ * Return list of all known install sessions in this user and managed profiles, regardless
+ * of the installer.
+ *
+ * @see PackageInstaller#getAllSessions()
+ */
+ public @NonNull List<SessionInfo> getAllPackageInstallerSessions() {
+ try {
+ return mService.getAllSessions(mContext.getPackageName()).getList();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* A helper method to extract a {@link PinItemRequest} set to
* the {@link #EXTRA_PIN_ITEM_REQUEST} extra.
*/
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 2dc014c45fad..4f674bd378c0 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -36,20 +36,21 @@ import android.net.Uri;
import android.os.Build;
import android.os.FileBridge;
import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
+import android.os.HandlerExecutor;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.ParcelableException;
import android.os.RemoteException;
import android.os.SystemProperties;
+import android.os.UserHandle;
import android.system.ErrnoException;
import android.system.Os;
import android.util.ExceptionUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.function.pooled.PooledLambda;
import java.io.Closeable;
import java.io.IOException;
@@ -61,6 +62,7 @@ import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.concurrent.Executor;
/**
* Offers the ability to install, upgrade, and remove applications on the
@@ -659,8 +661,7 @@ public class PackageInstaller {
}
/** {@hide} */
- private static class SessionCallbackDelegate extends IPackageInstallerCallback.Stub implements
- Handler.Callback {
+ static class SessionCallbackDelegate extends IPackageInstallerCallback.Stub {
private static final int MSG_SESSION_CREATED = 1;
private static final int MSG_SESSION_BADGING_CHANGED = 2;
private static final int MSG_SESSION_ACTIVE_CHANGED = 3;
@@ -668,63 +669,41 @@ public class PackageInstaller {
private static final int MSG_SESSION_FINISHED = 5;
final SessionCallback mCallback;
- final Handler mHandler;
+ final Executor mExecutor;
- public SessionCallbackDelegate(SessionCallback callback, Looper looper) {
+ SessionCallbackDelegate(SessionCallback callback, Executor executor) {
mCallback = callback;
- mHandler = new Handler(looper, this);
- }
-
- @Override
- public boolean handleMessage(Message msg) {
- final int sessionId = msg.arg1;
- switch (msg.what) {
- case MSG_SESSION_CREATED:
- mCallback.onCreated(sessionId);
- return true;
- case MSG_SESSION_BADGING_CHANGED:
- mCallback.onBadgingChanged(sessionId);
- return true;
- case MSG_SESSION_ACTIVE_CHANGED:
- final boolean active = msg.arg2 != 0;
- mCallback.onActiveChanged(sessionId, active);
- return true;
- case MSG_SESSION_PROGRESS_CHANGED:
- mCallback.onProgressChanged(sessionId, (float) msg.obj);
- return true;
- case MSG_SESSION_FINISHED:
- mCallback.onFinished(sessionId, msg.arg2 != 0);
- return true;
- }
- return false;
+ mExecutor = executor;
}
@Override
public void onSessionCreated(int sessionId) {
- mHandler.obtainMessage(MSG_SESSION_CREATED, sessionId, 0).sendToTarget();
+ mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onCreated, mCallback,
+ sessionId).recycleOnUse());
}
@Override
public void onSessionBadgingChanged(int sessionId) {
- mHandler.obtainMessage(MSG_SESSION_BADGING_CHANGED, sessionId, 0).sendToTarget();
+ mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onBadgingChanged,
+ mCallback, sessionId).recycleOnUse());
}
@Override
public void onSessionActiveChanged(int sessionId, boolean active) {
- mHandler.obtainMessage(MSG_SESSION_ACTIVE_CHANGED, sessionId, active ? 1 : 0)
- .sendToTarget();
+ mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onActiveChanged,
+ mCallback, sessionId, active).recycleOnUse());
}
@Override
public void onSessionProgressChanged(int sessionId, float progress) {
- mHandler.obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, 0, progress)
- .sendToTarget();
+ mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onProgressChanged,
+ mCallback, sessionId, progress).recycleOnUse());
}
@Override
public void onSessionFinished(int sessionId, boolean success) {
- mHandler.obtainMessage(MSG_SESSION_FINISHED, sessionId, success ? 1 : 0)
- .sendToTarget();
+ mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onFinished,
+ mCallback, sessionId, success).recycleOnUse());
}
}
@@ -758,7 +737,7 @@ public class PackageInstaller {
public void registerSessionCallback(@NonNull SessionCallback callback, @NonNull Handler handler) {
synchronized (mDelegates) {
final SessionCallbackDelegate delegate = new SessionCallbackDelegate(callback,
- handler.getLooper());
+ new HandlerExecutor(handler));
try {
mInstaller.registerCallback(delegate, mUserId);
} catch (RemoteException e) {
@@ -1649,6 +1628,8 @@ public class PackageInstaller {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public int sessionId;
/** {@hide} */
+ public int userId;
+ /** {@hide} */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public String installerPackageName;
/** {@hide} */
@@ -1720,6 +1701,7 @@ public class PackageInstaller {
/** {@hide} */
public SessionInfo(Parcel source) {
sessionId = source.readInt();
+ userId = source.readInt();
installerPackageName = source.readString();
resolvedBaseCodePath = source.readString();
progress = source.readFloat();
@@ -1761,6 +1743,13 @@ public class PackageInstaller {
}
/**
+ * Return the user associated with this session.
+ */
+ public UserHandle getUser() {
+ return new UserHandle(userId);
+ }
+
+ /**
* Return the package name of the app that owns this session.
*/
public @Nullable String getInstallerPackageName() {
@@ -2091,6 +2080,7 @@ public class PackageInstaller {
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(sessionId);
+ dest.writeInt(userId);
dest.writeString(installerPackageName);
dest.writeString(resolvedBaseCodePath);
dest.writeFloat(progress);
diff --git a/core/java/android/content/rollback/PackageRollbackInfo.java b/core/java/android/content/rollback/PackageRollbackInfo.java
index 4644a83de462..d4ed35a9cb71 100644
--- a/core/java/android/content/rollback/PackageRollbackInfo.java
+++ b/core/java/android/content/rollback/PackageRollbackInfo.java
@@ -16,10 +16,14 @@
package android.content.rollback;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.content.pm.VersionedPackage;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.IntArray;
+
+import java.util.ArrayList;
/**
* Information about a rollback available for a particular package.
@@ -33,6 +37,38 @@ public final class PackageRollbackInfo implements Parcelable {
private final VersionedPackage mVersionRolledBackTo;
/**
+ * Encapsulates information required to restore a snapshot of an app's userdata.
+ *
+ * @hide
+ */
+ public static class RestoreInfo {
+ public final int userId;
+ public final int appId;
+ public final String seInfo;
+
+ public RestoreInfo(int userId, int appId, String seInfo) {
+ this.userId = userId;
+ this.appId = appId;
+ this.seInfo = seInfo;
+ }
+ }
+
+ /*
+ * The list of users for which we need to backup userdata for this package. Backups of
+ * credential encrypted data are listed as pending if the user hasn't unlocked their device
+ * with credentials yet.
+ */
+ // NOTE: Not a part of the Parcelable representation of this object.
+ private final IntArray mPendingBackups;
+
+ /**
+ * The list of users for which we need to restore userdata for this package. This field is
+ * non-null only after a rollback for this package has been committed.
+ */
+ // NOTE: Not a part of the Parcelable representation of this object.
+ private final ArrayList<RestoreInfo> mPendingRestores;
+
+ /**
* Returns the name of the package to roll back from.
*/
public String getPackageName() {
@@ -54,15 +90,46 @@ public final class PackageRollbackInfo implements Parcelable {
}
/** @hide */
+ public IntArray getPendingBackups() {
+ return mPendingBackups;
+ }
+
+ /** @hide */
+ public ArrayList<RestoreInfo> getPendingRestores() {
+ return mPendingRestores;
+ }
+
+ /** @hide */
+ public RestoreInfo getRestoreInfo(int userId) {
+ for (RestoreInfo ri : mPendingRestores) {
+ if (ri.userId == userId) {
+ return ri;
+ }
+ }
+
+ return null;
+ }
+
+ /** @hide */
+ public void removeRestoreInfo(RestoreInfo ri) {
+ mPendingRestores.remove(ri);
+ }
+
+ /** @hide */
public PackageRollbackInfo(VersionedPackage packageRolledBackFrom,
- VersionedPackage packageRolledBackTo) {
+ VersionedPackage packageRolledBackTo,
+ @NonNull IntArray pendingBackups, @NonNull ArrayList<RestoreInfo> pendingRestores) {
this.mVersionRolledBackFrom = packageRolledBackFrom;
this.mVersionRolledBackTo = packageRolledBackTo;
+ this.mPendingBackups = pendingBackups;
+ this.mPendingRestores = pendingRestores;
}
private PackageRollbackInfo(Parcel in) {
this.mVersionRolledBackFrom = VersionedPackage.CREATOR.createFromParcel(in);
this.mVersionRolledBackTo = VersionedPackage.CREATOR.createFromParcel(in);
+ this.mPendingRestores = null;
+ this.mPendingBackups = null;
}
@Override
diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java
index 1111b4320eb9..3fd247670a9d 100644
--- a/core/java/android/content/rollback/RollbackInfo.java
+++ b/core/java/android/content/rollback/RollbackInfo.java
@@ -83,7 +83,7 @@ public final class RollbackInfo implements Parcelable {
* Returns the session ID for the committed rollback for staged rollbacks.
* Only applicable for rollbacks that have been committed.
*/
- public int getSessionId() {
+ public int getCommittedSessionId() {
// TODO: Support rollback of staged installs.
return PackageInstaller.SessionInfo.INVALID_ID;
}
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index f9c2c3e2c983..a1b0803e0203 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -2644,10 +2644,29 @@ 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.
+ *
* @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.
*/
@NonNull
+ @Deprecated
public Builder setIdleConnectionTimeout(
@IntRange(from = 0) long idleConnectionTimeoutMs) {
Preconditions.checkArgument(idleConnectionTimeoutMs >= 0,
diff --git a/core/java/android/database/sqlite/SQLiteOpenHelper.java b/core/java/android/database/sqlite/SQLiteOpenHelper.java
index 19c6745ef8d4..ceeecbc311d8 100644
--- a/core/java/android/database/sqlite/SQLiteOpenHelper.java
+++ b/core/java/android/database/sqlite/SQLiteOpenHelper.java
@@ -263,9 +263,21 @@ 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.
+ * See the javadoc of
+ * {@link SQLiteDatabase.OpenParams.Builder#setIdleConnectionTimeout(long)}
+ * for the details.
+ *
* @param idleConnectionTimeoutMs timeout in milliseconds. Use {@link Long#MAX_VALUE} value
* to allow unlimited idle connections.
+ *
+ * @see SQLiteDatabase.OpenParams.Builder#setIdleConnectionTimeout(long)
+ *
+ * @deprecated DO NOT USE this method unless you fully understand the implication
+ * of what it does.
*/
+ @Deprecated
public void setIdleConnectionTimeout(@IntRange(from = 0) final long idleConnectionTimeoutMs) {
synchronized (this) {
if (mDatabase != null && mDatabase.isOpen()) {
diff --git a/core/java/android/net/CaptivePortal.java b/core/java/android/net/CaptivePortal.java
index 3b0126673779..3ab35e1eebf0 100644
--- a/core/java/android/net/CaptivePortal.java
+++ b/core/java/android/net/CaptivePortal.java
@@ -117,4 +117,17 @@ public class CaptivePortal implements Parcelable {
} catch (RemoteException e) {
}
}
+
+ /**
+ * Log a captive portal login event.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ public void logEvent(int eventId, String packageName) {
+ try {
+ ICaptivePortal.Stub.asInterface(mBinder).logEvent(eventId, packageName);
+ } catch (RemoteException e) {
+ }
+ }
}
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 3bae12e93745..869cf6477df0 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -1033,34 +1033,6 @@ public class ConnectivityManager {
}
}
- /**
- * Configures an always-on VPN connection through a specific application.
- * This connection is automatically granted and persisted after a reboot.
- *
- * <p>The designated package should declare a {@link VpnService} in its
- * manifest guarded by {@link android.Manifest.permission.BIND_VPN_SERVICE},
- * otherwise the call will fail.
- *
- * @param userId The identifier of the user to set an always-on VPN for.
- * @param vpnPackage The package name for an installed VPN app on the device, or {@code null}
- * to remove an existing always-on VPN configuration.
- * @param lockdownEnabled {@code true} to disallow networking when the VPN is not connected or
- * {@code false} otherwise.
- * @return {@code true} if the package is set as always-on VPN controller;
- * {@code false} otherwise.
- * @hide
- */
- @RequiresPermission(android.Manifest.permission.CONTROL_ALWAYS_ON_VPN)
- public boolean setAlwaysOnVpnPackageForUser(int userId, @Nullable String vpnPackage,
- boolean lockdownEnabled) {
- try {
- return mService.setAlwaysOnVpnPackage(
- userId, vpnPackage, lockdownEnabled, /* whitelist */ null);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
/**
* Returns the package name of the currently set always-on VPN application.
* If there is no always-on VPN set, or the VPN is provided by the system instead
@@ -2918,11 +2890,11 @@ public class ConnectivityManager {
}
}
- /** {@hide} */
+ /** {@hide} - returns the factory serial number */
@UnsupportedAppUsage
- public void registerNetworkFactory(Messenger messenger, String name) {
+ public int registerNetworkFactory(Messenger messenger, String name) {
try {
- mService.registerNetworkFactory(messenger, name);
+ return mService.registerNetworkFactory(messenger, name);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2938,6 +2910,10 @@ public class ConnectivityManager {
}
}
+ // TODO : remove this method. It is a stopgap measure to help sheperding a number
+ // of dependent changes that would conflict throughout the automerger graph. Having this
+ // temporarily helps with the process of going through with all these dependent changes across
+ // the entire tree.
/**
* @hide
* Register a NetworkAgent with ConnectivityService.
@@ -2945,8 +2921,20 @@ public class ConnectivityManager {
*/
public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
NetworkCapabilities nc, int score, NetworkMisc misc) {
+ return registerNetworkAgent(messenger, ni, lp, nc, score, misc,
+ NetworkFactory.SerialNumber.NONE);
+ }
+
+ /**
+ * @hide
+ * Register a NetworkAgent with ConnectivityService.
+ * @return NetID corresponding to NetworkAgent.
+ */
+ public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
+ NetworkCapabilities nc, int score, NetworkMisc misc, int factorySerialNumber) {
try {
- return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc);
+ return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc,
+ factorySerialNumber);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/net/DhcpResults.java b/core/java/android/net/DhcpResults.java
index 6c291c25dbdf..6f9e65fdf12c 100644
--- a/core/java/android/net/DhcpResults.java
+++ b/core/java/android/net/DhcpResults.java
@@ -17,6 +17,7 @@
package android.net;
import android.annotation.UnsupportedAppUsage;
+import android.net.shared.InetAddressUtils;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -73,19 +74,21 @@ public final class DhcpResults implements Parcelable {
public StaticIpConfiguration toStaticIpConfiguration() {
final StaticIpConfiguration s = new StaticIpConfiguration();
// All these except dnsServers are immutable, so no need to make copies.
- s.ipAddress = ipAddress;
- s.gateway = gateway;
- s.dnsServers.addAll(dnsServers);
- s.domains = domains;
+ s.setIpAddress(ipAddress);
+ s.setGateway(gateway);
+ for (InetAddress addr : dnsServers) {
+ s.addDnsServer(addr);
+ }
+ s.setDomains(domains);
return s;
}
public DhcpResults(StaticIpConfiguration source) {
if (source != null) {
- ipAddress = source.ipAddress;
- gateway = source.gateway;
- dnsServers.addAll(source.dnsServers);
- domains = source.domains;
+ ipAddress = source.getIpAddress();
+ gateway = source.getGateway();
+ dnsServers.addAll(source.getDnsServers());
+ domains = source.getDomains();
}
}
@@ -177,7 +180,7 @@ public final class DhcpResults implements Parcelable {
toStaticIpConfiguration().writeToParcel(dest, flags);
dest.writeInt(leaseDuration);
dest.writeInt(mtu);
- NetworkUtils.parcelInetAddress(dest, serverAddress, flags);
+ InetAddressUtils.parcelInetAddress(dest, serverAddress, flags);
dest.writeString(vendorInfo);
}
@@ -191,7 +194,7 @@ public final class DhcpResults implements Parcelable {
final DhcpResults dhcpResults = new DhcpResults(s);
dhcpResults.leaseDuration = in.readInt();
dhcpResults.mtu = in.readInt();
- dhcpResults.serverAddress = (Inet4Address) NetworkUtils.unparcelInetAddress(in);
+ dhcpResults.serverAddress = (Inet4Address) InetAddressUtils.unparcelInetAddress(in);
dhcpResults.vendorInfo = in.readString();
return dhcpResults;
}
@@ -200,7 +203,7 @@ public final class DhcpResults implements Parcelable {
// Not part of the superclass because they're only used by the JNI iterface to the DHCP daemon.
public boolean setIpAddress(String addrString, int prefixLength) {
try {
- Inet4Address addr = (Inet4Address) NetworkUtils.numericToInetAddress(addrString);
+ Inet4Address addr = (Inet4Address) InetAddresses.parseNumericAddress(addrString);
ipAddress = new LinkAddress(addr, prefixLength);
} catch (IllegalArgumentException|ClassCastException e) {
Log.e(TAG, "setIpAddress failed with addrString " + addrString + "/" + prefixLength);
@@ -211,7 +214,7 @@ public final class DhcpResults implements Parcelable {
public boolean setGateway(String addrString) {
try {
- gateway = NetworkUtils.numericToInetAddress(addrString);
+ gateway = InetAddresses.parseNumericAddress(addrString);
} catch (IllegalArgumentException e) {
Log.e(TAG, "setGateway failed with addrString " + addrString);
return true;
@@ -222,7 +225,7 @@ public final class DhcpResults implements Parcelable {
public boolean addDns(String addrString) {
if (TextUtils.isEmpty(addrString) == false) {
try {
- dnsServers.add(NetworkUtils.numericToInetAddress(addrString));
+ dnsServers.add(InetAddresses.parseNumericAddress(addrString));
} catch (IllegalArgumentException e) {
Log.e(TAG, "addDns failed with addrString " + addrString);
return true;
diff --git a/core/java/android/net/ICaptivePortal.aidl b/core/java/android/net/ICaptivePortal.aidl
index 56ae57dc0e8d..707b4f699873 100644
--- a/core/java/android/net/ICaptivePortal.aidl
+++ b/core/java/android/net/ICaptivePortal.aidl
@@ -22,4 +22,5 @@ package android.net;
*/
oneway interface ICaptivePortal {
void appResponse(int response);
+ void logEvent(int eventId, String packageName);
}
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index fd7360fd4c17..f88adc2c64b7 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -139,14 +139,14 @@ interface IConnectivityManager
void setAirplaneMode(boolean enable);
- void registerNetworkFactory(in Messenger messenger, in String name);
+ int registerNetworkFactory(in Messenger messenger, in String name);
boolean requestBandwidthUpdate(in Network network);
void unregisterNetworkFactory(in Messenger messenger);
int registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp,
- in NetworkCapabilities nc, int score, in NetworkMisc misc);
+ in NetworkCapabilities nc, int score, in NetworkMisc misc, in int factorySerialNumber);
NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities,
in Messenger messenger, int timeoutSec, in IBinder binder, int legacy);
diff --git a/core/java/android/net/INetworkMonitorCallbacks.aidl b/core/java/android/net/INetworkMonitorCallbacks.aidl
index 0bc25750129b..a8682f9ddd3b 100644
--- a/core/java/android/net/INetworkMonitorCallbacks.aidl
+++ b/core/java/android/net/INetworkMonitorCallbacks.aidl
@@ -26,4 +26,5 @@ oneway interface INetworkMonitorCallbacks {
void notifyPrivateDnsConfigResolved(in PrivateDnsConfigParcel config);
void showProvisioningNotification(String action);
void hideProvisioningNotification();
+ void logCaptivePortalLoginEvent(int eventId, String packageName);
} \ No newline at end of file
diff --git a/core/java/android/net/INetworkStackConnector.aidl b/core/java/android/net/INetworkStackConnector.aidl
index 8b64f1c7c45a..e052488f38c8 100644
--- a/core/java/android/net/INetworkStackConnector.aidl
+++ b/core/java/android/net/INetworkStackConnector.aidl
@@ -16,6 +16,7 @@
package android.net;
import android.net.INetworkMonitorCallbacks;
+import android.net.NetworkParcelable;
import android.net.dhcp.DhcpServingParamsParcel;
import android.net.dhcp.IDhcpServerCallbacks;
import android.net.ip.IIpClientCallbacks;
@@ -24,6 +25,7 @@ import android.net.ip.IIpClientCallbacks;
oneway interface INetworkStackConnector {
void makeDhcpServer(in String ifName, in DhcpServingParamsParcel params,
in IDhcpServerCallbacks cb);
- void makeNetworkMonitor(int netId, String name, in INetworkMonitorCallbacks cb);
+ void makeNetworkMonitor(in NetworkParcelable network, String name,
+ in INetworkMonitorCallbacks cb);
void makeIpClient(in String ifName, in IIpClientCallbacks callbacks);
} \ No newline at end of file
diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java
index 99bfc140f140..204c25f01d01 100644
--- a/core/java/android/net/NetworkAgent.java
+++ b/core/java/android/net/NetworkAgent.java
@@ -58,6 +58,7 @@ public abstract class NetworkAgent extends Handler {
private static final long BW_REFRESH_MIN_WIN_MS = 500;
private boolean mPollLceScheduled = false;
private AtomicBoolean mPollLcePending = new AtomicBoolean(false);
+ public final int mFactorySerialNumber;
private static final int BASE = Protocol.BASE_NETWORK_AGENT;
@@ -193,16 +194,31 @@ public abstract class NetworkAgent extends Handler {
*/
public static final int CMD_PREVENT_AUTOMATIC_RECONNECT = BASE + 15;
+ // TODO : remove these two constructors. They are a stopgap measure to help sheperding a number
+ // of dependent changes that would conflict throughout the automerger graph. Having these
+ // temporarily helps with the process of going through with all these dependent changes across
+ // the entire tree.
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score) {
- this(looper, context, logTag, ni, nc, lp, score, null);
+ this(looper, context, logTag, ni, nc, lp, score, null, NetworkFactory.SerialNumber.NONE);
}
-
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
+ this(looper, context, logTag, ni, nc, lp, score, misc, NetworkFactory.SerialNumber.NONE);
+ }
+
+ public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
+ NetworkCapabilities nc, LinkProperties lp, int score, int factorySerialNumber) {
+ this(looper, context, logTag, ni, nc, lp, score, null, factorySerialNumber);
+ }
+
+ public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
+ NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc,
+ int factorySerialNumber) {
super(looper);
LOG_TAG = logTag;
mContext = context;
+ mFactorySerialNumber = factorySerialNumber;
if (ni == null || nc == null || lp == null) {
throw new IllegalArgumentException();
}
@@ -211,7 +227,8 @@ public abstract class NetworkAgent extends Handler {
ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
Context.CONNECTIVITY_SERVICE);
netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni),
- new LinkProperties(lp), new NetworkCapabilities(nc), score, misc);
+ new LinkProperties(lp), new NetworkCapabilities(nc), score, misc,
+ factorySerialNumber);
}
@Override
diff --git a/core/java/android/net/NetworkFactory.java b/core/java/android/net/NetworkFactory.java
index 181cab41e928..0dfe7a495738 100644
--- a/core/java/android/net/NetworkFactory.java
+++ b/core/java/android/net/NetworkFactory.java
@@ -32,6 +32,7 @@ import com.android.internal.util.Protocol;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* A NetworkFactory is an entity that creates NetworkAgent objects.
@@ -49,6 +50,20 @@ import java.io.PrintWriter;
* @hide
**/
public class NetworkFactory extends Handler {
+ /** @hide */
+ public static class SerialNumber {
+ // Guard used by no network factory.
+ public static final int NONE = -1;
+ // A hardcoded serial number for NetworkAgents representing VPNs. These agents are
+ // not created by any factory, so they use this constant for clarity instead of NONE.
+ public static final int VPN = -2;
+ private static final AtomicInteger sNetworkFactorySerialNumber = new AtomicInteger(1);
+ /** Returns a unique serial number for a factory. */
+ public static final int nextSerialNumber() {
+ return sNetworkFactorySerialNumber.getAndIncrement();
+ }
+ }
+
private static final boolean DBG = true;
private static final boolean VDBG = false;
@@ -64,7 +79,7 @@ public class NetworkFactory extends Handler {
* disregard any that it will never be able to service, for example
* those requiring a different bearer.
* msg.obj = NetworkRequest
- * msg.arg1 = score - the score of the any network currently satisfying this
+ * msg.arg1 = score - the score of the network currently satisfying this
* request. If this bearer knows in advance it cannot
* exceed this score it should not try to connect, holding the request
* for the future.
@@ -74,6 +89,8 @@ public class NetworkFactory extends Handler {
* with the same NetworkRequest but an updated score.
* Also, network conditions may change for this bearer
* allowing for a better score in the future.
+ * msg.arg2 = the serial number of the factory currently responsible for the
+ * NetworkAgent handling this request, or SerialNumber.NONE if none.
*/
public static final int CMD_REQUEST_NETWORK = BASE;
@@ -107,6 +124,7 @@ public class NetworkFactory extends Handler {
private int mRefCount = 0;
private Messenger mMessenger = null;
+ private int mSerialNumber;
@UnsupportedAppUsage
public NetworkFactory(Looper looper, Context context, String logTag,
@@ -121,7 +139,8 @@ public class NetworkFactory extends Handler {
if (DBG) log("Registering NetworkFactory");
if (mMessenger == null) {
mMessenger = new Messenger(this);
- ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger, LOG_TAG);
+ mSerialNumber = ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger,
+ LOG_TAG);
}
}
@@ -137,7 +156,7 @@ public class NetworkFactory extends Handler {
public void handleMessage(Message msg) {
switch (msg.what) {
case CMD_REQUEST_NETWORK: {
- handleAddRequest((NetworkRequest)msg.obj, msg.arg1);
+ handleAddRequest((NetworkRequest) msg.obj, msg.arg1, msg.arg2);
break;
}
case CMD_CANCEL_REQUEST: {
@@ -159,11 +178,13 @@ public class NetworkFactory extends Handler {
public final NetworkRequest request;
public int score;
public boolean requested; // do we have a request outstanding, limited by score
+ public int factorySerialNumber;
- public NetworkRequestInfo(NetworkRequest request, int score) {
+ NetworkRequestInfo(NetworkRequest request, int score, int factorySerialNumber) {
this.request = request;
this.score = score;
this.requested = false;
+ this.factorySerialNumber = factorySerialNumber;
}
@Override
@@ -172,16 +193,51 @@ public class NetworkFactory extends Handler {
}
}
+ /**
+ * Add a NetworkRequest that the bearer may want to attempt to satisfy.
+ * @see #CMD_REQUEST_NETWORK
+ *
+ * @param request the request to handle.
+ * @param score the score of the NetworkAgent currently satisfying this request.
+ * @param servingFactorySerialNumber the serial number of the NetworkFactory that
+ * created the NetworkAgent currently satisfying this request.
+ */
+ // TODO : remove this method. It is a stopgap measure to help sheperding a number
+ // of dependent changes that would conflict throughout the automerger graph. Having this
+ // temporarily helps with the process of going through with all these dependent changes across
+ // the entire tree.
@VisibleForTesting
protected void handleAddRequest(NetworkRequest request, int score) {
+ handleAddRequest(request, score, SerialNumber.NONE);
+ }
+
+ /**
+ * Add a NetworkRequest that the bearer may want to attempt to satisfy.
+ * @see #CMD_REQUEST_NETWORK
+ *
+ * @param request the request to handle.
+ * @param score the score of the NetworkAgent currently satisfying this request.
+ * @param servingFactorySerialNumber the serial number of the NetworkFactory that
+ * created the NetworkAgent currently satisfying this request.
+ */
+ @VisibleForTesting
+ protected void handleAddRequest(NetworkRequest request, int score,
+ int servingFactorySerialNumber) {
NetworkRequestInfo n = mNetworkRequests.get(request.requestId);
if (n == null) {
- if (DBG) log("got request " + request + " with score " + score);
- n = new NetworkRequestInfo(request, score);
+ if (DBG) {
+ log("got request " + request + " with score " + score
+ + " and serial " + servingFactorySerialNumber);
+ }
+ n = new NetworkRequestInfo(request, score, servingFactorySerialNumber);
mNetworkRequests.put(n.request.requestId, n);
} else {
- if (VDBG) log("new score " + score + " for exisiting request " + request);
+ if (VDBG) {
+ log("new score " + score + " for exisiting request " + request
+ + " with serial " + servingFactorySerialNumber);
+ }
n.score = score;
+ n.factorySerialNumber = servingFactorySerialNumber;
}
if (VDBG) log(" my score=" + mScore + ", my filter=" + mCapabilityFilter);
@@ -231,16 +287,19 @@ public class NetworkFactory extends Handler {
}
private void evalRequest(NetworkRequestInfo n) {
- if (VDBG) log("evalRequest");
- if (n.requested == false && n.score < mScore &&
- n.request.networkCapabilities.satisfiedByNetworkCapabilities(
- mCapabilityFilter) && acceptRequest(n.request, n.score)) {
+ if (VDBG) {
+ log("evalRequest");
+ log(" n.requests = " + n.requested);
+ log(" n.score = " + n.score);
+ log(" mScore = " + mScore);
+ log(" n.factorySerialNumber = " + n.factorySerialNumber);
+ log(" mSerialNumber = " + mSerialNumber);
+ }
+ if (shouldNeedNetworkFor(n)) {
if (VDBG) log(" needNetworkFor");
needNetworkFor(n.request, n.score);
n.requested = true;
- } else if (n.requested == true &&
- (n.score > mScore || n.request.networkCapabilities.satisfiedByNetworkCapabilities(
- mCapabilityFilter) == false || acceptRequest(n.request, n.score) == false)) {
+ } else if (shouldReleaseNetworkFor(n)) {
if (VDBG) log(" releaseNetworkFor");
releaseNetworkFor(n.request);
n.requested = false;
@@ -249,10 +308,39 @@ public class NetworkFactory extends Handler {
}
}
+ private boolean shouldNeedNetworkFor(NetworkRequestInfo n) {
+ // If this request is already tracked, it doesn't qualify for need
+ return !n.requested
+ // If the score of this request is higher or equal to that of this factory and some
+ // other factory is responsible for it, then this factory should not track the request
+ // because it has no hope of satisfying it.
+ && (n.score < mScore || n.factorySerialNumber == mSerialNumber)
+ // If this factory can't satisfy the capability needs of this request, then it
+ // should not be tracked.
+ && n.request.networkCapabilities.satisfiedByNetworkCapabilities(mCapabilityFilter)
+ // Finally if the concrete implementation of the factory rejects the request, then
+ // don't track it.
+ && acceptRequest(n.request, n.score);
+ }
+
+ private boolean shouldReleaseNetworkFor(NetworkRequestInfo n) {
+ // Don't release a request that's not tracked.
+ return n.requested
+ // The request should be released if it can't be satisfied by this factory. That
+ // means either of the following conditions are met :
+ // - Its score is too high to be satisfied by this factory and it's not already
+ // assigned to the factory
+ // - This factory can't satisfy the capability needs of the request
+ // - The concrete implementation of the factory rejects the request
+ && ((n.score > mScore && n.factorySerialNumber != mSerialNumber)
+ || !n.request.networkCapabilities.satisfiedByNetworkCapabilities(
+ mCapabilityFilter)
+ || !acceptRequest(n.request, n.score));
+ }
+
private void evalRequests() {
for (int i = 0; i < mNetworkRequests.size(); i++) {
NetworkRequestInfo n = mNetworkRequests.valueAt(i);
-
evalRequest(n);
}
}
@@ -280,16 +368,6 @@ public class NetworkFactory extends Handler {
if (--mRefCount == 0) stopNetwork();
}
-
- public void addNetworkRequest(NetworkRequest networkRequest, int score) {
- sendMessage(obtainMessage(CMD_REQUEST_NETWORK,
- new NetworkRequestInfo(networkRequest, score)));
- }
-
- public void removeNetworkRequest(NetworkRequest networkRequest) {
- sendMessage(obtainMessage(CMD_CANCEL_REQUEST, networkRequest));
- }
-
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public void setScoreFilter(int score) {
sendMessage(obtainMessage(CMD_SET_SCORE, score, 0));
@@ -304,6 +382,10 @@ public class NetworkFactory extends Handler {
return mNetworkRequests.size();
}
+ public int getSerialNumber() {
+ return mSerialNumber;
+ }
+
protected void log(String s) {
Log.d(LOG_TAG, s);
}
@@ -321,10 +403,11 @@ public class NetworkFactory extends Handler {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder("{").append(LOG_TAG).append(" - ScoreFilter=").
- append(mScore).append(", Filter=").append(mCapabilityFilter).append(", requests=").
- append(mNetworkRequests.size()).append(", refCount=").append(mRefCount).
- append("}");
+ StringBuilder sb = new StringBuilder("{").append(LOG_TAG).append(" - mSerialNumber=")
+ .append(mSerialNumber).append(", ScoreFilter=")
+ .append(mScore).append(", Filter=").append(mCapabilityFilter).append(", requests=")
+ .append(mNetworkRequests.size()).append(", refCount=").append(mRefCount)
+ .append("}");
return sb.toString();
}
}
diff --git a/core/java/android/net/NetworkStack.java b/core/java/android/net/NetworkStack.java
index d277034650a1..ac6bff029e8c 100644
--- a/core/java/android/net/NetworkStack.java
+++ b/core/java/android/net/NetworkStack.java
@@ -104,10 +104,11 @@ public class NetworkStack {
*
* <p>The INetworkMonitor will be returned asynchronously through the provided callbacks.
*/
- public void makeNetworkMonitor(Network network, String name, INetworkMonitorCallbacks cb) {
+ public void makeNetworkMonitor(
+ NetworkParcelable network, String name, INetworkMonitorCallbacks cb) {
requestConnector(connector -> {
try {
- connector.makeNetworkMonitor(network.netId, name, cb);
+ connector.makeNetworkMonitor(network, name, cb);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java
index 39db4fef78b5..6a1720353f17 100644
--- a/core/java/android/net/NetworkUtils.java
+++ b/core/java/android/net/NetworkUtils.java
@@ -23,7 +23,6 @@ import android.annotation.NonNull;
import android.annotation.UnsupportedAppUsage;
import android.net.shared.Inet4AddressUtils;
import android.os.Build;
-import android.os.Parcel;
import android.system.ErrnoException;
import android.system.Os;
import android.util.Log;
@@ -252,32 +251,6 @@ public class NetworkUtils {
}
/**
- * Writes an InetAddress to a parcel. The address may be null. This is likely faster than
- * calling writeSerializable.
- */
- protected static void parcelInetAddress(Parcel parcel, InetAddress address, int flags) {
- byte[] addressArray = (address != null) ? address.getAddress() : null;
- parcel.writeByteArray(addressArray);
- }
-
- /**
- * Reads an InetAddress from a parcel. Returns null if the address that was written was null
- * or if the data is invalid.
- */
- protected static InetAddress unparcelInetAddress(Parcel in) {
- byte[] addressArray = in.createByteArray();
- if (addressArray == null) {
- return null;
- }
- try {
- return InetAddress.getByAddress(addressArray);
- } catch (UnknownHostException e) {
- return null;
- }
- }
-
-
- /**
* Masks a raw IP address byte array with the specified prefix length.
*/
public static void maskRawAddress(byte[] array, int prefixLength) {
diff --git a/core/java/android/net/StaticIpConfiguration.java b/core/java/android/net/StaticIpConfiguration.java
index 25bae3c57423..99cf3a99f57a 100644
--- a/core/java/android/net/StaticIpConfiguration.java
+++ b/core/java/android/net/StaticIpConfiguration.java
@@ -19,6 +19,7 @@ package android.net;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
+import android.net.shared.InetAddressUtils;
import android.os.Parcel;
import android.os.Parcelable;
@@ -232,10 +233,10 @@ public final class StaticIpConfiguration implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(ipAddress, flags);
- NetworkUtils.parcelInetAddress(dest, gateway, flags);
+ InetAddressUtils.parcelInetAddress(dest, gateway, flags);
dest.writeInt(dnsServers.size());
for (InetAddress dnsServer : dnsServers) {
- NetworkUtils.parcelInetAddress(dest, dnsServer, flags);
+ InetAddressUtils.parcelInetAddress(dest, dnsServer, flags);
}
dest.writeString(domains);
}
@@ -244,11 +245,11 @@ public final class StaticIpConfiguration implements Parcelable {
public static StaticIpConfiguration readFromParcel(Parcel in) {
final StaticIpConfiguration s = new StaticIpConfiguration();
s.ipAddress = in.readParcelable(null);
- s.gateway = NetworkUtils.unparcelInetAddress(in);
+ s.gateway = InetAddressUtils.unparcelInetAddress(in);
s.dnsServers.clear();
int size = in.readInt();
for (int i = 0; i < size; i++) {
- s.dnsServers.add(NetworkUtils.unparcelInetAddress(in));
+ s.dnsServers.add(InetAddressUtils.unparcelInetAddress(in));
}
s.domains = in.readString();
return s;
diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java
index 2a942eedcb47..3008115e063b 100644
--- a/core/java/android/net/metrics/DhcpClientEvent.java
+++ b/core/java/android/net/metrics/DhcpClientEvent.java
@@ -31,10 +31,6 @@ import android.os.Parcelable;
public final class DhcpClientEvent implements IpConnectivityLog.Event {
// Names for recording DhcpClient pseudo-state transitions.
- /** {@hide} Represents transitions from DhcpInitState to DhcpBoundState */
- public static final String INITIAL_BOUND = "InitialBoundState";
- /** {@hide} Represents transitions from and to DhcpBoundState via DhcpRenewingState */
- public static final String RENEWING_BOUND = "RenewingBoundState";
/** @hide */
public final String msg;
diff --git a/core/java/android/net/shared/FdEventsReader.java b/core/java/android/net/shared/FdEventsReader.java
index 5ccc560a3091..bffbfb115886 100644
--- a/core/java/android/net/shared/FdEventsReader.java
+++ b/core/java/android/net/shared/FdEventsReader.java
@@ -21,15 +21,15 @@ import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_INPUT;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.net.util.SocketUtils;
import android.os.Handler;
import android.os.Looper;
import android.os.MessageQueue;
import android.system.ErrnoException;
import android.system.OsConstants;
-import libcore.io.IoUtils;
-
import java.io.FileDescriptor;
+import java.io.IOException;
/**
@@ -81,7 +81,10 @@ public abstract class FdEventsReader<BufferType> {
private long mPacketsReceived;
protected static void closeFd(FileDescriptor fd) {
- IoUtils.closeQuietly(fd);
+ try {
+ SocketUtils.closeSocket(fd);
+ } catch (IOException ignored) {
+ }
}
protected FdEventsReader(@NonNull Handler h, @NonNull BufferType buffer) {
@@ -136,8 +139,8 @@ public abstract class FdEventsReader<BufferType> {
}
/**
- * Subclasses MUST create the listening socket here, including setting
- * all desired socket options, interface or address/port binding, etc.
+ * Subclasses MUST create the listening socket here, including setting all desired socket
+ * options, interface or address/port binding, etc. The socket MUST be created nonblocking.
*/
@Nullable
protected abstract FileDescriptor createFd();
@@ -181,10 +184,6 @@ public abstract class FdEventsReader<BufferType> {
try {
mFd = createFd();
- if (mFd != null) {
- // Force the socket to be non-blocking.
- IoUtils.setBlocking(mFd, false);
- }
} catch (Exception e) {
logError("Failed to create socket: ", e);
closeFd(mFd);
diff --git a/core/java/android/net/shared/InetAddressUtils.java b/core/java/android/net/shared/InetAddressUtils.java
new file mode 100644
index 000000000000..c9ee3a7cce4b
--- /dev/null
+++ b/core/java/android/net/shared/InetAddressUtils.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.shared;
+
+import android.os.Parcel;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * Collection of utilities to interact with {@link InetAddress}
+ * @hide
+ */
+public class InetAddressUtils {
+
+ /**
+ * Writes an InetAddress to a parcel. The address may be null. This is likely faster than
+ * calling writeSerializable.
+ * @hide
+ */
+ public static void parcelInetAddress(Parcel parcel, InetAddress address, int flags) {
+ byte[] addressArray = (address != null) ? address.getAddress() : null;
+ parcel.writeByteArray(addressArray);
+ }
+
+ /**
+ * Reads an InetAddress from a parcel. Returns null if the address that was written was null
+ * or if the data is invalid.
+ * @hide
+ */
+ public static InetAddress unparcelInetAddress(Parcel in) {
+ byte[] addressArray = in.createByteArray();
+ if (addressArray == null) {
+ return null;
+ }
+ try {
+ return InetAddress.getByAddress(addressArray);
+ } catch (UnknownHostException e) {
+ return null;
+ }
+ }
+
+ private InetAddressUtils() {}
+}
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index 93360a5fa377..ddec688931cb 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -34,14 +34,11 @@ import com.android.framework.protobuf.InvalidProtocolBufferException;
import dalvik.system.VMRuntime;
-import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -63,7 +60,6 @@ public class GraphicsEnvironment {
private static final boolean DEBUG = false;
private static final String TAG = "GraphicsEnvironment";
private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0";
- private static final String GAME_DRIVER_WHITELIST_FILENAME = "whitelist.txt";
private static final String ANGLE_RULES_FILE = "a4a_rules.json";
private static final String ANGLE_TEMP_RULES = "debug.angle.rules";
private static final String ACTION_ANGLE_FOR_ANDROID = "android.app.action.ANGLE_FOR_ANDROID";
@@ -553,8 +549,9 @@ public class GraphicsEnvironment {
boolean isOptIn =
getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_OPT_IN_APPS)
.contains(ai.packageName);
-
- if (!isOptIn && !onWhitelist(context, driverPackageName, ai.packageName)) {
+ if (!isOptIn
+ && !getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_WHITELIST)
+ .contains(ai.packageName)) {
if (DEBUG) {
Log.w(TAG, ai.packageName + " is not on the whitelist.");
}
@@ -647,31 +644,6 @@ public class GraphicsEnvironment {
return null;
}
- private static boolean onWhitelist(Context context, String driverPackageName,
- String applicationPackageName) {
- try {
- Context driverContext = context.createPackageContext(driverPackageName,
- Context.CONTEXT_RESTRICTED);
- AssetManager assets = driverContext.getAssets();
- InputStream stream = assets.open(GAME_DRIVER_WHITELIST_FILENAME);
- BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
- for (String packageName; (packageName = reader.readLine()) != null; ) {
- if (packageName.equals(applicationPackageName)) {
- return true;
- }
- }
- } catch (PackageManager.NameNotFoundException e) {
- if (DEBUG) {
- Log.w(TAG, "driver package '" + driverPackageName + "' not installed");
- }
- } catch (IOException e) {
- if (DEBUG) {
- Log.w(TAG, "Failed to load whitelist driver package, abort.");
- }
- }
- return false;
- }
-
private static native int getCanLoadSystemLibraries();
private static native void setLayerPaths(ClassLoader classLoader, String layerPaths);
private static native void setDebugLayers(String layers);
diff --git a/core/java/android/os/IncidentManager.java b/core/java/android/os/IncidentManager.java
index 88a578a5b6de..a1c7b08b8ba3 100644
--- a/core/java/android/os/IncidentManager.java
+++ b/core/java/android/os/IncidentManager.java
@@ -16,7 +16,9 @@
package android.os;
+import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
@@ -25,6 +27,11 @@ import android.content.Context;
import android.net.Uri;
import android.util.Slog;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
@@ -95,6 +102,33 @@ public class IncidentManager {
*/
public static final int FLAG_CONFIRMATION_DIALOG = 0x1;
+ /**
+ * Flag marking fields and incident reports than can be taken
+ * off the device only via adb.
+ */
+ public static final int PRIVACY_POLICY_LOCAL = 0;
+
+ /**
+ * Flag marking fields and incident reports than can be taken
+ * off the device with contemporary consent.
+ */
+ public static final int PRIVACY_POLICY_EXPLICIT = 100;
+
+ /**
+ * Flag marking fields and incident reports than can be taken
+ * off the device with prior consent.
+ */
+ public static final int PRIVACY_POLICY_AUTO = 200;
+
+ /** @hide */
+ @IntDef(flag = false, prefix = { "PRIVACY_POLICY_" }, value = {
+ PRIVACY_POLICY_AUTO,
+ PRIVACY_POLICY_EXPLICIT,
+ PRIVACY_POLICY_LOCAL,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface PrivacyPolicy {}
+
private final Context mContext;
private Object mLock = new Object();
@@ -203,6 +237,110 @@ public class IncidentManager {
}
/**
+ * Record of an incident report that has previously been taken.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ public static class IncidentReport implements Parcelable, Closeable {
+ private final long mTimestampMs;
+ private final int mPrivacyPolicy;
+ private ParcelFileDescriptor mFileDescriptor;
+
+ public IncidentReport(Parcel in) {
+ mTimestampMs = in.readLong();
+ mPrivacyPolicy = in.readInt();
+ if (in.readInt() != 0) {
+ mFileDescriptor = ParcelFileDescriptor.CREATOR.createFromParcel(in);
+ } else {
+ mFileDescriptor = null;
+ }
+ }
+
+ /**
+ * Close the input stream associated with this entry.
+ */
+ public void close() {
+ try {
+ if (mFileDescriptor != null) {
+ mFileDescriptor.close();
+ mFileDescriptor = null;
+ }
+ } catch (IOException e) {
+ }
+ }
+
+ /**
+ * Get the time at which this incident report was taken, in wall clock time
+ * ({@link System#uptimeMillis System.uptimeMillis()} time base).
+ */
+ public long getTimestamp() {
+ return mTimestampMs;
+ }
+
+ /**
+ * Get the privacy level to which this report has been filtered.
+ *
+ * @see #PRIVACY_POLICY_AUTO
+ * @see #PRIVACY_POLICY_EXPLICIT
+ * @see #PRIVACY_POLICY_LOCAL
+ */
+ public long getPrivacyPolicy() {
+ return mPrivacyPolicy;
+ }
+
+ /**
+ * Get the contents of this incident report.
+ */
+ public InputStream getInputStream() throws IOException {
+ if (mFileDescriptor == null) {
+ return null;
+ }
+ return new ParcelFileDescriptor.AutoCloseInputStream(mFileDescriptor);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public int describeContents() {
+ return mFileDescriptor != null ? Parcelable.CONTENTS_FILE_DESCRIPTOR : 0;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeLong(mTimestampMs);
+ out.writeInt(mPrivacyPolicy);
+ if (mFileDescriptor != null) {
+ out.writeInt(1);
+ mFileDescriptor.writeToParcel(out, flags);
+ } else {
+ out.writeInt(0);
+ }
+ }
+
+ /**
+ * {@link Parcelable.Creator Creator} for {@link IncidentReport}.
+ */
+ public static final Parcelable.Creator<IncidentReport> CREATOR = new Parcelable.Creator() {
+ /**
+ * @inheritDoc
+ */
+ public IncidentReport[] newArray(int size) {
+ return new IncidentReport[size];
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public IncidentReport createFromParcel(Parcel in) {
+ return new IncidentReport(in);
+ }
+ };
+ }
+
+ /**
* Listener for the status of an incident report being authroized or denied.
*
* @see #requestAuthorization
@@ -242,7 +380,7 @@ public class IncidentManager {
}
/**
- * Take an incident report and put it in dropbox.
+ * Take an incident report.
*/
@RequiresPermission(allOf = {
android.Manifest.permission.DUMP,
@@ -325,6 +463,52 @@ public class IncidentManager {
}
}
+ /**
+ * Get the incident reports that are available for upload for the supplied
+ * broadcast recevier.
+ *
+ * @param receiverClass Class name of broadcast receiver in this package that
+ * was registered to retrieve reports.
+ *
+ * @return A list of {@link Uri Uris} that are awaiting upload.
+ */
+ @RequiresPermission(allOf = {
+ android.Manifest.permission.DUMP,
+ android.Manifest.permission.PACKAGE_USAGE_STATS
+ })
+ public @NonNull List<Uri> getIncidentReportList(String receiverClass) {
+ throw new RuntimeException("implement me");
+ }
+
+ /**
+ * Get the incident report with the given URI id.
+ *
+ * @param uri Identifier of the incident report.
+ *
+ * @return an IncidentReport object, or null if the incident report has been
+ * expired from disk.
+ */
+ @RequiresPermission(allOf = {
+ android.Manifest.permission.DUMP,
+ android.Manifest.permission.PACKAGE_USAGE_STATS
+ })
+ public @Nullable IncidentReport getIncidentReport(Uri uri) {
+ throw new RuntimeException("implement me");
+ }
+
+ /**
+ * Delete the incident report with the given URI id.
+ *
+ * @param uri Identifier of the incident report.
+ */
+ @RequiresPermission(allOf = {
+ android.Manifest.permission.DUMP,
+ android.Manifest.permission.PACKAGE_USAGE_STATS
+ })
+ public void deleteIncidentReports(Uri uri) {
+ throw new RuntimeException("implement me");
+ }
+
private void reportIncidentInternal(IncidentReportArgs args) {
try {
final IIncidentManager service = getIIncidentManagerLocked();
diff --git a/core/java/android/os/IncidentReportArgs.java b/core/java/android/os/IncidentReportArgs.java
index 3ca7f77b90d7..8d4472702206 100644
--- a/core/java/android/os/IncidentReportArgs.java
+++ b/core/java/android/os/IncidentReportArgs.java
@@ -32,19 +32,16 @@ import java.util.ArrayList;
@TestApi
public final class IncidentReportArgs implements Parcelable {
- private static final int DEST_EXPLICIT = 100;
- private static final int DEST_AUTO = 200;
-
private final IntArray mSections = new IntArray();
private final ArrayList<byte[]> mHeaders = new ArrayList<byte[]>();
private boolean mAll;
- private int mDest;
+ private int mPrivacyPolicy;
/**
* Construct an incident report args with no fields.
*/
public IncidentReportArgs() {
- mDest = DEST_AUTO;
+ mPrivacyPolicy = IncidentManager.PRIVACY_POLICY_AUTO;
}
/**
@@ -75,7 +72,7 @@ public final class IncidentReportArgs implements Parcelable {
out.writeByteArray(mHeaders.get(i));
}
- out.writeInt(mDest);
+ out.writeInt(mPrivacyPolicy);
}
public void readFromParcel(Parcel in) {
@@ -93,7 +90,7 @@ public final class IncidentReportArgs implements Parcelable {
mHeaders.add(in.createByteArray());
}
- mDest = in.readInt();
+ mPrivacyPolicy = in.readInt();
}
public static final Parcelable.Creator<IncidentReportArgs> CREATOR
@@ -128,7 +125,7 @@ public final class IncidentReportArgs implements Parcelable {
sb.append(", ");
sb.append(mHeaders.size());
sb.append(" headers), ");
- sb.append("Dest enum value: ").append(mDest);
+ sb.append("privacy: ").append(mPrivacyPolicy);
return sb.toString();
}
@@ -145,14 +142,15 @@ public final class IncidentReportArgs implements Parcelable {
/**
* Set this incident report privacy policy spec.
*/
- public void setPrivacyPolicy(int dest) {
- switch (dest) {
- case DEST_EXPLICIT:
- case DEST_AUTO:
- mDest = dest;
+ public void setPrivacyPolicy(int privacyPolicy) {
+ switch (privacyPolicy) {
+ case IncidentManager.PRIVACY_POLICY_LOCAL:
+ case IncidentManager.PRIVACY_POLICY_EXPLICIT:
+ case IncidentManager.PRIVACY_POLICY_AUTO:
+ mPrivacyPolicy = privacyPolicy;
break;
default:
- mDest = DEST_AUTO;
+ mPrivacyPolicy = IncidentManager.PRIVACY_POLICY_AUTO;
}
}
diff --git a/core/java/android/os/OWNERS b/core/java/android/os/OWNERS
new file mode 100644
index 000000000000..b568f157c01d
--- /dev/null
+++ b/core/java/android/os/OWNERS
@@ -0,0 +1,2 @@
+# Zygote
+per-file ZygoteProcess.java = chriswailes@google.com, ngeoffray@google.com, sehr@google.com, narayan@google.com, maco@google.com
diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java
index 8a52f1f0eec0..3e5bd4b72513 100644
--- a/core/java/android/provider/CalendarContract.java
+++ b/core/java/android/provider/CalendarContract.java
@@ -138,8 +138,8 @@ public final class CalendarContract {
* Action used to help apps show calendar events in the managed profile.
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
- public static final String ACTION_VIEW_WORK_CALENDAR_EVENT =
- "android.provider.calendar.action.VIEW_WORK_CALENDAR_EVENT";
+ public static final String ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT =
+ "android.provider.calendar.action.VIEW_MANAGED_PROFILE_CALENDAR_EVENT";
/**
* Intent Extras key: {@link EventsColumns#CUSTOM_APP_URI} for the event in
@@ -166,7 +166,7 @@ public final class CalendarContract {
public static final String EXTRA_EVENT_ALL_DAY = "allDay";
/**
- * Intent Extras key: The id of an event.
+ * Intent Extras key: An extra of type {@code long} holding the id of an event.
*/
public static final String EXTRA_EVENT_ID = "id";
@@ -218,7 +218,7 @@ public final class CalendarContract {
* When this API is called, the system will attempt to start an activity
* in the managed profile with an intent targeting the same caller package.
* The intent will have its action set to
- * {@link CalendarContract#ACTION_VIEW_WORK_CALENDAR_EVENT} and contain extras
+ * {@link CalendarContract#ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT} and contain extras
* corresponding to the API's arguments. A calendar app intending to support
* cross-profile events viewing should handle this intent, parse the arguments
* and show the appropriate UI.
@@ -226,10 +226,10 @@ public final class CalendarContract {
* @param context the context.
* @param eventId the id of the event to be viewed. Will be put into {@link #EXTRA_EVENT_ID}
* field of the intent.
- * @param start the start time of the event. Will be put into {@link #EXTRA_EVENT_BEGIN_TIME}
- * field of the intent.
- * @param end the end time of the event. Will be put into {@link #EXTRA_EVENT_END_TIME} field
- * of the intent.
+ * @param startMs the start time of the event in milliseconds since epoch.
+ * Will be put into {@link #EXTRA_EVENT_BEGIN_TIME} field of the intent.
+ * @param endMs the end time of the event in milliseconds since epoch.
+ * Will be put into {@link #EXTRA_EVENT_END_TIME} field of the intent.
* @param allDay if the event is an all-day event. Will be put into
* {@link #EXTRA_EVENT_ALL_DAY} field of the intent.
* @param flags flags to be set on the intent via {@link Intent#setFlags}
@@ -241,12 +241,12 @@ public final class CalendarContract {
* @see #EXTRA_EVENT_ALL_DAY
*/
public static boolean startViewCalendarEventInManagedProfile(@NonNull Context context,
- long eventId, long start, long end, boolean allDay, int flags) {
+ long eventId, long startMs, long endMs, boolean allDay, int flags) {
Preconditions.checkNotNull(context, "Context is null");
final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
Context.DEVICE_POLICY_SERVICE);
- return dpm.startViewCalendarEventInManagedProfile(eventId, start,
- end, allDay, flags);
+ return dpm.startViewCalendarEventInManagedProfile(eventId, startMs,
+ endMs, allDay, flags);
}
/**
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index 0b23fe3e9168..92650e114a66 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -160,6 +160,18 @@ public final class DeviceConfig {
}
/**
+ * 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";
+ }
+
+ /**
* Namespace for attention-based features provided by on-device machine intelligence.
*
* @hide
@@ -169,10 +181,10 @@ public final class DeviceConfig {
String NAMESPACE = "intelligence_attention";
/** If {@code true}, enables the attention features. */
- String PROPERTY_ATTENTION_ENABLED = "attention_enabled";
+ String ATTENTION_ENABLED = "attention_enabled";
/** Settings for the attention features. */
- String PROPERTY_ATTENTION_SETTINGS = "attention_settings";
+ String ATTENTION_SETTINGS = "attention_settings";
}
/**
@@ -191,12 +203,12 @@ public final class DeviceConfig {
* @hide
*/
@SystemApi
- String PROPERTY_PERMISSIONS_HUB_ENABLED = "enable_permissions_hub";
+ String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled";
/**
* Whether to show location access check notifications.
*/
- String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "enable_location_access_check";
+ String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "location_access_check_enabled";
}
/**
@@ -208,26 +220,29 @@ public final class DeviceConfig {
public interface Telephony {
String NAMESPACE = "telephony";
/**
+ * Ringer ramping time in milliseconds.
+ */
+ String RAMPING_RINGER_DURATION = "ramping_ringer_duration";
+ /**
* Whether to apply ramping ringer on incoming phone calls.
*/
- String PROPERTY_ENABLE_RAMPING_RINGER = "enable_ramping_ringer";
+ String RAMPING_RINGER_ENABLED = "ramping_ringer_enabled";
/**
- * Ringer ramping time in milliseconds.
+ * Vibration time in milliseconds before ramping ringer starts.
*/
- String PROPERTY_RAMPING_RINGER_DURATION = "ramping_duration";
+ String RAMPING_RINGER_VIBRATION_DURATION = "ramping_ringer_vibration_duration";
}
/**
- * Namespace for Full Stack Integrity to run privileged apps only in JIT mode. The flag applies
- * at process start, so reboot is a way to bring the device to a clean state.
+ * Namespace for how dex runs. The feature may requires reboot to a clean state.
*
* @hide
*/
@SystemApi
- public interface FsiBoot {
- String NAMESPACE = "fsi_boot";
- String OOB_ENABLED = "oob_enabled";
- String OOB_WHITELIST = "oob_whitelist";
+ public interface DexBoot {
+ String NAMESPACE = "dex_boot";
+ String PRIV_APPS_OOB_ENABLED = "priv_apps_oob_enabled";
+ String PRIV_APPS_OOB_WHITELIST = "priv_apps_oob_whitelist";
}
/**
@@ -250,6 +265,7 @@ public final class DeviceConfig {
String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
+ String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate";
/**
* Maximum number of cached processes. See
@@ -268,10 +284,10 @@ public final class DeviceConfig {
String NAMESPACE = "attention_manager_service";
/** If {@code true}, enables {@link AttentionManagerService} features. */
- String PROPERTY_SERVICE_ENABLED = "service_enabled";
+ String SERVICE_ENABLED = "service_enabled";
/** Allows a CTS to inject a fake implementation. */
- String PROPERTY_COMPONENT_NAME = "component_name";
+ String COMPONENT_NAME = "component_name";
}
/**
diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java
index 63bbb9c0bc12..89d1c447a709 100644
--- a/core/java/android/provider/Downloads.java
+++ b/core/java/android/provider/Downloads.java
@@ -419,12 +419,20 @@ public final class Downloads {
/**
* The column that is used to remember whether the media scanner was invoked.
- * It can take the values: null or 0(not scanned), 1(scanned), 2 (not scannable).
+ * It can take the values: {@link #MEDIA_NOT_SCANNED}, {@link #MEDIA_SCANNED} or
+ * {@link #MEDIA_NOT_SCANNABLE} or {@code null}. If it's value is {@code null}, it will be
+ * treated as {@link #MEDIA_NOT_SCANNED}.
+ *
* <P>Type: TEXT</P>
*/
@UnsupportedAppUsage
public static final String COLUMN_MEDIA_SCANNED = "scanned";
+ /** Possible values for column {@link #COLUMN_MEDIA_SCANNED} */
+ public static final int MEDIA_NOT_SCANNED = 0;
+ public static final int MEDIA_SCANNED = 1;
+ public static final int MEDIA_NOT_SCANNABLE = 2;
+
/**
* The column with errorMsg for a failed downloaded.
* Used only for debugging purposes.
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 124c50a3393e..0743c23080fd 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -641,6 +641,8 @@ public final class MediaStore {
* location. For example, when this value is left undefined, pending
* {@link MediaStore.Audio.Media} items are stored under
* {@link Environment#DIRECTORY_MUSIC}.
+ *
+ * @see MediaColumns#PRIMARY_DIRECTORY
*/
public void setPrimaryDirectory(@Nullable String primaryDirectory) {
this.primaryDirectory = primaryDirectory;
@@ -652,6 +654,8 @@ public final class MediaStore {
* <p>
* You may leave this value undefined to store the media as a direct
* descendant of the {@link #setPrimaryDirectory(String)} location.
+ *
+ * @see MediaColumns#SECONDARY_DIRECTORY
*/
public void setSecondaryDirectory(@Nullable String secondaryDirectory) {
this.secondaryDirectory = secondaryDirectory;
@@ -980,6 +984,26 @@ public final class MediaStore {
* Type: TEXT
*/
public static final String OWNER_PACKAGE_NAME = "owner_package_name";
+
+ /**
+ * The primary directory name this media exists under. The value may be
+ * {@code NULL} if the media doesn't have a primary directory name.
+ * <p>
+ * Type: TEXT
+ *
+ * @see PendingParams#setPrimaryDirectory(String)
+ */
+ public static final String PRIMARY_DIRECTORY = "primary_directory";
+
+ /**
+ * The secondary directory name this media exists under. The value may
+ * be {@code NULL} if the media doesn't have a secondary directory name.
+ * <p>
+ * Type: TEXT
+ *
+ * @see PendingParams#setSecondaryDirectory(String)
+ */
+ public static final String SECONDARY_DIRECTORY = "secondary_directory";
}
/**
@@ -1428,13 +1452,20 @@ public final class MediaStore {
public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
/**
- * The secondary bucket ID of this media item. This can be useful to
- * present the user a second-level clustering of related media
- * items. This is a read-only column that is automatically computed.
+ * The group ID of this media item. This can be useful to present
+ * the user a grouping of related media items, such a burst of
+ * images, or a {@code JPG} and {@code DNG} version of the same
+ * image.
+ * <p>
+ * This is a read-only column that is automatically computed based
+ * on the first portion of the filename. For example,
+ * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG}
+ * will have the same {@link #GROUP_ID} because the first portion of
+ * their filenames is identical.
* <p>
* Type: INTEGER
*/
- public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
+ public static final String GROUP_ID = "group_id";
}
public static final class Media implements ImageColumns {
@@ -2697,13 +2728,20 @@ public final class MediaStore {
public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
/**
- * The secondary bucket ID of this media item. This can be useful to
- * present the user a second-level clustering of related media
- * items. This is a read-only column that is automatically computed.
+ * The group ID of this media item. This can be useful to present
+ * the user a grouping of related media items, such a burst of
+ * images, or a {@code JPG} and {@code DNG} version of the same
+ * image.
+ * <p>
+ * This is a read-only column that is automatically computed based
+ * on the first portion of the filename. For example,
+ * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG}
+ * will have the same {@link #GROUP_ID} because the first portion of
+ * their filenames is identical.
* <p>
* Type: INTEGER
*/
- public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
+ public static final String GROUP_ID = "group_id";
/**
* The bookmark for the video. Time in ms. Represents the location in the video that the
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 794c2f1b991b..afa21100f022 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5874,30 +5874,24 @@ public final class Settings {
"unknown_sources_default_reversed";
/**
- * Comma-separated list of location providers that activities may access. Do not rely on
- * this value being present in settings.db or on ContentObserver notifications on the
+ * Comma-separated list of location providers that are accessible. Do not rely on
+ * this value being present or correct, or on ContentObserver notifications on the
* corresponding Uri.
*
- * @deprecated Providers should not be controlled individually. See {@link #LOCATION_MODE}
- * documentation for information on reading/writing location information.
+ * @deprecated The preferred methods for checking provider status and listening for changes
+ * are via {@link LocationManager#isProviderEnabled(String)} and
+ * {@link LocationManager#PROVIDERS_CHANGED_ACTION}.
*/
@Deprecated
public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
/**
- * The degree of location access enabled by the user.
- * <p>
- * When used with {@link #putInt(ContentResolver, String, int)}, must be one of {@link
- * #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY}, {@link
- * #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. When used with {@link
- * #getInt(ContentResolver, String)}, the caller must gracefully handle additional location
- * modes that might be added in the future.
- * <p>
- * Note: do not rely on this value being present in settings.db or on ContentObserver
- * notifications for the corresponding Uri. Use {@link LocationManager#MODE_CHANGED_ACTION}
- * to receive changes in this value.
+ * The current location mode of the device. Do not rely on this value being present or on
+ * ContentObserver notifications on the corresponding Uri.
*
- * @deprecated To check location mode, use {@link LocationManager#isLocationEnabled()}.
+ * @deprecated The preferred methods for checking location mode and listening for changes
+ * are via {@link LocationManager#isLocationEnabled()} and
+ * {@link LocationManager#MODE_CHANGED_ACTION}.
*/
@Deprecated
public static final String LOCATION_MODE = "location_mode";
@@ -5924,7 +5918,7 @@ public final class Settings {
public static final int LOCATION_CHANGER_QUICK_SETTINGS = 2;
/**
- * Location access disabled.
+ * Location mode is off.
*
* @deprecated See {@link #LOCATION_MODE}.
*/
@@ -5932,34 +5926,41 @@ public final class Settings {
public static final int LOCATION_MODE_OFF = 0;
/**
- * Network Location Provider disabled, but GPS and other sensors enabled.
+ * This mode no longer has any distinct meaning, but is interpreted as the location mode is
+ * on.
*
- * @deprecated To check location status, use {@link LocationManager#isLocationEnabled()}. To
- * get the status of a location provider, use
- * {@link LocationManager#isProviderEnabled(String)}.
+ * @deprecated See {@link #LOCATION_MODE_ON}.
*/
@Deprecated
public static final int LOCATION_MODE_SENSORS_ONLY = 1;
/**
- * Reduced power usage, such as limiting the number of GPS updates per hour. Requests
- * with {@link android.location.Criteria#POWER_HIGH} may be downgraded to
- * {@link android.location.Criteria#POWER_MEDIUM}.
+ * This mode no longer has any distinct meaning, but is interpreted as the location mode is
+ * on.
*
- * @deprecated See {@link #LOCATION_MODE}.
+ * @deprecated See {@link #LOCATION_MODE_ON}.
*/
@Deprecated
public static final int LOCATION_MODE_BATTERY_SAVING = 2;
/**
- * Best-effort location computation allowed.
+ * This mode no longer has any distinct meaning, but is interpreted as the location mode is
+ * on.
*
- * @deprecated See {@link #LOCATION_MODE}.
+ * @deprecated See {@link #LOCATION_MODE_ON}.
*/
@Deprecated
public static final int LOCATION_MODE_HIGH_ACCURACY = 3;
/**
+ * Location mode is on.
+ *
+ * @deprecated See {@link #LOCATION_MODE}.
+ */
+ @Deprecated
+ public static final int LOCATION_MODE_ON = LOCATION_MODE_HIGH_ACCURACY;
+
+ /**
* A flag containing settings used for biometric weak
* @hide
*/
@@ -10521,8 +10522,10 @@ public final class Settings {
/**
* Setting to enable connected MAC randomization in Wi-Fi; disabled by default, and
* setting to 1 will enable it. In the future, additional values may be supported.
+ * @deprecated MAC randomization is now a per-network setting
* @hide
*/
+ @Deprecated
public static final String WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED =
"wifi_connected_mac_randomization_enabled";
@@ -10598,6 +10601,18 @@ public final class Settings {
private static final Validator WIFI_PNO_RECENCY_SORTING_ENABLED_VALIDATOR =
BOOLEAN_VALIDATOR;
+ /**
+ * Setting to enable the Wi-Fi link probing.
+ * Disabled by default, and setting it to 1 will enable it.
+ * The value is boolean (0 or 1).
+ * @hide
+ */
+ public static final String WIFI_LINK_PROBING_ENABLED =
+ "wifi_link_probing_enabled";
+
+ private static final Validator WIFI_LINK_PROBING_ENABLED_VALIDATOR =
+ BOOLEAN_VALIDATOR;
+
/**
* The maximum number of times we will retry a connection to an access
* point for which we have failed in acquiring an IP address from DHCP.
@@ -13391,6 +13406,7 @@ public final class Settings {
WIFI_PNO_FREQUENCY_CULLING_ENABLED_VALIDATOR);
VALIDATORS.put(WIFI_PNO_RECENCY_SORTING_ENABLED,
WIFI_PNO_RECENCY_SORTING_ENABLED_VALIDATOR);
+ VALIDATORS.put(WIFI_LINK_PROBING_ENABLED, WIFI_LINK_PROBING_ENABLED_VALIDATOR);
}
/**
diff --git a/core/java/android/service/appprediction/AppPredictionService.java b/core/java/android/service/appprediction/AppPredictionService.java
index b77405affaec..d0128514d3e7 100644
--- a/core/java/android/service/appprediction/AppPredictionService.java
+++ b/core/java/android/service/appprediction/AppPredictionService.java
@@ -21,6 +21,7 @@ import android.annotation.CallSuper;
import android.annotation.MainThread;
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.app.Service;
import android.app.prediction.AppPredictionContext;
import android.app.prediction.AppPredictionSessionId;
@@ -49,6 +50,7 @@ import java.util.function.Consumer;
* @hide
*/
@SystemApi
+@TestApi
public abstract class AppPredictionService extends Service {
private static final String TAG = "AppPredictionService";
@@ -140,6 +142,7 @@ public abstract class AppPredictionService extends Service {
@Override
public final IBinder onBind(Intent intent) {
+ // TODO(b/111701043): Verify that the action is valid
return mInterface.asBinder();
}
@@ -228,6 +231,7 @@ public abstract class AppPredictionService extends Service {
public void onStopPredictionUpdates() {}
private void doRequestPredictionUpdate(@NonNull AppPredictionSessionId sessionId) {
+ // Just an optimization, if there are no callbacks, then don't bother notifying the service
final ArrayList<CallbackWrapper> callbacks = mSessionCallbacks.get(sessionId);
if (callbacks != null && !callbacks.isEmpty()) {
onRequestPredictionUpdate(sessionId);
diff --git a/core/java/android/service/attention/AttentionService.java b/core/java/android/service/attention/AttentionService.java
index f6e448dc4757..24d74ffd747d 100644
--- a/core/java/android/service/attention/AttentionService.java
+++ b/core/java/android/service/attention/AttentionService.java
@@ -64,10 +64,10 @@ public abstract class AttentionService extends Service {
/** Attention is present. */
public static final int ATTENTION_SUCCESS_PRESENT = 1;
- /** Preempted by other camera user. */
+ /** Preempted by other client. */
public static final int ATTENTION_FAILURE_PREEMPTED = 2;
- /** Preempted by other camera user. */
+ /** Request timed out. */
public static final int ATTENTION_FAILURE_TIMED_OUT = 3;
/** Unknown reasons for failing to determine the attention. */
diff --git a/core/java/android/service/dreams/OWNERS b/core/java/android/service/dreams/OWNERS
index 3c9bbf8797ea..426f002ad236 100644
--- a/core/java/android/service/dreams/OWNERS
+++ b/core/java/android/service/dreams/OWNERS
@@ -1,3 +1,3 @@
-dsandler@google.com
+dsandler@android.com
michaelwr@google.com
roosa@google.com
diff --git a/core/java/android/service/notification/INotificationListener.aidl b/core/java/android/service/notification/INotificationListener.aidl
index 1ddc099efa49..22104b5089cf 100644
--- a/core/java/android/service/notification/INotificationListener.aidl
+++ b/core/java/android/service/notification/INotificationListener.aidl
@@ -33,6 +33,7 @@ oneway interface INotificationListener
void onListenerConnected(in NotificationRankingUpdate update);
void onNotificationPosted(in IStatusBarNotificationHolder notificationHolder,
in NotificationRankingUpdate update);
+ void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons);
// stats only for assistant
void onNotificationRemoved(in IStatusBarNotificationHolder notificationHolder,
in NotificationRankingUpdate update, in NotificationStats stats, int reason);
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index c734b630759b..d4e887970a47 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -469,6 +469,17 @@ public abstract class NotificationListenerService extends Service {
}
/**
+ * Implement this method to be notified when the behavior of silent notifications in the status
+ * bar changes. See {@link NotificationManager#shouldHideSilentStatusBarIcons()}.
+ *
+ * @param hideSilentStatusIcons whether or not status bar icons should be hidden for silent
+ * notifications
+ */
+ public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+ // optional
+ }
+
+ /**
* Implement this method to learn about notification channel modifications.
*
* <p>The caller must have {@link CompanionDeviceManager#getAssociations() an associated
@@ -1411,6 +1422,12 @@ public abstract class NotificationListenerService extends Service {
mHandler.obtainMessage(
MyHandler.MSG_ON_NOTIFICATION_CHANNEL_GROUP_MODIFIED, args).sendToTarget();
}
+
+ @Override
+ public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+ mHandler.obtainMessage(MyHandler.MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED,
+ hideSilentStatusIcons).sendToTarget();
+ }
}
/**
@@ -2142,6 +2159,7 @@ public abstract class NotificationListenerService extends Service {
public static final int MSG_ON_INTERRUPTION_FILTER_CHANGED = 6;
public static final int MSG_ON_NOTIFICATION_CHANNEL_MODIFIED = 7;
public static final int MSG_ON_NOTIFICATION_CHANNEL_GROUP_MODIFIED = 8;
+ public static final int MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED = 9;
public MyHandler(Looper looper) {
super(looper, null, false);
@@ -2207,6 +2225,10 @@ public abstract class NotificationListenerService extends Service {
int modificationType = (int) args.arg4;
onNotificationChannelGroupModified(pkgName, user, group, modificationType);
} break;
+
+ case MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED: {
+ onStatusBarIconsBehaviorChanged((Boolean) msg.obj);
+ } break;
}
}
}
diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java
index 2789651c4eaf..e76e0966b817 100644
--- a/core/java/android/service/voice/VoiceInteractionService.java
+++ b/core/java/android/service/voice/VoiceInteractionService.java
@@ -16,7 +16,6 @@
package android.service.voice;
-import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
@@ -41,8 +40,6 @@ import com.android.internal.util.function.pooled.PooledLambda;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@@ -80,33 +77,6 @@ public class VoiceInteractionService extends Service {
*/
public static final String SERVICE_META_DATA = "android.voice_interaction";
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(prefix = {"VOICE_STATE_"}, value = {
- VOICE_STATE_NONE,
- VOICE_STATE_CONDITIONAL_LISTENING,
- VOICE_STATE_LISTENING,
- VOICE_STATE_FULFILLING})
- public @interface VoiceState {
- }
-
- /**
- * Voice assistant inactive.
- */
- public static final int VOICE_STATE_NONE = 0;
- /**
- * Voice assistant listening, but will only trigger if it hears a request it can fulfill.
- */
- public static final int VOICE_STATE_CONDITIONAL_LISTENING = 1;
- /**
- * Voice assistant is listening to user speech.
- */
- public static final int VOICE_STATE_LISTENING = 2;
- /**
- * Voice assistant is fulfilling an action requested by the user.
- */
- public static final int VOICE_STATE_FULFILLING = 3;
-
IVoiceInteractionService mInterface = new IVoiceInteractionService.Stub() {
@Override
public void ready() {
@@ -376,7 +346,7 @@ public class VoiceInteractionService extends Service {
*
* @param state value indicating whether the assistant is listening, fulfilling, etc.
*/
- public final void setVoiceState(@VoiceState int state) {
+ public final void setVoiceState(int state) {
try {
mSystemService.setVoiceState(state);
} catch (RemoteException e) {
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index db9351b030df..2e8b7f021ff6 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -57,6 +57,7 @@ public class FeatureFlagUtils {
DEFAULT_FLAGS.put("settings_wifi_dpp", "true");
DEFAULT_FLAGS.put("settings_wifi_mac_randomization", "true");
DEFAULT_FLAGS.put("settings_wifi_sharing", "true");
+ DEFAULT_FLAGS.put("settings_mainline_module", "false");
DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false");
DEFAULT_FLAGS.put(SAFETY_HUB, "false");
DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false");
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java
index eb41e078e59f..59e562fe8071 100644
--- a/core/java/android/view/AccessibilityInteractionController.java
+++ b/core/java/android/view/AccessibilityInteractionController.java
@@ -41,12 +41,14 @@ import android.view.View.AttachInfo;
import android.view.accessibility.AccessibilityInteractionClient;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.accessibility.AccessibilityNodeProvider;
import android.view.accessibility.AccessibilityRequestPreparer;
import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
import java.util.ArrayList;
@@ -64,8 +66,11 @@ import java.util.function.Predicate;
* called from the interaction connection ViewAncestor gives the system to
* talk to it and a corresponding *UiThread method that is executed on the
* UI thread.
+ *
+ * @hide
*/
-final class AccessibilityInteractionController {
+@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+public final class AccessibilityInteractionController {
private static final String LOG_TAG = "AccessibilityInteractionController";
@@ -85,7 +90,7 @@ final class AccessibilityInteractionController {
private final Object mLock = new Object();
- private final Handler mHandler;
+ private final PrivateHandler mHandler;
private final ViewRootImpl mViewRootImpl;
@@ -131,11 +136,19 @@ final class AccessibilityInteractionController {
// thread in this process, set the message as a static reference so
// after this call completes the same thread but in the interrogating
// client can handle the message to generate the result.
- if (interrogatingPid == mMyProcessId && interrogatingTid == mMyLooperThreadId) {
+ if (interrogatingPid == mMyProcessId && interrogatingTid == mMyLooperThreadId
+ && mHandler.hasAccessibilityCallback(message)) {
AccessibilityInteractionClient.getInstanceForThread(
interrogatingTid).setSameThreadMessage(message);
} else {
- mHandler.sendMessage(message);
+ // For messages without callback of interrogating client, just handle the
+ // message immediately if this is UI thread.
+ if (!mHandler.hasAccessibilityCallback(message)
+ && Thread.currentThread().getId() == mMyLooperThreadId) {
+ mHandler.handleMessage(message);
+ } else {
+ mHandler.sendMessage(message);
+ }
}
}
}
@@ -731,6 +744,52 @@ final class AccessibilityInteractionController {
}
}
+ /**
+ * Finds the accessibility focused node in the root, and clears the accessibility focus.
+ */
+ public void clearAccessibilityFocusClientThread() {
+ final Message message = mHandler.obtainMessage();
+ message.what = PrivateHandler.MSG_CLEAR_ACCESSIBILITY_FOCUS;
+
+ // Don't care about pid and tid because there's no interrogating client for this message.
+ scheduleMessage(message, 0, 0, CONSIDER_REQUEST_PREPARERS);
+ }
+
+ private void clearAccessibilityFocusUiThread() {
+ if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
+ return;
+ }
+ try {
+ mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags =
+ AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
+ final View root = mViewRootImpl.mView;
+ if (root != null && isShown(root)) {
+ final View host = mViewRootImpl.mAccessibilityFocusedHost;
+ // If there is no accessibility focus host or it is not a descendant
+ // of the root from which to start the search, then the search failed.
+ if (host == null || !ViewRootImpl.isViewDescendantOf(host, root)) {
+ return;
+ }
+ final AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider();
+ final AccessibilityNodeInfo focusNode =
+ mViewRootImpl.mAccessibilityFocusedVirtualView;
+ if (provider != null && focusNode != null) {
+ final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId(
+ focusNode.getSourceNodeId());
+ provider.performAction(virtualNodeId,
+ AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS.getId(),
+ null);
+ } else {
+ host.performAccessibilityAction(
+ AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS.getId(),
+ null);
+ }
+ }
+ } finally {
+ mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
+ }
+ }
+
private View findViewByAccessibilityId(int accessibilityId) {
View root = mViewRootImpl.mView;
if (root == null) {
@@ -1294,6 +1353,12 @@ final class AccessibilityInteractionController {
private static final int MSG_APP_PREPARATION_FINISHED = 8;
private static final int MSG_APP_PREPARATION_TIMEOUT = 9;
+ // Uses FIRST_NO_ACCESSIBILITY_CALLBACK_MSG for messages that don't need to call back
+ // results to interrogating client.
+ private static final int FIRST_NO_ACCESSIBILITY_CALLBACK_MSG = 100;
+ private static final int MSG_CLEAR_ACCESSIBILITY_FOCUS =
+ FIRST_NO_ACCESSIBILITY_CALLBACK_MSG + 1;
+
public PrivateHandler(Looper looper) {
super(looper);
}
@@ -1320,6 +1385,8 @@ final class AccessibilityInteractionController {
return "MSG_APP_PREPARATION_FINISHED";
case MSG_APP_PREPARATION_TIMEOUT:
return "MSG_APP_PREPARATION_TIMEOUT";
+ case MSG_CLEAR_ACCESSIBILITY_FOCUS:
+ return "MSG_CLEAR_ACCESSIBILITY_FOCUS";
default:
throw new IllegalArgumentException("Unknown message type: " + type);
}
@@ -1356,10 +1423,17 @@ final class AccessibilityInteractionController {
case MSG_APP_PREPARATION_TIMEOUT: {
requestPreparerTimeoutUiThread();
} break;
+ case MSG_CLEAR_ACCESSIBILITY_FOCUS: {
+ clearAccessibilityFocusUiThread();
+ } break;
default:
throw new IllegalArgumentException("Unknown message type: " + type);
}
}
+
+ boolean hasAccessibilityCallback(Message message) {
+ return message.what < FIRST_NO_ACCESSIBILITY_CALLBACK_MSG ? true : false;
+ }
}
private final class AddNodeInfosForViewId implements Predicate<View> {
diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java
index 92e0009bc21a..ec79eea45ee6 100644
--- a/core/java/android/view/InputWindowHandle.java
+++ b/core/java/android/view/InputWindowHandle.java
@@ -16,10 +16,10 @@
package android.view;
+import static android.view.Display.INVALID_DISPLAY;
+
import android.graphics.Region;
import android.os.IBinder;
-import android.view.IWindow;
-import android.view.InputChannel;
/**
* Functions as a handle for a window that can receive input.
@@ -94,6 +94,10 @@ public final class InputWindowHandle {
// Display this input is on.
public int displayId;
+ // If this value is set to a valid display ID, it indicates this window is a portal which
+ // transports the touch of this window to the display indicated by portalToDisplayId.
+ public int portalToDisplayId = INVALID_DISPLAY;
+
private native void nativeDispose();
public InputWindowHandle(InputApplicationHandle inputApplicationHandle,
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index dc7c343c2c3e..6061cb2963eb 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -20,6 +20,7 @@ import android.annotation.LayoutRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -399,10 +400,15 @@ public abstract class LayoutInflater {
}
private void initPrecompiledViews() {
- // Check if precompiled layouts are enabled by a system property.
- mUseCompiledView =
- SystemProperties.getBoolean(USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY, false);
+ initPrecompiledViews(
+ SystemProperties.getBoolean(USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY, false));
+ }
+
+ private void initPrecompiledViews(boolean enablePrecompiledViews) {
+ mUseCompiledView = enablePrecompiledViews;
+
if (!mUseCompiledView) {
+ mPrecompiledClassLoader = null;
return;
}
@@ -431,6 +437,17 @@ public abstract class LayoutInflater {
}
mUseCompiledView = false;
}
+ if (!mUseCompiledView) {
+ mPrecompiledClassLoader = null;
+ }
+ }
+
+ /**
+ * @hide for use by CTS tests
+ */
+ @TestApi
+ public void setPrecompiledLayoutsEnabledForTesting(boolean enablePrecompiledLayouts) {
+ initPrecompiledViews(enablePrecompiledLayouts);
}
/**
diff --git a/core/java/android/view/RemoteAnimationTarget.java b/core/java/android/view/RemoteAnimationTarget.java
index 1d2cf4b78756..9b3efe138170 100644
--- a/core/java/android/view/RemoteAnimationTarget.java
+++ b/core/java/android/view/RemoteAnimationTarget.java
@@ -246,8 +246,12 @@ public class RemoteAnimationTarget implements Parcelable {
position.writeToProto(proto, POSITION);
sourceContainerBounds.writeToProto(proto, SOURCE_CONTAINER_BOUNDS);
windowConfiguration.writeToProto(proto, WINDOW_CONFIGURATION);
- startLeash.writeToProto(proto, START_LEASH);
- startBounds.writeToProto(proto, START_BOUNDS);
+ if (startLeash != null) {
+ startLeash.writeToProto(proto, START_LEASH);
+ }
+ if (startBounds != null) {
+ startBounds.writeToProto(proto, START_BOUNDS);
+ }
proto.end(token);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index a17a188071ec..519181d364c2 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -8210,7 +8210,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* changed by calling
* {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)},
* {@link ContentCaptureSession#notifyViewDisappeared(AutofillId)}, and
- * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence, int)}
+ * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence)}
* respectively. The structure for the a child must be created using
* {@link ContentCaptureSession#newVirtualViewStructure(AutofillId, long)}, and the
* {@code autofillId} for a child can be obtained either through
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index f47eb10efd29..9213f32326b4 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -8718,6 +8718,15 @@ public final class ViewRootImpl implements ViewParent,
}
}
}
+
+ @Override
+ public void clearAccessibilityFocus() {
+ ViewRootImpl viewRootImpl = mViewRootImpl.get();
+ if (viewRootImpl != null && viewRootImpl.mView != null) {
+ viewRootImpl.getAccessibilityInteractionController()
+ .clearAccessibilityFocusClientThread();
+ }
+ }
}
private class SendWindowContentChangedAccessibilityEvent implements Runnable {
diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
index 4c0fdfd5afdf..947ff056627e 100644
--- a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
@@ -55,4 +55,6 @@ oneway interface IAccessibilityInteractionConnection {
void performAccessibilityAction(long accessibilityNodeId, int action, in Bundle arguments,
int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
int interrogatingPid, long interrogatingTid);
+
+ void clearAccessibilityFocus();
}
diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java
index e6ee6ed6c55f..68a3e8a1eb32 100644
--- a/core/java/android/view/contentcapture/ContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/ContentCaptureSession.java
@@ -54,7 +54,7 @@ public abstract class ContentCaptureSession implements AutoCloseable {
* @hide
*/
// NOTE: not prefixed by STATE_ so it's not printed on getStateAsString()
- public static final int UNKNWON_STATE = 0x0;
+ public static final int UNKNOWN_STATE = 0x0;
/**
* Service's startSession() was called, but server didn't confirm it was created yet.
@@ -160,7 +160,7 @@ public abstract class ContentCaptureSession implements AutoCloseable {
@Nullable
protected final String mId;
- private int mState = UNKNWON_STATE;
+ private int mState = UNKNOWN_STATE;
// Lazily created on demand.
private ContentCaptureSessionId mContentCaptureSessionId;
@@ -350,10 +350,8 @@ public abstract class ContentCaptureSession implements AutoCloseable {
*
* @param id of the node.
* @param text new text.
- * @param flags currently ignored.
*/
- public final void notifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text,
- int flags) {
+ public final void notifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text) {
Preconditions.checkNotNull(id);
if (!isContentCaptureEnabled()) return;
@@ -439,7 +437,7 @@ public abstract class ContentCaptureSession implements AutoCloseable {
/** @hide */
@NonNull
protected static String getStateAsString(int state) {
- return state + " (" + (state == UNKNWON_STATE ? "UNKNOWN"
+ return state + " (" + (state == UNKNOWN_STATE ? "UNKNOWN"
: DebugUtils.flagsToString(ContentCaptureSession.class, "STATE_", state)) + ")";
}
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index 72aefb20f2cb..2eca51f61e91 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -115,7 +115,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
@Nullable
private DeathRecipient mDirectServiceVulture;
- private int mState = UNKNWON_STATE;
+ private int mState = UNKNOWN_STATE;
@Nullable
private IBinder mApplicationToken;
@@ -367,7 +367,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
}
private boolean handleHasStarted() {
- return mState != UNKNWON_STATE;
+ return mState != UNKNOWN_STATE;
}
private void handleScheduleFlush(@FlushReason int reason, boolean checkExisting) {
diff --git a/core/java/android/view/contentcapture/UserDataRemovalRequest.java b/core/java/android/view/contentcapture/UserDataRemovalRequest.java
index 8ee63ef74685..8fedcd54b1fc 100644
--- a/core/java/android/view/contentcapture/UserDataRemovalRequest.java
+++ b/core/java/android/view/contentcapture/UserDataRemovalRequest.java
@@ -16,7 +16,6 @@
package android.view.contentcapture;
import android.annotation.NonNull;
-import android.annotation.SystemApi;
import android.app.ActivityThread;
import android.net.Uri;
import android.os.Parcel;
@@ -67,9 +66,7 @@ public final class UserDataRemovalRequest implements Parcelable {
/**
* Gets the name of the app that's making the request.
- * @hide
*/
- @SystemApi
@NonNull
public String getPackageName() {
return mPackageName;
@@ -77,20 +74,14 @@ public final class UserDataRemovalRequest implements Parcelable {
/**
* Checks if app is requesting to remove all user data associated with its package.
- *
- * @hide
*/
- @SystemApi
public boolean isForEverything() {
return mForEverything;
}
/**
* Gets the list of {@code Uri}s the apps is requesting to remove.
- *
- * @hide
*/
- @SystemApi
@NonNull
public List<UriRequest> getUriRequests() {
return mUriRequests;
@@ -203,9 +194,7 @@ public final class UserDataRemovalRequest implements Parcelable {
/**
* Representation of a request to remove data associated with an {@link Uri}.
- * @hide
*/
- @SystemApi
public final class UriRequest {
private final @NonNull Uri mUri;
private final boolean mRecursive;
diff --git a/core/java/android/view/textclassifier/ExtrasUtils.java b/core/java/android/view/textclassifier/ExtrasUtils.java
new file mode 100644
index 000000000000..602455c65beb
--- /dev/null
+++ b/core/java/android/view/textclassifier/ExtrasUtils.java
@@ -0,0 +1,127 @@
+/*
+ * 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 android.view.textclassifier;
+
+import android.annotation.Nullable;
+import android.app.RemoteAction;
+import android.content.Intent;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+
+/**
+ * Utility class for inserting and retrieving data in TextClassifier request/response extras.
+ * @hide
+ */
+public final class ExtrasUtils {
+
+ private static final String ACTIONS_INTENTS = "actions-intents";
+ private static final String FOREIGN_LANGUAGE = "foreign-language";
+ private static final String ENTITY_TYPE = "entity-type";
+ private static final String SCORE = "score";
+ private static final String MODEL_VERSION = "model-version";
+ private static final String MODEL_NAME = "model-name";
+
+ private ExtrasUtils() {}
+
+ /**
+ * Bundles and returns foreign language detection information for TextClassifier responses.
+ */
+ static Bundle createForeignLanguageExtra(
+ String language, float score, int modelVersion) {
+ final Bundle bundle = new Bundle();
+ bundle.putString(ENTITY_TYPE, language);
+ bundle.putFloat(SCORE, score);
+ bundle.putInt(MODEL_VERSION, modelVersion);
+ bundle.putString(MODEL_NAME, "langId_v" + modelVersion);
+ return bundle;
+ }
+
+ /**
+ * Stores {@code extra} as foreign language information in TextClassifier response object's
+ * extras {@code container}.
+ */
+ static void putForeignLanguageExtra(Bundle container, Bundle extra) {
+ container.putParcelable(FOREIGN_LANGUAGE, extra);
+ }
+
+ /**
+ * Returns foreign language detection information contained in the TextClassification object.
+ * responses.
+ */
+ @Nullable
+ public static Bundle getForeignLanguageExtra(TextClassification classification) {
+ return classification.getExtras().getBundle(FOREIGN_LANGUAGE);
+ }
+
+ /**
+ * Stores {@code actionIntents} information in TextClassifier response object's extras
+ * {@code container}.
+ */
+ static void putActionsIntents(Bundle container, ArrayList<Intent> actionsIntents) {
+ container.putParcelableArrayList(ACTIONS_INTENTS, actionsIntents);
+ }
+
+ /**
+ * Returns {@code actionIntents} information contained in the TextClassification object.
+ */
+ @Nullable
+ public static ArrayList<Intent> getActionsIntents(TextClassification classification) {
+ return classification.getExtras().getParcelableArrayList(ACTIONS_INTENTS);
+ }
+
+ /**
+ * Returns the first "translate" action found in the {@code classification} object.
+ */
+ @Nullable
+ public static RemoteAction findTranslateAction(TextClassification classification) {
+ final ArrayList<Intent> actionIntents = getActionsIntents(classification);
+ if (actionIntents != null) {
+ final int size = actionIntents.size();
+ for (int i = 0; i < size; i++) {
+ if (Intent.ACTION_TRANSLATE.equals(actionIntents.get(i).getAction())) {
+ return classification.getActions().get(i);
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns the entity type contained in the {@code extra}.
+ */
+ @Nullable
+ public static String getEntityType(Bundle extra) {
+ return extra.getString(ENTITY_TYPE);
+ }
+
+ /**
+ * Returns the score contained in the {@code extra}.
+ */
+ @Nullable
+ public static float getScore(Bundle extra) {
+ return extra.getFloat(SCORE, -1);
+ }
+
+ /**
+ * Returns the model name contained in the {@code extra}.
+ */
+ @Nullable
+ public static String getModelName(Bundle extra) {
+ return extra.getString(MODEL_NAME);
+ }
+}
diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java
index d9f79655d588..a05920960dcf 100644
--- a/core/java/android/view/textclassifier/TextClassification.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -378,6 +378,8 @@ public final class TextClassification implements Parcelable {
@Nullable private OnClickListener mLegacyOnClickListener;
@Nullable private String mId;
@Nullable private Bundle mExtras;
+ @NonNull private final ArrayList<Intent> mActionIntents = new ArrayList<>();
+ @Nullable private Bundle mForeignLanguageExtra;
/**
* Sets the classified text.
@@ -412,8 +414,19 @@ public final class TextClassification implements Parcelable {
*/
@NonNull
public Builder addAction(@NonNull RemoteAction action) {
+ return addAction(action, null);
+ }
+
+ /**
+ * @param intent the intent in the remote action.
+ * @see #addAction(RemoteAction)
+ * @hide
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public Builder addAction(RemoteAction action, @Nullable Intent intent) {
Preconditions.checkArgument(action != null);
mActions.add(action);
+ mActionIntents.add(intent);
return this;
}
@@ -499,13 +512,33 @@ public final class TextClassification implements Parcelable {
}
/**
+ * @see #setExtras(Bundle)
+ * @hide
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public Builder setForeignLanguageExtra(@Nullable Bundle extra) {
+ mForeignLanguageExtra = extra;
+ return this;
+ }
+
+ /**
* Builds and returns a {@link TextClassification} object.
*/
@NonNull
public TextClassification build() {
return new TextClassification(mText, mLegacyIcon, mLegacyLabel, mLegacyIntent,
- mLegacyOnClickListener, mActions, mEntityConfidence, mId,
- mExtras == null ? Bundle.EMPTY : mExtras.deepCopy());
+ mLegacyOnClickListener, mActions, mEntityConfidence, mId, buildExtras());
+ }
+
+ private Bundle buildExtras() {
+ final Bundle extras = mExtras == null ? new Bundle() : mExtras.deepCopy();
+ if (!mActionIntents.isEmpty()) {
+ ExtrasUtils.putActionsIntents(extras, mActionIntents);
+ }
+ if (mForeignLanguageExtra != null) {
+ ExtrasUtils.putForeignLanguageExtra(extras, mForeignLanguageExtra);
+ }
+ return extras.isEmpty() ? Bundle.EMPTY : extras;
}
}
diff --git a/core/java/android/view/textclassifier/TextClassificationSession.java b/core/java/android/view/textclassifier/TextClassificationSession.java
index 45668c01a8d3..ba1287fc6b0f 100644
--- a/core/java/android/view/textclassifier/TextClassificationSession.java
+++ b/core/java/android/view/textclassifier/TextClassificationSession.java
@@ -71,10 +71,23 @@ final class TextClassificationSession implements TextClassifier {
@Override
public void onSelectionEvent(SelectionEvent event) {
- checkDestroyed();
- Preconditions.checkNotNull(event);
- if (mEventHelper.sanitizeEvent(event)) {
- mDelegate.onSelectionEvent(event);
+ try {
+ if (mEventHelper.sanitizeEvent(event)) {
+ mDelegate.onSelectionEvent(event);
+ }
+ } catch (Exception e) {
+ // Avoid crashing for event reporting.
+ Log.e(LOG_TAG, "Error reporting text classifier selection event", e);
+ }
+ }
+
+ @Override
+ public void onTextClassifierEvent(TextClassifierEvent event) {
+ try {
+ mDelegate.onTextClassifierEvent(event);
+ } catch (Exception e) {
+ // Avoid crashing for event reporting.
+ Log.e(LOG_TAG, "Error reporting text classifier event", e);
}
}
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 5a5613605e36..e0101556910f 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -161,12 +161,18 @@ public interface TextClassifier {
* No-op TextClassifier.
* This may be used to turn off TextClassifier features.
*/
- TextClassifier NO_OP = new TextClassifier() {};
+ TextClassifier NO_OP = new TextClassifier() {
+ @Override
+ public String toString() {
+ return "TextClassifier.NO_OP";
+ }
+ };
/**
- * Used as a boolean value to indicate the intent is generated by TextClassifier.
+ * Extra that is included on activity intents coming from a TextClassifier when
+ * it suggests actions to its caller.
* <p>
- * All {@link TextClassifier} implementations should set this boolean extra to be true in their
+ * All {@link TextClassifier} implementations should make sure this extra exists in their
* generated intents.
*/
String EXTRA_FROM_TEXT_CLASSIFIER = "android.view.textclassifier.extra.FROM_TEXT_CLASSIFIER";
diff --git a/core/java/android/view/textclassifier/TextClassifierEvent.java b/core/java/android/view/textclassifier/TextClassifierEvent.java
index cd13cc0ec577..0d4338b0af6b 100644
--- a/core/java/android/view/textclassifier/TextClassifierEvent.java
+++ b/core/java/android/view/textclassifier/TextClassifierEvent.java
@@ -141,6 +141,8 @@ public final class TextClassifierEvent implements Parcelable {
@Nullable private final String mLanguage;
private final float mScore;
+ @Nullable private final String mModelName;
+
private TextClassifierEvent(
int eventCategory,
int eventType,
@@ -156,7 +158,8 @@ public final class TextClassifierEvent implements Parcelable {
int relativeSuggestedWordEndIndex,
int[] actionIndex,
String language,
- float score) {
+ float score,
+ String modelVersion) {
mEventCategory = eventCategory;
mEventType = eventType;
mEntityTypes = entityTypes;
@@ -172,6 +175,7 @@ public final class TextClassifierEvent implements Parcelable {
mActionIndices = actionIndex;
mLanguage = language;
mScore = score;
+ mModelName = modelVersion;
}
@Override
@@ -196,6 +200,7 @@ public final class TextClassifierEvent implements Parcelable {
dest.writeIntArray(mActionIndices);
dest.writeString(mLanguage);
dest.writeFloat(mScore);
+ dest.writeString(mModelName);
}
private static TextClassifierEvent readFromParcel(Parcel in) {
@@ -214,7 +219,8 @@ public final class TextClassifierEvent implements Parcelable {
/* relativeSuggestedWordEndIndex= */ in.readInt(),
/* actionIndices= */ in.createIntArray(),
/* language= */ in.readString(),
- /* score= */ in.readFloat());
+ /* score= */ in.readFloat(),
+ /* modelVersion= */ in.readString());
}
/**
@@ -264,6 +270,7 @@ public final class TextClassifierEvent implements Parcelable {
return mEventIndex;
}
+ // TODO: Remove this API.
/**
* Returns the time this event occurred. This is the number of milliseconds since
* January 1, 1970, 00:00:00 GMT. 0 indicates not set.
@@ -339,6 +346,15 @@ public final class TextClassifierEvent implements Parcelable {
}
/**
+ * Returns the model name.
+ * @hide
+ */
+ @Nullable
+ public String getModelName() {
+ return mModelName;
+ }
+
+ /**
* Builder to build a text classifier event.
*/
public static final class Builder {
@@ -359,6 +375,8 @@ public final class TextClassifierEvent implements Parcelable {
@Nullable private String mLanguage;
private float mScore;
+ private String mModelName;
+
/**
* Creates a builder for building {@link TextClassifierEvent}s.
*
@@ -407,6 +425,7 @@ public final class TextClassifierEvent implements Parcelable {
return this;
}
+ // TODO: Remove this API.
/**
* Sets the time this event occurred. This is the number of milliseconds since
* January 1, 1970, 00:00:00 GMT. 0 indicates not set.
@@ -501,6 +520,15 @@ public final class TextClassifierEvent implements Parcelable {
}
/**
+ * Sets the model name string.
+ * @hide
+ */
+ public Builder setModelName(@Nullable String modelVersion) {
+ mModelName = modelVersion;
+ return this;
+ }
+
+ /**
* Builds and returns a text classifier event.
*/
@NonNull
@@ -521,7 +549,8 @@ public final class TextClassifierEvent implements Parcelable {
mRelativeSuggestedWordEndIndex,
mActionIndices,
mLanguage,
- mScore);
+ mScore,
+ mModelName);
}
// TODO: Add build(boolean validate).
}
@@ -544,6 +573,7 @@ public final class TextClassifierEvent implements Parcelable {
out.append(", mActionIndices=").append(Arrays.toString(mActionIndices));
out.append(", mLanguage=").append(mLanguage);
out.append(", mScore=").append(mScore);
+ out.append(", mModelName=").append(mModelName);
out.append("}");
return out.toString();
}
diff --git a/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java
index 5563dfc2eee5..6a122506d0ac 100644
--- a/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java
+++ b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java
@@ -16,7 +16,6 @@
package android.view.textclassifier;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXTCLASSIFIER_MODEL;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_EVENT_TIME;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SCORE;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE;
@@ -46,7 +45,7 @@ public final class TextClassifierEventTronLogger {
private final MetricsLogger mMetricsLogger;
public TextClassifierEventTronLogger() {
- mMetricsLogger = new MetricsLogger();
+ this(new MetricsLogger());
}
@VisibleForTesting
@@ -57,6 +56,7 @@ public final class TextClassifierEventTronLogger {
/** Emits a text classifier event to the logs. */
public void writeEvent(TextClassifierEvent event) {
Preconditions.checkNotNull(event);
+
int category = getCategory(event);
if (category == -1) {
Log.w(TAG, "Unknown category: " + event.getEventCategory());
@@ -65,14 +65,12 @@ public final class TextClassifierEventTronLogger {
final LogMaker log = new LogMaker(category)
.setSubtype(getLogType(event))
.addTaggedData(FIELD_TEXT_CLASSIFIER_SESSION_ID, event.getResultId())
- .addTaggedData(FIELD_TEXT_CLASSIFIER_EVENT_TIME, event.getEventTime())
- .addTaggedData(FIELD_TEXTCLASSIFIER_MODEL,
- SelectionSessionLogger.SignatureParser.getModelName(event.getResultId()))
+ .addTaggedData(FIELD_TEXTCLASSIFIER_MODEL, getModelName(event))
.addTaggedData(FIELD_TEXT_CLASSIFIER_SCORE, event.getScore());
String[] entityTypes = event.getEntityTypes();
- // TRON does not support a field of list type, and thus workaround by store them
- // in three separate fields. This is no longer an issue once we have moved to Westworld.
+ // The old logger does not support a field of list type, and thus workaround by store them
+ // in three separate fields. This is not an issue with the new logger.
if (entityTypes.length >= 1) {
log.addTaggedData(FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE, entityTypes[0]);
}
@@ -93,6 +91,13 @@ public final class TextClassifierEventTronLogger {
debugLog(log);
}
+ private static String getModelName(TextClassifierEvent event) {
+ if (event.getModelName() != null) {
+ return event.getModelName();
+ }
+ return SelectionSessionLogger.SignatureParser.getModelName(event.getResultId());
+ }
+
private static int getCategory(TextClassifierEvent event) {
switch (event.getEventCategory()) {
case TextClassifierEvent.CATEGORY_CONVERSATION_ACTIONS:
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index c297928ae5f6..14afa339f192 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -65,9 +65,6 @@ import java.util.Objects;
*/
public final class TextClassifierImpl implements TextClassifier {
- /** @hide */
- public static final String ACTIONS_INTENTS = "actions-intents";
-
private static final String LOG_TAG = DEFAULT_LOG_TAG;
private static final boolean DEBUG = false;
@@ -343,7 +340,11 @@ public final class TextClassifierImpl implements TextClassifier {
if (DEBUG) {
Log.d(DEFAULT_LOG_TAG, "onTextClassifierEvent() called with: event = [" + event + "]");
}
- mTextClassifierEventTronLogger.writeEvent(event);
+ try {
+ mTextClassifierEventTronLogger.writeEvent(event);
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Error writing event", e);
+ }
}
/** @inheritDoc */
@@ -566,12 +567,16 @@ public final class TextClassifierImpl implements TextClassifier {
final float foreignTextThreshold = mSettings.getLangIdThresholdOverride() >= 0
? mSettings.getLangIdThresholdOverride()
: 0.5f /* TODO: Load this from the langId model. */;
+ final Bundle foreignLanguageBundle =
+ detectForeignLanguage(classifiedText, foreignTextThreshold);
+ builder.setForeignLanguageExtra(foreignLanguageBundle);
+
boolean isPrimaryAction = true;
final ArrayList<Intent> sourceIntents = new ArrayList<>();
List<LabeledIntent> labeledIntents = mIntentFactory.create(
mContext,
classifiedText,
- isForeignText(classifiedText, foreignTextThreshold),
+ foreignLanguageBundle != null,
referenceTime,
highestScoringResult);
for (LabeledIntent labeledIntent : labeledIntents) {
@@ -590,28 +595,28 @@ public final class TextClassifierImpl implements TextClassifier {
labeledIntent.getIntent(), labeledIntent.getRequestCode())));
isPrimaryAction = false;
}
- builder.addAction(action);
- sourceIntents.add(labeledIntent.getIntent());
+ builder.addAction(action, labeledIntent.getIntent());
}
- final Bundle extras = new Bundle();
- extras.putParcelableArrayList(ACTIONS_INTENTS, sourceIntents);
-
- return builder.setId(createId(text, start, end))
- .setExtras(extras)
- .build();
+ return builder.setId(createId(text, start, end)).build();
}
- private boolean isForeignText(String text, float threshold) {
+ /**
+ * Returns a bundle with the language and confidence score if it finds the text to be
+ * in a foreign language. Otherwise returns null.
+ */
+ @Nullable
+ private Bundle detectForeignLanguage(String text, float threshold) {
if (threshold > 1) {
- return false;
+ return null;
}
// TODO: Revisit this algorithm.
try {
- final LangIdModel.LanguageResult[] langResults = getLangIdImpl().detectLanguages(text);
+ final LangIdModel langId = getLangIdImpl();
+ final LangIdModel.LanguageResult[] langResults = langId.detectLanguages(text);
if (langResults.length <= 0) {
- return false;
+ return null;
}
LangIdModel.LanguageResult highestScoringResult = langResults[0];
@@ -621,7 +626,7 @@ public final class TextClassifierImpl implements TextClassifier {
}
}
if (highestScoringResult.getScore() < threshold) {
- return false;
+ return null;
}
// TODO: Remove
Log.d(LOG_TAG, String.format("Language detected: <%s:%s>",
@@ -632,14 +637,15 @@ public final class TextClassifierImpl implements TextClassifier {
final int size = deviceLocales.size();
for (int i = 0; i < size; i++) {
if (deviceLocales.get(i).getLanguage().equals(detected.getLanguage())) {
- return false;
+ return null;
}
}
- return true;
+ return ExtrasUtils.createForeignLanguageExtra(
+ detected.getLanguage(), highestScoringResult.getScore(), langId.getVersion());
} catch (Throwable t) {
Log.e(LOG_TAG, "Error detecting foreign text. Ignored.", t);
}
- return false;
+ return null;
}
@Override
@@ -773,3 +779,4 @@ public final class TextClassifierImpl implements TextClassifier {
}
}
}
+
diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java
index de1f3df61462..09aa066549cb 100644
--- a/core/java/android/webkit/WebViewZygote.java
+++ b/core/java/android/webkit/WebViewZygote.java
@@ -163,7 +163,7 @@ public class WebViewZygote {
TextUtils.join(",", Build.SUPPORTED_ABIS),
null, // instructionSet
Process.FIRST_ISOLATED_UID,
- Process.LAST_ISOLATED_UID);
+ Integer.MAX_VALUE); // TODO(b/123615476) deal with user-id ranges properly
ZygoteProcess.waitForConnectionToZygote(sZygote.getPrimarySocketAddress());
if (sPackageOriginalAppInfo.sourceDir.equals(sPackage.applicationInfo.sourceDir)) {
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 4a60b6a8185a..c38566b87d9c 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -4112,9 +4112,9 @@ public class Editor {
}
}
- private MenuItem addAssistMenuItem(Menu menu, RemoteAction action, int intemId, int order,
+ private MenuItem addAssistMenuItem(Menu menu, RemoteAction action, int itemId, int order,
int showAsAction) {
- final MenuItem item = menu.add(TextView.ID_ASSIST, intemId, order, action.getTitle())
+ final MenuItem item = menu.add(TextView.ID_ASSIST, itemId, order, action.getTitle())
.setContentDescription(action.getContentDescription());
if (action.shouldShowIcon()) {
item.setIcon(action.getIcon().loadDrawable(mTextView.getContext()));
@@ -4188,7 +4188,8 @@ public class Editor {
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- getSelectionActionModeHelper().onSelectionAction(item.getItemId());
+ getSelectionActionModeHelper()
+ .onSelectionAction(item.getItemId(), item.getTitle().toString());
if (mProcessTextIntentActionsHandler.performMenuItemAction(item)) {
return true;
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 4caf28881edc..564cfdd20d76 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -20,12 +20,14 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UiThread;
import android.annotation.WorkerThread;
+import android.app.RemoteAction;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PointF;
import android.graphics.RectF;
import android.os.AsyncTask;
import android.os.Build;
+import android.os.Bundle;
import android.os.LocaleList;
import android.text.Layout;
import android.text.Selection;
@@ -34,13 +36,16 @@ import android.text.TextUtils;
import android.text.util.Linkify;
import android.util.Log;
import android.view.ActionMode;
+import android.view.textclassifier.ExtrasUtils;
import android.view.textclassifier.SelectionEvent;
import android.view.textclassifier.SelectionEvent.InvocationMethod;
import android.view.textclassifier.SelectionSessionLogger;
import android.view.textclassifier.TextClassification;
import android.view.textclassifier.TextClassificationConstants;
+import android.view.textclassifier.TextClassificationContext;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
+import android.view.textclassifier.TextClassifierEvent;
import android.view.textclassifier.TextSelection;
import android.widget.Editor.SelectionModifierCursorController;
@@ -166,16 +171,17 @@ public final class SelectionActionModeHelper {
}
}
- public void onSelectionAction(int menuItemId) {
+ /** Reports a selection action event. */
+ public void onSelectionAction(int menuItemId, @Nullable String actionLabel) {
mSelectionTracker.onSelectionAction(
mTextView.getSelectionStart(), mTextView.getSelectionEnd(),
- getActionType(menuItemId), mTextClassification);
+ getActionType(menuItemId), actionLabel, mTextClassification);
}
public void onSelectionDrag() {
mSelectionTracker.onSelectionAction(
mTextView.getSelectionStart(), mTextView.getSelectionEnd(),
- SelectionEvent.ACTION_DRAG, mTextClassification);
+ SelectionEvent.ACTION_DRAG, /* actionLabel= */ null, mTextClassification);
}
public void onTextChanged(int start, int end) {
@@ -511,8 +517,11 @@ public final class SelectionActionModeHelper {
mOriginalEnd = mSelectionEnd = selectionEnd;
mAllowReset = false;
maybeInvalidateLogger();
- mLogger.logSelectionStarted(mTextView.getTextClassificationSession(),
- text, selectionStart,
+ mLogger.logSelectionStarted(
+ mTextView.getTextClassificationSession(),
+ mTextView.getTextClassificationContext(),
+ text,
+ selectionStart,
isLink ? SelectionEvent.INVOCATION_LINK : SelectionEvent.INVOCATION_MANUAL);
}
@@ -570,10 +579,12 @@ public final class SelectionActionModeHelper {
public void onSelectionAction(
int selectionStart, int selectionEnd,
@SelectionEvent.ActionType int action,
+ @Nullable String actionLabel,
@Nullable TextClassification classification) {
if (isSelectionStarted()) {
mAllowReset = false;
- mLogger.logSelectionAction(selectionStart, selectionEnd, action, classification);
+ mLogger.logSelectionAction(
+ selectionStart, selectionEnd, action, actionLabel, classification);
}
}
@@ -596,7 +607,8 @@ public final class SelectionActionModeHelper {
mSelectionEnd = editor.getTextView().getSelectionEnd();
mLogger.logSelectionAction(
textView.getSelectionStart(), textView.getSelectionEnd(),
- SelectionEvent.ACTION_RESET, null /* classification */);
+ SelectionEvent.ACTION_RESET,
+ /* actionLabel= */ null, /* classification= */ null);
}
return selected;
}
@@ -605,7 +617,9 @@ public final class SelectionActionModeHelper {
public void onTextChanged(int start, int end, TextClassification classification) {
if (isSelectionStarted() && start == mSelectionStart && end == mSelectionEnd) {
- onSelectionAction(start, end, SelectionEvent.ACTION_OVERTYPE, classification);
+ onSelectionAction(
+ start, end, SelectionEvent.ACTION_OVERTYPE,
+ /* actionLabel= */ null, classification);
}
}
@@ -644,7 +658,8 @@ public final class SelectionActionModeHelper {
if (mIsPending) {
mLogger.logSelectionAction(
mSelectionStart, mSelectionEnd,
- SelectionEvent.ACTION_ABANDON, null /* classification */);
+ SelectionEvent.ACTION_ABANDON,
+ /* actionLabel= */ null, /* classification= */ null);
mSelectionStart = mSelectionEnd = -1;
mLogger.endTextClassificationSession();
mIsPending = false;
@@ -679,6 +694,11 @@ public final class SelectionActionModeHelper {
private final BreakIterator mTokenIterator;
@Nullable private TextClassifier mClassificationSession;
+ @Nullable private TextClassificationContext mClassificationContext;
+
+ @Nullable private TextClassifierEvent mTranslateViewEvent;
+ @Nullable private TextClassifierEvent mTranslateClickEvent;
+
private int mStartIndex;
private String mText;
@@ -690,6 +710,7 @@ public final class SelectionActionModeHelper {
public void logSelectionStarted(
TextClassifier classificationSession,
+ TextClassificationContext classificationContext,
CharSequence text, int index,
@InvocationMethod int invocationMethod) {
try {
@@ -701,6 +722,7 @@ public final class SelectionActionModeHelper {
mTokenIterator.setText(mText);
mStartIndex = index;
mClassificationSession = classificationSession;
+ mClassificationContext = classificationContext;
if (hasActiveClassificationSession()) {
mClassificationSession.onSelectionEvent(
SelectionEvent.createSelectionStartedEvent(invocationMethod, 0));
@@ -731,6 +753,7 @@ public final class SelectionActionModeHelper {
SelectionEvent.createSelectionModifiedEvent(
wordIndices[0], wordIndices[1]));
}
+ maybeGenerateTranslateViewEvent(classification);
}
} catch (Exception e) {
// Avoid crashes due to logging.
@@ -741,6 +764,7 @@ public final class SelectionActionModeHelper {
public void logSelectionAction(
int start, int end,
@SelectionEvent.ActionType int action,
+ @Nullable String actionLabel,
@Nullable TextClassification classification) {
try {
if (hasActiveClassificationSession()) {
@@ -757,6 +781,9 @@ public final class SelectionActionModeHelper {
SelectionEvent.createSelectionActionEvent(
wordIndices[0], wordIndices[1], action));
}
+
+ maybeGenerateTranslateClickEvent(classification, actionLabel);
+
if (SelectionEvent.isTerminal(action)) {
endTextClassificationSession();
}
@@ -773,6 +800,7 @@ public final class SelectionActionModeHelper {
public void endTextClassificationSession() {
if (hasActiveClassificationSession()) {
+ maybeReportTranslateEvents();
mClassificationSession.destroy();
}
}
@@ -843,6 +871,78 @@ public final class SelectionActionModeHelper {
private boolean isWhitespace(int start, int end) {
return PATTERN_WHITESPACE.matcher(mText.substring(start, end)).matches();
}
+
+ private void maybeGenerateTranslateViewEvent(@Nullable TextClassification classification) {
+ if (classification != null) {
+ final TextClassifierEvent event = generateTranslateEvent(
+ TextClassifierEvent.TYPE_ACTIONS_SHOWN,
+ classification, mClassificationContext, /* actionLabel= */null);
+ mTranslateViewEvent = (event != null) ? event : mTranslateViewEvent;
+ }
+ }
+
+ private void maybeGenerateTranslateClickEvent(
+ @Nullable TextClassification classification, String actionLabel) {
+ if (classification != null) {
+ mTranslateClickEvent = generateTranslateEvent(
+ TextClassifierEvent.TYPE_SMART_ACTION,
+ classification, mClassificationContext, actionLabel);
+ }
+ }
+
+ private void maybeReportTranslateEvents() {
+ // Translate view and click events should only be logged once per selection session.
+ if (mTranslateViewEvent != null) {
+ mClassificationSession.onTextClassifierEvent(mTranslateViewEvent);
+ mTranslateViewEvent = null;
+ }
+ if (mTranslateClickEvent != null) {
+ mClassificationSession.onTextClassifierEvent(mTranslateClickEvent);
+ mTranslateClickEvent = null;
+ }
+ }
+
+ @Nullable
+ private static TextClassifierEvent generateTranslateEvent(
+ int eventType, TextClassification classification,
+ TextClassificationContext classificationContext, @Nullable String actionLabel) {
+
+ // The platform attempts to log "views" and "clicks" of the "Translate" action.
+ // Views are logged if a user is presented with the translate action during a selection
+ // session.
+ // Clicks are logged if the user clicks on the translate action.
+ // The index of the translate action is also logged to indicate whether it might have
+ // been in the main panel or overflow panel of the selection toolbar.
+ // NOTE that the "views" metric may be flawed if a TextView removes the translate menu
+ // item via a custom action mode callback or does not show a selection menu item.
+
+ final RemoteAction translateAction = ExtrasUtils.findTranslateAction(classification);
+ if (translateAction == null) {
+ // No translate action present. Nothing to log. Exit.
+ return null;
+ }
+
+ if (eventType == TextClassifierEvent.TYPE_SMART_ACTION
+ && !translateAction.getTitle().toString().equals(actionLabel)) {
+ // Clicked action is not a translate action. Nothing to log. Exit.
+ // Note that we don't expect an actionLabel for "view" events.
+ return null;
+ }
+
+ final Bundle foreignLanguageExtra = ExtrasUtils.getForeignLanguageExtra(classification);
+ final String language = ExtrasUtils.getEntityType(foreignLanguageExtra);
+ final float score = ExtrasUtils.getScore(foreignLanguageExtra);
+ final String model = ExtrasUtils.getModelName(foreignLanguageExtra);
+ return new TextClassifierEvent.Builder(
+ TextClassifierEvent.CATEGORY_LANGUAGE_DETECTION, eventType)
+ .setEventContext(classificationContext)
+ .setResultId(classification.getId())
+ .setEntityTypes(language)
+ .setScore(score)
+ .setActionIndices(classification.getActions().indexOf(translateAction))
+ .setModelName(model)
+ .build();
+ }
}
/**
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 780fe8d821d6..8029cf0eb50e 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -456,6 +456,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private TextClassifier mTextClassifier;
private TextClassifier mTextClassificationSession;
+ private TextClassificationContext mTextClassificationContext;
// A flag to prevent repeated movements from escaping the enclosing text view. The idea here is
// that if a user is holding down a movement key to traverse text, we shouldn't also traverse
@@ -10275,7 +10276,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final ContentCaptureSession session = getContentCaptureSession();
if (session != null) {
// TODO(b/111276913): pass flags when edited by user / add CTS test
- session.notifyViewTextChanged(getAutofillId(), getText(), /* flags= */ 0);
+ session.notifyViewTextChanged(getAutofillId(), getText());
}
}
}
@@ -12068,16 +12069,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
} else {
widgetType = TextClassifier.WIDGET_TYPE_UNSELECTABLE_TEXTVIEW;
}
- final TextClassificationContext textClassificationContext =
- new TextClassificationContext.Builder(
- mContext.getPackageName(), widgetType)
- .build();
+ mTextClassificationContext = new TextClassificationContext.Builder(
+ mContext.getPackageName(), widgetType)
+ .build();
if (mTextClassifier != null) {
mTextClassificationSession = tcm.createTextClassificationSession(
- textClassificationContext, mTextClassifier);
+ mTextClassificationContext, mTextClassifier);
} else {
mTextClassificationSession = tcm.createTextClassificationSession(
- textClassificationContext);
+ mTextClassificationContext);
}
} else {
mTextClassificationSession = TextClassifier.NO_OP;
@@ -12087,6 +12087,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
+ * Returns the {@link TextClassificationContext} for the current TextClassifier session.
+ * @see #getTextClassificationSession()
+ */
+ @Nullable
+ TextClassificationContext getTextClassificationContext() {
+ return mTextClassificationContext;
+ }
+
+ /**
* Returns true if this TextView uses a no-op TextClassifier.
*/
boolean usesNoOpTextClassifier() {
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 299801a1b8fc..46f42f7864c5 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -24,6 +24,7 @@ import android.app.prediction.AppPredictor;
import android.app.prediction.AppTarget;
import android.app.prediction.AppTargetEvent;
import android.app.prediction.AppTargetId;
+import android.content.ClipData;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -41,9 +42,13 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.database.DataSetObserver;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.Path;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
+import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
@@ -62,7 +67,9 @@ import android.service.chooser.ChooserTargetService;
import android.service.chooser.IChooserTargetResult;
import android.service.chooser.IChooserTargetService;
import android.text.TextUtils;
+import android.util.AttributeSet;
import android.util.Log;
+import android.util.Size;
import android.util.Slog;
import android.view.LayoutInflater;
import android.view.View;
@@ -73,9 +80,11 @@ import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Space;
+import android.widget.TextView;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
@@ -85,6 +94,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.google.android.collect.Lists;
import java.io.File;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -262,16 +272,31 @@ public class ChooserActivity extends ResolverActivity {
}
mReplacementExtras = intent.getBundleExtra(Intent.EXTRA_REPLACEMENT_EXTRAS);
- CharSequence title = intent.getCharSequenceExtra(Intent.EXTRA_TITLE);
+
+ // Do not allow the title to be changed when sharing content
+ CharSequence title = null;
+ if (target != null) {
+ String targetAction = target.getAction();
+ if (!(Intent.ACTION_SEND.equals(targetAction) || Intent.ACTION_SEND_MULTIPLE.equals(
+ targetAction))) {
+ title = intent.getCharSequenceExtra(Intent.EXTRA_TITLE);
+ } else {
+ Log.w(TAG, "Ignoring intent's EXTRA_TITLE, deprecated in P. You may wish to set a"
+ + " preview title by using EXTRA_TITLE property of the wrapped"
+ + " EXTRA_INTENT.");
+ }
+ }
+
int defaultTitleRes = 0;
if (title == null) {
defaultTitleRes = com.android.internal.R.string.chooseActivity;
}
+
Parcelable[] pa = intent.getParcelableArrayExtra(Intent.EXTRA_INITIAL_INTENTS);
Intent[] initialIntents = null;
if (pa != null) {
initialIntents = new Intent[pa.length];
- for (int i=0; i<pa.length; i++) {
+ for (int i = 0; i < pa.length; i++) {
if (!(pa[i] instanceof Intent)) {
Log.w(TAG, "Initial intent #" + i + " not an Intent: " + pa[i]);
finish();
@@ -364,6 +389,68 @@ public class ChooserActivity extends ResolverActivity {
}
}
+ /**
+ * Override method to add content preview area, specific to the chooser activity.
+ */
+ @Override
+ public void setHeader() {
+ super.setHeader();
+
+ Intent targetIntent = getTargetIntent();
+ if (targetIntent == null) {
+ return;
+ }
+
+ ViewGroup contentPreviewLayout = findViewById(R.id.content_preview);
+ String action = targetIntent.getAction();
+ if (!(Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action))) {
+ contentPreviewLayout.setVisibility(View.GONE);
+ return;
+ }
+
+ showDefaultContentPreview(contentPreviewLayout, targetIntent);
+ }
+
+ private void showDefaultContentPreview(final ViewGroup parentLayout,
+ final Intent targetIntent) {
+ CharSequence sharingText = targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT);
+ TextView previewTextView = findViewById(R.id.content_preview_text);
+ if (sharingText == null) {
+ previewTextView.setVisibility(View.GONE);
+ } else {
+ previewTextView.setText(sharingText);
+ }
+
+ String previewTitle = targetIntent.getStringExtra(Intent.EXTRA_TITLE);
+ TextView previewTitleView = findViewById(R.id.content_preview_title);
+ if (previewTitle == null) {
+ previewTitleView.setVisibility(View.GONE);
+ } else {
+ previewTitleView.setText(previewTitle);
+ }
+
+ ClipData previewData = targetIntent.getClipData();
+ Uri previewThumbnail = null;
+ if (previewData != null) {
+ if (previewData.getItemCount() > 0) {
+ ClipData.Item previewDataItem = previewData.getItemAt(0);
+ previewThumbnail = previewDataItem.getUri();
+ }
+ }
+
+ ImageView previewThumbnailView = findViewById(R.id.content_preview_thumbnail);
+ if (previewThumbnail == null) {
+ previewThumbnailView.setVisibility(View.GONE);
+ } else {
+ Bitmap bmp = loadThumbnail(previewThumbnail, new Size(200, 200));
+ if (bmp == null) {
+ previewThumbnailView.setVisibility(View.GONE);
+ } else {
+ previewThumbnailView.setImageBitmap(bmp);
+ }
+ }
+ }
+
static SharedPreferences getPinnedSharedPrefs(Context context) {
// The code below is because in the android:ui process, no one can hear you scream.
// The package info in the context isn't initialized in the way it is for normal apps,
@@ -630,15 +717,19 @@ public class ChooserActivity extends ResolverActivity {
}
}
if (targetsToQuery >= QUERY_TARGET_SERVICE_LIMIT) {
- if (DEBUG) Log.d(TAG, "queryTargets hit query target limit "
- + QUERY_TARGET_SERVICE_LIMIT);
+ if (DEBUG) {
+ Log.d(TAG, "queryTargets hit query target limit "
+ + QUERY_TARGET_SERVICE_LIMIT);
+ }
break;
}
}
if (!mServiceConnections.isEmpty()) {
- if (DEBUG) Log.d(TAG, "queryTargets setting watchdog timer for "
- + WATCHDOG_TIMEOUT_MILLIS + "ms");
+ if (DEBUG) {
+ Log.d(TAG, "queryTargets setting watchdog timer for "
+ + WATCHDOG_TIMEOUT_MILLIS + "ms");
+ }
mChooserHandler.sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT,
WATCHDOG_TIMEOUT_MILLIS);
} else {
@@ -969,6 +1060,20 @@ public class ChooserActivity extends ResolverActivity {
mLaunchedFromUid);
}
+ @VisibleForTesting
+ protected Bitmap loadThumbnail(Uri uri, Size size) {
+ if (uri == null || size == null) {
+ return null;
+ }
+
+ try {
+ return getContentResolver().loadThumbnail(uri, size, null);
+ } catch (IOException | NullPointerException ex) {
+ Log.w(TAG, "Error loading preview thumbnail for uri: " + uri.toString(), ex);
+ }
+ return null;
+ }
+
final class ChooserTargetInfo implements TargetInfo {
private final DisplayResolveInfo mSourceInfo;
private final ResolveInfo mBackupResolveInfo;
@@ -1247,7 +1352,7 @@ public class ChooserActivity extends ResolverActivity {
UserManager userManager =
(UserManager) getSystemService(Context.USER_SERVICE);
if (ii instanceof LabeledIntent) {
- LabeledIntent li = (LabeledIntent)ii;
+ LabeledIntent li = (LabeledIntent) ii;
ri.resolvePackageName = li.getSourcePackage();
ri.labelRes = li.getLabelResource();
ri.nonLocalizedLabel = li.getNonLocalizedLabel();
@@ -1391,8 +1496,10 @@ public class ChooserActivity extends ResolverActivity {
}
public void addServiceResults(DisplayResolveInfo origTarget, List<ChooserTarget> targets) {
- if (DEBUG) Log.d(TAG, "addServiceResults " + origTarget + ", " + targets.size()
- + " targets");
+ if (DEBUG) {
+ Log.d(TAG, "addServiceResults " + origTarget + ", " + targets.size()
+ + " targets");
+ }
if (mTargetsNeedPruning && targets.size() > 0) {
// First proper update since we got an onListRebuilt() with (transient) 0 items.
@@ -1492,8 +1599,9 @@ public class ChooserActivity extends ResolverActivity {
public int getCount() {
return (int) (
getCallerTargetRowCount()
- + getServiceTargetRowCount()
- + Math.ceil((float) mChooserListAdapter.getStandardTargetCount() / mColumnCount)
+ + getServiceTargetRowCount()
+ + Math.ceil(
+ (float) mChooserListAdapter.getStandardTargetCount() / mColumnCount)
);
}
@@ -1860,7 +1968,7 @@ public class ChooserActivity extends ResolverActivity {
final int chooserTargetRows = mChooserRowAdapter.getServiceTargetRowCount();
int offset = 0;
- for (int i = 0; i < chooserTargetRows; i++) {
+ for (int i = 0; i < chooserTargetRows; i++) {
final int pos = mChooserRowAdapter.getCallerTargetRowCount() + i;
final int vt = mChooserRowAdapter.getItemViewType(pos);
if (vt != mCachedViewType) {
@@ -1882,4 +1990,65 @@ public class ChooserActivity extends ResolverActivity {
mResolverDrawerLayout.setCollapsibleHeightReserved(offset);
}
}
+
+
+ /**
+ * Used internally to round image corners while obeying view padding.
+ */
+ public static class RoundedRectImageView extends ImageView {
+ private int mRadius = 0;
+ private Path mPath = new Path();
+
+ public RoundedRectImageView(Context context) {
+ super(context);
+ }
+
+ public RoundedRectImageView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public RoundedRectImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public RoundedRectImageView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ mRadius = context.getResources().getDimensionPixelSize(R.dimen.chooser_corner_radius);
+ }
+
+ private void updatePath(int width, int height) {
+ mPath.reset();
+
+ int imageWidth = width - getPaddingLeft() - getPaddingRight();
+ int imageHeight = height - getPaddingTop() - getPaddingBottom();
+ mPath.addRoundRect(getPaddingLeft(), getPaddingTop(), imageWidth, imageHeight, mRadius,
+ mRadius, Path.Direction.CW);
+ }
+
+ /**
+ * Sets the corner radius on all corners
+ *
+ * param radius 0 for no radius, &gt; 0 for a visible corner radius
+ */
+ public void setRadius(int radius) {
+ mRadius = radius;
+ updatePath(getWidth(), getHeight());
+ }
+
+ @Override
+ protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+ super.onSizeChanged(width, height, oldWidth, oldHeight);
+ updatePath(width, height);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mRadius != 0) {
+ canvas.clipPath(mPath);
+ }
+
+ super.onDraw(canvas);
+ }
+ }
}
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index a50c736e195e..091991130391 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -1044,7 +1044,10 @@ public class ResolverActivity extends Activity {
}
}
- public void setTitleAndIcon() {
+ /**
+ * Configure the area above the app selection list (title, content preview, etc).
+ */
+ public void setHeader() {
if (mAdapter.getCount() == 0 && mAdapter.mPlaceholderCount == 0) {
final TextView titleView = findViewById(R.id.title);
if (titleView != null) {
@@ -1062,23 +1065,6 @@ public class ResolverActivity extends Activity {
titleView.setText(title);
}
setTitle(title);
-
- // Try to initialize the title icon if we have a view for it and a title to match
- final ImageView titleIcon = findViewById(R.id.title_icon);
- if (titleIcon != null) {
- ApplicationInfo ai = null;
- try {
- if (!TextUtils.isEmpty(mReferrerPackage)) {
- ai = mPm.getApplicationInfo(mReferrerPackage, 0);
- }
- } catch (NameNotFoundException e) {
- Log.e(TAG, "Could not find referrer package " + mReferrerPackage);
- }
-
- if (ai != null) {
- titleIcon.setImageDrawable(ai.loadIcon(mPm));
- }
- }
}
final ImageView iconView = findViewById(R.id.icon);
@@ -1692,7 +1678,7 @@ public class ResolverActivity extends Activity {
mPostListReadyRunnable = new Runnable() {
@Override
public void run() {
- setTitleAndIcon();
+ setHeader();
resetButtonBar();
onListRebuilt();
mPostListReadyRunnable = null;
diff --git a/core/java/com/android/internal/os/AppZygoteInit.java b/core/java/com/android/internal/os/AppZygoteInit.java
index afe6dade62ac..6ba584d76ee8 100644
--- a/core/java/com/android/internal/os/AppZygoteInit.java
+++ b/core/java/com/android/internal/os/AppZygoteInit.java
@@ -73,6 +73,9 @@ class AppZygoteInit {
Log.i(TAG, "Beginning application preload for " + appInfo.packageName);
LoadedApk loadedApk = new LoadedApk(null, appInfo, null, null, false, true, false);
ClassLoader loader = loadedApk.getClassLoader();
+
+ Zygote.allowAppFilesAcrossFork(appInfo);
+
Class<?> cl;
Method m;
try {
diff --git a/core/java/com/android/internal/os/ChildZygoteInit.java b/core/java/com/android/internal/os/ChildZygoteInit.java
index a052a3b3ab6a..cc74863632dd 100644
--- a/core/java/com/android/internal/os/ChildZygoteInit.java
+++ b/core/java/com/android/internal/os/ChildZygoteInit.java
@@ -98,9 +98,11 @@ public class ChildZygoteInit {
throw new RuntimeException("Passed in UID range is invalid, min > max.");
}
- // Verify the UIDs are in the isolated UID range, as that's the only thing that we should
- // be forking right now
- if (!Process.isIsolated(uidGidMin) || !Process.isIsolated(uidGidMax)) {
+ // Verify the UIDs at least do not include system UIDs; we can't easily verify there
+ // are just isolated UIDs in the range, because for the webview zygote, there is no
+ // single range that captures all possible isolated UIDs.
+ // TODO(b/123615476) narrow this down
+ if (uidGidMin < Process.FIRST_ISOLATED_UID) {
throw new RuntimeException("Passed in UID range does not map to isolated processes.");
}
diff --git a/core/java/com/android/internal/os/OWNERS b/core/java/com/android/internal/os/OWNERS
new file mode 100644
index 000000000000..928310549e6e
--- /dev/null
+++ b/core/java/com/android/internal/os/OWNERS
@@ -0,0 +1 @@
+per-file ZygoteArguments.java,ZygoteConnection.java,ZygoteInit.java,Zygote.java,ZygoteServer.java = chriswailes@google.com, ngeoffray@google.com, sehr@google.com, narayan@google.com, maco@google.com
diff --git a/core/java/com/android/internal/os/RoSystemProperties.java b/core/java/com/android/internal/os/RoSystemProperties.java
index b529bbe51e93..f4902d46992b 100644
--- a/core/java/com/android/internal/os/RoSystemProperties.java
+++ b/core/java/com/android/internal/os/RoSystemProperties.java
@@ -17,6 +17,7 @@
package com.android.internal.os;
import android.os.SystemProperties;
+import android.sysprop.CryptoProperties;
/**
* This is a cache of various ro.* properties so that they can be read just once
@@ -61,7 +62,7 @@ public class RoSystemProperties {
// ------ ro.crypto.* -------- //
public static final String CRYPTO_STATE = SystemProperties.get("ro.crypto.state");
- public static final String CRYPTO_TYPE = SystemProperties.get("ro.crypto.type");
+ public static final String CRYPTO_TYPE = CryptoProperties.type().orElse("");
// These are pseudo-properties
public static final boolean CRYPTO_ENCRYPTABLE =
!CRYPTO_STATE.isEmpty() && !"unsupported".equals(CRYPTO_STATE);
diff --git a/core/java/com/android/internal/os/WebViewZygoteInit.java b/core/java/com/android/internal/os/WebViewZygoteInit.java
index c8d30b27d4dc..9ed738406707 100644
--- a/core/java/com/android/internal/os/WebViewZygoteInit.java
+++ b/core/java/com/android/internal/os/WebViewZygoteInit.java
@@ -78,18 +78,7 @@ class WebViewZygoteInit {
ClassLoader loader = loadedApk.getClassLoader();
doPreload(loader, WebViewFactory.getWebViewLibrary(appInfo));
- // Add the APK to the Zygote's list of allowed files for children.
- Zygote.nativeAllowFileAcrossFork(appInfo.sourceDir);
- if (appInfo.splitSourceDirs != null) {
- for (String path : appInfo.splitSourceDirs) {
- Zygote.nativeAllowFileAcrossFork(path);
- }
- }
- if (appInfo.sharedLibraryFiles != null) {
- for (String path : appInfo.sharedLibraryFiles) {
- Zygote.nativeAllowFileAcrossFork(path);
- }
- }
+ Zygote.allowAppFilesAcrossFork(appInfo);
Log.i(TAG, "Application preload done");
}
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index bc7cf8755786..474d4d7cd90e 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -20,6 +20,7 @@ import static android.system.OsConstants.O_CLOEXEC;
import static com.android.internal.os.ZygoteConnectionConstants.MAX_ZYGOTE_ARGC;
+import android.content.pm.ApplicationInfo;
import android.net.Credentials;
import android.net.LocalServerSocket;
import android.net.LocalSocket;
@@ -370,6 +371,27 @@ public final class Zygote {
protected static native void nativeAllowFileAcrossFork(String path);
/**
+ * Lets children of the zygote inherit open file descriptors that belong to the
+ * ApplicationInfo that is passed in.
+ *
+ * @param appInfo ApplicationInfo of the application
+ */
+ protected static void allowAppFilesAcrossFork(ApplicationInfo appInfo) {
+ Zygote.nativeAllowFileAcrossFork(appInfo.sourceDir);
+ if (appInfo.splitSourceDirs != null) {
+ for (String path : appInfo.splitSourceDirs) {
+ Zygote.nativeAllowFileAcrossFork(path);
+ }
+ }
+ // As well as its shared libs
+ if (appInfo.sharedLibraryFiles != null) {
+ for (String path : appInfo.sharedLibraryFiles) {
+ Zygote.nativeAllowFileAcrossFork(path);
+ }
+ }
+ }
+
+ /**
* Installs a seccomp filter that limits setresuid()/setresgid() to the passed-in range
* @param uidGidMin The smallest allowed uid/gid
* @param uidGidMax The largest allowed uid/gid
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 9afd5d0bff03..51a3b48e58ec 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -301,6 +301,7 @@ cc_library_shared {
"libhwui",
"libdl",
"libstatslog",
+ "server_configurable_flags",
],
generated_sources: ["android_util_StatsLog.cpp"],
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index c90071a0de44..49598bbb5ada 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -31,6 +31,7 @@
#include <binder/Parcel.h>
#include <utils/threads.h>
#include <cutils/properties.h>
+#include <server_configurable_flags/get_flags.h>
#include <SkGraphics.h>
@@ -774,7 +775,17 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
addOption("-XX:LowMemoryMode");
}
- parseRuntimeOption("dalvik.vm.gctype", gctypeOptsBuf, "-Xgc:");
+ std::string gc_type_override =
+ server_configurable_flags::GetServerConfigurableFlag("runtime_native", "gctype", "");
+ std::string gc_type_override_temp;
+ if (gc_type_override.empty()) {
+ parseRuntimeOption("dalvik.vm.gctype", gctypeOptsBuf, "-Xgc:");
+ } else {
+ // Copy the string so it doesn't go out of scope since addOption does not make a copy.
+ gc_type_override_temp = "-Xgc:" + gc_type_override;
+ addOption(gc_type_override_temp.c_str());
+ }
+
parseRuntimeOption("dalvik.vm.backgroundgctype", backgroundgcOptsBuf, "-XX:BackgroundGC=");
/*
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index a365a566f038..86342c47c455 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -4,3 +4,6 @@ per-file *Camera*,*camera* = shuzhenwang@google.com, yinchiayeh@google.com, zhij
# Connectivity
per-file android_net_* = ek@google.com, lorenzo@google.com, satk@google.com
+
+# Zygote
+per-file com_android_inernal_os_Zygote.*,fd_utils.* = chriswailes@google.com, ngeoffray@google.com, sehr@google.com, narayan@google.com, maco@google.com
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index c74797b60e69..d215f965b3c2 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -986,6 +986,19 @@ static jint Bitmap_getPixel(JNIEnv* env, jobject, jlong bitmapHandle,
return static_cast<jint>(dst);
}
+static jlong Bitmap_getColor(JNIEnv* env, jobject, jlong bitmapHandle,
+ jint x, jint y) {
+ SkBitmap bitmap;
+ reinterpret_cast<BitmapWrapper*>(bitmapHandle)->getSkBitmap(&bitmap);
+
+ SkImageInfo dstInfo = SkImageInfo::Make(
+ 1, 1, kRGBA_F16_SkColorType, kUnpremul_SkAlphaType, bitmap.refColorSpace());
+
+ uint64_t dst;
+ bitmap.readPixels(dstInfo, &dst, dstInfo.minRowBytes(), x, y);
+ return static_cast<jlong>(dst);
+}
+
static void Bitmap_getPixels(JNIEnv* env, jobject, jlong bitmapHandle,
jintArray pixelArray, jint offset, jint stride,
jint x, jint y, jint width, jint height) {
@@ -1231,6 +1244,7 @@ static const JNINativeMethod gBitmapMethods[] = {
(void*)Bitmap_extractAlpha },
{ "nativeGenerationId", "(J)I", (void*)Bitmap_getGenerationId },
{ "nativeGetPixel", "(JII)I", (void*)Bitmap_getPixel },
+ { "nativeGetColor", "(JII)J", (void*)Bitmap_getColor },
{ "nativeGetPixels", "(J[IIIIIII)V", (void*)Bitmap_getPixels },
{ "nativeSetPixel", "(JIII)V", (void*)Bitmap_setPixel },
{ "nativeSetPixels", "(J[IIIIIII)V", (void*)Bitmap_setPixels },
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index fc9ea76f6ed3..9c48c33dc2ed 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -222,6 +222,18 @@ static void drawColor(JNIEnv* env, jobject, jlong canvasHandle, jint color, jint
get_canvas(canvasHandle)->drawColor(color, mode);
}
+static void drawColorLong(JNIEnv* env, jobject, jlong canvasHandle, jlong colorSpaceHandle,
+ jlong colorLong, jint modeHandle) {
+ SkColor4f color = GraphicsJNI::convertColorLong(colorLong);
+ sk_sp<SkColorSpace> cs = GraphicsJNI::getNativeColorSpace(colorSpaceHandle);
+ SkPaint p;
+ p.setColor4f(color, cs.get());
+
+ SkBlendMode mode = static_cast<SkBlendMode>(modeHandle);
+ p.setBlendMode(mode);
+ get_canvas(canvasHandle)->drawPaint(p);
+}
+
static void drawPaint(JNIEnv* env, jobject, jlong canvasHandle, jlong paintHandle) {
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
get_canvas(canvasHandle)->drawPaint(*paint);
@@ -677,6 +689,7 @@ static const JNINativeMethod gMethods[] = {
// If called from DisplayListCanvas they are @FastNative
static const JNINativeMethod gDrawMethods[] = {
{"nDrawColor","(JII)V", (void*) CanvasJNI::drawColor},
+ {"nDrawColor","(JJJI)V", (void*) CanvasJNI::drawColorLong},
{"nDrawPaint","(JJ)V", (void*) CanvasJNI::drawPaint},
{"nDrawPoint", "(JFFJ)V", (void*) CanvasJNI::drawPoint},
{"nDrawPoints", "(J[FIIJ)V", (void*) CanvasJNI::drawPoints},
diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp
index c0e45b12cf76..67a74419e771 100644
--- a/core/jni/android_hardware_input_InputWindowHandle.cpp
+++ b/core/jni/android_hardware_input_InputWindowHandle.cpp
@@ -55,6 +55,7 @@ static struct {
jfieldID ownerUid;
jfieldID inputFeatures;
jfieldID displayId;
+ jfieldID portalToDisplayId;
} gInputWindowHandleClassInfo;
static Mutex gHandleMutex;
@@ -154,6 +155,8 @@ bool NativeInputWindowHandle::updateInfo() {
gInputWindowHandleClassInfo.inputFeatures);
mInfo.displayId = env->GetIntField(obj,
gInputWindowHandleClassInfo.displayId);
+ mInfo.portalToDisplayId = env->GetIntField(obj,
+ gInputWindowHandleClassInfo.portalToDisplayId);
jobject inputApplicationHandleObj = env->GetObjectField(obj,
gInputWindowHandleClassInfo.inputApplicationHandle);
@@ -307,6 +310,9 @@ int register_android_view_InputWindowHandle(JNIEnv* env) {
GET_FIELD_ID(gInputWindowHandleClassInfo.displayId, clazz,
"displayId", "I");
+
+ GET_FIELD_ID(gInputWindowHandleClassInfo.portalToDisplayId, clazz,
+ "portalToDisplayId", "I");
return 0;
}
diff --git a/core/jni/android_media_AudioAttributes.cpp b/core/jni/android_media_AudioAttributes.cpp
index 4be4def4a87b..b87a34d6c7aa 100644
--- a/core/jni/android_media_AudioAttributes.cpp
+++ b/core/jni/android_media_AudioAttributes.cpp
@@ -135,7 +135,7 @@ JNIAudioAttributeHelper::UniqueAaPtr JNIAudioAttributeHelper::makeUnique()
{
audio_attributes_t *aa = new (calloc(1, sizeof(audio_attributes_t)))
audio_attributes_t{AUDIO_ATTRIBUTES_INITIALIZER};
- return UniqueAaPtr{aa, free};
+ return UniqueAaPtr{aa};
}
jint JNIAudioAttributeHelper::nativeFromJava(JNIEnv* env, jobject jAudioAttributes,
diff --git a/core/jni/android_media_AudioAttributes.h b/core/jni/android_media_AudioAttributes.h
index c55835222086..628f7e3469e8 100644
--- a/core/jni/android_media_AudioAttributes.h
+++ b/core/jni/android_media_AudioAttributes.h
@@ -27,7 +27,11 @@ namespace android {
class JNIAudioAttributeHelper
{
public:
- using UniqueAaPtr = std::unique_ptr<audio_attributes_t, decltype(free)*>;
+ struct FreeDeleter {
+ void operator()(void *p) const { ::free(p); }
+ };
+
+ using UniqueAaPtr = std::unique_ptr<audio_attributes_t, FreeDeleter>;
/**
* @brief makeUnique helper to prevent leak
diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index e64d2afe7bf3..ee11b6162db0 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -96,7 +96,7 @@ static jobjectArray android_os_VintfObject_report(JNIEnv* env, jclass)
return toJavaStringArray(env, cStrings);
}
-static jint verify(JNIEnv* env, jobjectArray packageInfo, android::vintf::CheckFlags::Type checks) {
+static jint android_os_VintfObject_verify(JNIEnv* env, jclass, jobjectArray packageInfo) {
std::vector<std::string> cPackageInfo;
if (packageInfo) {
size_t count = env->GetArrayLength(packageInfo);
@@ -109,18 +109,19 @@ static jint verify(JNIEnv* env, jobjectArray packageInfo, android::vintf::CheckF
}
}
std::string error;
- int32_t status = VintfObject::CheckCompatibility(cPackageInfo, &error, checks);
+ int32_t status = VintfObject::CheckCompatibility(cPackageInfo, &error);
if (status)
LOG(WARNING) << "VintfObject.verify() returns " << status << ": " << error;
return status;
}
-static jint android_os_VintfObject_verify(JNIEnv* env, jclass, jobjectArray packageInfo) {
- return verify(env, packageInfo, ::android::vintf::CheckFlags::ENABLE_ALL_CHECKS);
-}
-
static jint android_os_VintfObject_verifyWithoutAvb(JNIEnv* env, jclass) {
- return verify(env, nullptr, ::android::vintf::CheckFlags::DISABLE_AVB_CHECK);
+ std::string error;
+ int32_t status = VintfObject::CheckCompatibility({}, &error,
+ ::android::vintf::CheckFlags::DISABLE_AVB_CHECK);
+ if (status)
+ LOG(WARNING) << "VintfObject.verifyWithoutAvb() returns " << status << ": " << error;
+ return status;
}
static jobjectArray android_os_VintfObject_getHalNamesAndVersions(JNIEnv* env, jclass) {
diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto
index 94a6734b69c8..f2f7304a2e4a 100644
--- a/core/proto/android/app/settings_enums.proto
+++ b/core/proto/android/app/settings_enums.proto
@@ -2189,4 +2189,9 @@ enum PageId {
// OPEN: Settings > System > Aware > Disable > Dialog
DIALOG_AWARE_DISABLE = 1633;
+
+ // OPEN: Settings > Settings > Network & internet > Click Mobile network to land on page with
+ // details for a SIM/eSIM mobile network > Click edit icon to bring up a rename dialog.
+ // OS: Q
+ MOBILE_NETWORK_RENAME_DIALOG = 1642;
}
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index e0eaf14d24c8..a160451ecfed 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -230,8 +230,6 @@ message GlobalSettingsProto {
}
optional Connectivity connectivity = 32;
- reserved 145; // Used to be ContentCapture, which moved to DeviceConfig
-
optional SettingProto contact_metadata_sync_enabled = 33 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto contacts_database_wal_enabled = 34 [ (android.privacy).dest = DEST_AUTOMATIC ];
@@ -999,7 +997,7 @@ message GlobalSettingsProto {
optional SettingProto watchdog_poor_network_test_enabled = 22 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto suspend_optimizations_enabled = 23 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto verbose_logging_enabled = 24 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto connected_mac_randomization_enabled = 25 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ reserved 25; // connected_mac_randomization_enabled
optional SettingProto max_dhcp_retry_count = 26 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto mobile_data_transition_wakelock_timeout_ms = 27 [ (android.privacy).dest = DEST_AUTOMATIC ];
// Controls whether WiFi configurations created by a Device Owner app should
@@ -1039,5 +1037,5 @@ message GlobalSettingsProto {
// Please insert fields in alphabetical order and group them into messages
// if possible (to avoid reaching the method limit).
- // Next tag = 149;
+ // Next tag = 145 then 149; // (145 was removed)
}
diff --git a/core/res/res/layout/chooser_grid.xml b/core/res/res/layout/chooser_grid.xml
index ded2b3569952..c42f43ac0df5 100644
--- a/core/res/res/layout/chooser_grid.xml
+++ b/core/res/res/layout/chooser_grid.xml
@@ -29,8 +29,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alwaysShow="true"
- android:elevation="8dp"
- android:paddingStart="16dp"
android:background="?attr/colorBackgroundFloating" >
<TextView android:id="@+id/profile_button"
android:layout_width="wrap_content"
@@ -46,25 +44,66 @@
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:singleLine="true"/>
- <ImageView android:id="@+id/title_icon"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_marginEnd="16dp"
- android:visibility="gone"
- android:scaleType="fitCenter"
- android:layout_below="@id/profile_button"
- android:layout_alignParentLeft="true"/>
+
<TextView android:id="@+id/title"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textAppearance="?attr/textAppearanceMedium"
- android:textSize="14sp"
- android:gravity="start|center_vertical"
+ android:textSize="20sp"
+ android:gravity="center"
android:paddingEnd="?attr/dialogPreferredPadding"
android:paddingTop="12dp"
- android:paddingBottom="12dp"
+ android:paddingBottom="6dp"
android:layout_below="@id/profile_button"
- android:layout_toRightOf="@id/title_icon"/>
+ android:layout_centerHorizontal="true"/>
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/content_preview"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?attr/colorBackgroundFloating">
+
+ <view class="com.android.internal.app.ChooserActivity$RoundedRectImageView"
+ android:id="@+id/content_preview_thumbnail"
+ android:layout_alignParentTop="true"
+ android:layout_width="100dp"
+ android:layout_height="wrap_content"
+ android:layout_alignParentStart="true"
+ android:gravity="center"
+ android:adjustViewBounds="true"
+ android:maxWidth="90dp"
+ android:maxHeight="90dp"
+ android:scaleType="fitCenter"
+ android:padding="5dp"/>
+
+ <TextView
+ android:id="@+id/content_preview_title"
+ android:layout_alignParentTop="true"
+ android:layout_toEndOf="@id/content_preview_thumbnail"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="start|top"
+ android:textAppearance="?attr/textAppearanceMedium"
+ android:maxLines="2"
+ android:ellipsize="end"
+ android:paddingStart="15dp"
+ android:paddingEnd="15dp"
+ android:paddingTop="10dp" />
+
+ <TextView
+ android:id="@+id/content_preview_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/content_preview_title"
+ android:layout_toEndOf="@id/content_preview_thumbnail"
+ android:gravity="start|top"
+ android:maxLines="2"
+ android:ellipsize="end"
+ android:paddingStart="15dp"
+ android:paddingEnd="15dp"
+ android:paddingTop="10dp"
+ android:paddingBottom="5dp"/>
</RelativeLayout>
<ListView
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 67b06525a7e4..eb214bab2a4e 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -712,6 +712,9 @@
<!-- Indicates that connected MAC randomization is supported on this device -->
<bool translatable="false" name="config_wifi_connected_mac_randomization_supported">false</bool>
+ <!-- Indicates that wifi link probing is supported on this device -->
+ <bool translatable="false" name="config_wifi_link_probing_supported">false</bool>
+
<!-- Flag indicating whether we should enable the automatic brightness.
Software implementation will be used if config_hardware_auto_brightness_available is not set -->
<bool name="config_automatic_brightness_available">false</bool>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index c8706838df57..ef3834cccc15 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -714,4 +714,7 @@
<dimen name="harmful_app_message_padding_bottom">24dp</dimen>
<!-- Line spacing modifier for the message field of the harmful app dialog -->
<item name="harmful_app_message_line_spacing_modifier" type="dimen">1.22</item>
+
+ <!-- chooser corner radius -->
+ <dimen name="chooser_corner_radius">4dp</dimen>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index a761baf95b0d..6adb4a711857 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3082,7 +3082,7 @@
<!-- Label for a link to a intent resolver dialog when selecting an editor application -->
<string name="whichEditApplicationLabel">Edit</string>
<!-- Title of intent resolver dialog when selecting a sharing application to run. -->
- <string name="whichSendApplication">Share with</string>
+ <string name="whichSendApplication">Share</string>
<!-- Title of intent resolver dialog when selecting a sharing application to run
and a previously used application is known. -->
<string name="whichSendApplicationNamed">Share with %1$s</string>
diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml
index 79afe697c504..0dc54e091f9d 100644
--- a/core/res/res/values/styles_device_defaults.xml
+++ b/core/res/res/values/styles_device_defaults.xml
@@ -374,7 +374,9 @@ easier.
<style name="TextAppearance.DeviceDefault.Caption" parent="TextAppearance.Material.Caption">
<item name="fontFamily">@string/config_bodyFontFamily</item>
</style>
- <style name="TextAppearance.DeviceDefault.ListItem" parent="TextAppearance.DeviceDefault.Subhead"/>
+ <style name="TextAppearance.DeviceDefault.ListItem" parent="TextAppearance.DeviceDefault.Subhead">
+ <item name="fontFamily">@string/config_headlineFontFamily</item>
+ </style>
<style name="TextAppearance.DeviceDefault.ListItemSecondary" parent="TextAppearance.DeviceDefault.Body1"/>
<!-- Preference Styles -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ca8e226a9911..5400d94ed033 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -50,6 +50,10 @@
<java-symbol type="id" name="characterPicker" />
<java-symbol type="id" name="clearDefaultHint" />
<java-symbol type="id" name="contentPanel" />
+ <java-symbol type="id" name="content_preview" />
+ <java-symbol type="id" name="content_preview_thumbnail" />
+ <java-symbol type="id" name="content_preview_text" />
+ <java-symbol type="id" name="content_preview_title" />
<java-symbol type="id" name="current_scene" />
<java-symbol type="id" name="scene_layoutid_cache" />
<java-symbol type="id" name="customPanel" />
@@ -1906,6 +1910,7 @@
<java-symbol type="bool" name="config_wifi_convert_apband_5ghz_to_any" />
<java-symbol type="bool" name="config_wifi_local_only_hotspot_5ghz" />
<java-symbol type="bool" name="config_wifi_connected_mac_randomization_supported" />
+ <java-symbol type="bool" name="config_wifi_link_probing_supported" />
<java-symbol type="bool" name="config_wifi_fast_bss_transition_enabled" />
<java-symbol type="bool" name="config_wimaxEnabled" />
<java-symbol type="bool" name="show_ongoing_ime_switcher" />
@@ -2703,9 +2708,9 @@
<java-symbol type="layout" name="date_picker_month_item_material" />
<java-symbol type="id" name="month_view" />
<java-symbol type="integer" name="config_zen_repeat_callers_threshold" />
+ <java-symbol type="dimen" name="chooser_corner_radius" />
<java-symbol type="layout" name="chooser_grid" />
<java-symbol type="layout" name="resolve_grid_item" />
- <java-symbol type="id" name="title_icon" />
<java-symbol type="id" name="day_picker_view_pager" />
<java-symbol type="layout" name="day_picker_content_material" />
<java-symbol type="drawable" name="scroll_indicator_material" />
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index 9d04e6392fd0..6a8105088b88 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -37,7 +37,9 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
mockwebserver \
guava \
androidx.test.runner \
+ androidx.test.ext.junit \
androidx.test.rules \
+ androidx.test.espresso.core \
mockito-target-minus-junit4 \
espresso-core \
ub-uiautomator \
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 86818c611c1f..268bb81e8736 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -62,6 +62,7 @@
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS"/>
+ <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
@@ -1144,6 +1145,14 @@
</intent-filter>
</activity>
+ <activity android:name="android.view.accessibility.AccessibilityTestActivity"
+ android:label="AccessibilityTestActivity" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
<!-- Activity-level metadata -->
<meta-data android:name="com.android.frameworks.coretests.isApp" android:value="true" />
<meta-data android:name="com.android.frameworks.coretests.string" android:value="foo" />
diff --git a/core/tests/coretests/res/layout/accessibility_test.xml b/core/tests/coretests/res/layout/accessibility_test.xml
new file mode 100644
index 000000000000..1bdd21b2acc8
--- /dev/null
+++ b/core/tests/coretests/res/layout/accessibility_test.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <Button android:id="@+id/appNameBtn"
+ android:text="@string/app_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="60dp"
+ android:bufferType="normal">
+ </Button>
+</LinearLayout>
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 0b5bde767ac9..f38abd7cc570 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -509,7 +509,6 @@ public class SettingsBackupTest {
Settings.Global.WIFI_ALWAYS_REQUESTED,
Settings.Global.WIFI_BADGING_THRESHOLDS,
Settings.Global.WIFI_BOUNCE_DELAY_OVERRIDE_MS,
- Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
Settings.Global.WIFI_COUNTRY_CODE,
Settings.Global.WIFI_DATA_STALL_MIN_TX_BAD,
Settings.Global.WIFI_DATA_STALL_MIN_TX_SUCCESS_WITHOUT_RX,
@@ -526,6 +525,7 @@ public class SettingsBackupTest {
Settings.Global.WIFI_LINK_SPEED_METRICS_ENABLED,
Settings.Global.WIFI_PNO_FREQUENCY_CULLING_ENABLED,
Settings.Global.WIFI_PNO_RECENCY_SORTING_ENABLED,
+ Settings.Global.WIFI_LINK_PROBING_ENABLED,
Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT,
Settings.Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS,
Settings.Global.WIFI_NETWORK_SHOW_RSSI,
diff --git a/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java b/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java
new file mode 100644
index 000000000000..d0719cbea86e
--- /dev/null
+++ b/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.app.Service;
+import android.app.UiAutomation;
+import android.graphics.Rect;
+import android.os.SystemClock;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityTestActivity;
+import android.view.accessibility.AccessibilityWindowInfo;
+
+import com.android.compatibility.common.util.TestUtils;
+import com.android.frameworks.coretests.R;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+import java.util.concurrent.TimeoutException;
+
+@RunWith(AndroidJUnit4.class)
+public class AccessibilityInteractionControllerTest {
+ static final long TIMEOUT_DEFAULT = 10000; // 10 seconds
+
+ private static Instrumentation sInstrumentation;
+ private static UiAutomation sUiAutomation;
+
+ @Rule
+ public ActivityTestRule<AccessibilityTestActivity> mActivityRule = new ActivityTestRule<>(
+ AccessibilityTestActivity.class, false, false);
+
+ private AccessibilityInteractionController mAccessibilityInteractionController;
+ private ViewRootImpl mViewRootImpl;
+ private View mButton;
+
+ @BeforeClass
+ public static void oneTimeSetup() {
+ sInstrumentation = InstrumentationRegistry.getInstrumentation();
+ sUiAutomation = sInstrumentation.getUiAutomation();
+ }
+
+ @AfterClass
+ public static void postTestTearDown() {
+ sUiAutomation.destroy();
+ }
+
+ @Before
+ public void setUp() throws Throwable {
+ launchActivity();
+ enableTouchExploration(true);
+ mActivityRule.runOnUiThread(() -> {
+ mViewRootImpl = mActivityRule.getActivity().getWindow().getDecorView()
+ .getViewRootImpl();
+ mButton = mActivityRule.getActivity().findViewById(R.id.appNameBtn);
+ });
+ mAccessibilityInteractionController =
+ mViewRootImpl.getAccessibilityInteractionController();
+ }
+
+ @After
+ public void tearDown() {
+ enableTouchExploration(false);
+ }
+
+ @Test
+ public void clearAccessibilityFocus_shouldClearFocus() throws Exception {
+ performAccessibilityFocus("com.android.frameworks.coretests:id/appNameBtn");
+ assertTrue("Button should have a11y focus",
+ mButton.isAccessibilityFocused());
+ mAccessibilityInteractionController.clearAccessibilityFocusClientThread();
+ sInstrumentation.waitForIdleSync();
+ assertFalse("Button should not have a11y focus",
+ mButton.isAccessibilityFocused());
+ }
+
+ @Test
+ public void clearAccessibilityFocus_uiThread_shouldClearFocus() throws Exception {
+ performAccessibilityFocus("com.android.frameworks.coretests:id/appNameBtn");
+ assertTrue("Button should have a11y focus",
+ mButton.isAccessibilityFocused());
+ sInstrumentation.runOnMainSync(() -> {
+ mAccessibilityInteractionController.clearAccessibilityFocusClientThread();
+ });
+ assertFalse("Button should not have a11y focus",
+ mButton.isAccessibilityFocused());
+ }
+
+ private void launchActivity() {
+ final Object waitObject = new Object();
+ final int[] location = new int[2];
+ final StringBuilder activityPackage = new StringBuilder();
+ final Rect bounds = new Rect();
+ final StringBuilder activityTitle = new StringBuilder();
+ try {
+ final long executionStartTimeMillis = SystemClock.uptimeMillis();
+ sUiAutomation.setOnAccessibilityEventListener((event) -> {
+ if (event.getEventTime() < executionStartTimeMillis) {
+ return;
+ }
+ synchronized (waitObject) {
+ waitObject.notifyAll();
+ }
+ });
+ enableRetrieveAccessibilityWindows();
+
+ final Activity activity = mActivityRule.launchActivity(null);
+ sInstrumentation.runOnMainSync(() -> {
+ activity.getWindow().getDecorView().getLocationOnScreen(location);
+ activityPackage.append(activity.getPackageName());
+ activityTitle.append(activity.getTitle());
+ });
+ sInstrumentation.waitForIdleSync();
+
+ TestUtils.waitOn(waitObject, () -> {
+ final AccessibilityWindowInfo window = findWindowByTitle(activityTitle);
+ if (window == null) return false;
+ window.getBoundsInScreen(bounds);
+ activity.getWindow().getDecorView().getLocationOnScreen(location);
+ if (bounds.isEmpty()) {
+ return false;
+ }
+ return (!bounds.isEmpty())
+ && (bounds.left == location[0]) && (bounds.top == location[1]);
+ }, TIMEOUT_DEFAULT, "Launch Activity");
+ } finally {
+ sUiAutomation.setOnAccessibilityEventListener(null);
+ }
+ }
+
+ private void enableRetrieveAccessibilityWindows() {
+ AccessibilityServiceInfo info = sUiAutomation.getServiceInfo();
+ info.flags |= AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
+ sUiAutomation.setServiceInfo(info);
+ }
+
+ private void enableTouchExploration(boolean enabled) {
+ final Object waitObject = new Object();
+ final AccessibilityManager accessibilityManager =
+ (AccessibilityManager) sInstrumentation.getContext().getSystemService(
+ Service.ACCESSIBILITY_SERVICE);
+ final AccessibilityManager.TouchExplorationStateChangeListener listener = status -> {
+ synchronized (waitObject) {
+ waitObject.notifyAll();
+ }
+ };
+ try {
+ accessibilityManager.addTouchExplorationStateChangeListener(listener);
+ final AccessibilityServiceInfo info = sUiAutomation.getServiceInfo();
+ if (enabled) {
+ info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
+ } else {
+ info.flags &= ~AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
+ }
+ sUiAutomation.setServiceInfo(info);
+ TestUtils.waitOn(waitObject,
+ () -> accessibilityManager.isTouchExplorationEnabled() == enabled,
+ TIMEOUT_DEFAULT,
+ (enabled ? "Enable" : "Disable") + "touch exploration");
+ } finally {
+ accessibilityManager.removeTouchExplorationStateChangeListener(listener);
+ }
+ }
+
+ private void performAccessibilityFocus(String viewId) throws TimeoutException {
+ final AccessibilityNodeInfo node = sUiAutomation.getRootInActiveWindow()
+ .findAccessibilityNodeInfosByViewId(viewId).get(0);
+ // Perform an action and wait for an event
+ sUiAutomation.executeAndWaitForEvent(
+ () -> node.performAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS),
+ event -> event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED,
+ TIMEOUT_DEFAULT);
+ node.refresh();
+ }
+
+ private AccessibilityWindowInfo findWindowByTitle(CharSequence title) {
+ final List<AccessibilityWindowInfo> windows = sUiAutomation.getWindows();
+ AccessibilityWindowInfo returnValue = null;
+ for (int i = 0; i < windows.size(); i++) {
+ final AccessibilityWindowInfo window = windows.get(i);
+ if (TextUtils.equals(title, window.getTitle())) {
+ returnValue = window;
+ } else {
+ window.recycle();
+ }
+ }
+ return returnValue;
+ }
+}
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java
new file mode 100644
index 000000000000..a17fa7326a5d
--- /dev/null
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.accessibility;
+
+import android.app.Activity;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.os.Bundle;
+
+import com.android.frameworks.coretests.R;
+
+/**
+ * An activity for accessibility test.
+ */
+public class AccessibilityTestActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ turnOnScreen();
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.accessibility_test);
+ }
+
+ private void turnOnScreen() {
+ setTurnScreenOn(true);
+ setShowWhenLocked(true);
+ KeyguardManager keyguardManager = (KeyguardManager) getSystemService(
+ Context.KEYGUARD_SERVICE);
+ keyguardManager.requestDismissKeyguard(this, null);
+ }
+}
diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
index bfa6e062b08d..71612e685920 100644
--- a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
@@ -78,7 +78,7 @@ public class ContentCaptureSessionTest {
assertThrows(NullPointerException.class, () -> mSession1.notifyViewAppeared(null));
assertThrows(NullPointerException.class, () -> mSession1.notifyViewDisappeared(null));
assertThrows(NullPointerException.class,
- () -> mSession1.notifyViewTextChanged(null, "whatever", 0));
+ () -> mSession1.notifyViewTextChanged(null, "whatever"));
}
@Test
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java
index 5e58f82038f1..582be9d51731 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java
@@ -21,8 +21,10 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
+import android.app.RemoteAction;
import android.content.Context;
import android.content.Intent;
+import android.os.Bundle;
import android.os.LocaleList;
import android.text.Spannable;
import android.text.SpannableString;
@@ -246,25 +248,31 @@ public class TextClassifierTest {
public void testClassifyText_foreignText() {
LocaleList originalLocales = LocaleList.getDefault();
LocaleList.setDefault(LocaleList.forLanguageTags("en"));
- String foreignText = "これは日本語のテキストです";
+ String japaneseText = "これは日本語のテキストです";
Context context = new FakeContextBuilder()
.setIntentComponent(Intent.ACTION_TRANSLATE, FakeContextBuilder.DEFAULT_COMPONENT)
.build();
TextClassifier classifier = new TextClassifierImpl(context, TC_CONSTANTS);
TextClassification.Request request = new TextClassification.Request.Builder(
- foreignText, 0, foreignText.length())
+ japaneseText, 0, japaneseText.length())
.setDefaultLocales(LOCALES)
.build();
TextClassification classification = classifier.classifyText(request);
+ RemoteAction translateAction = classification.getActions().get(0);
assertEquals(1, classification.getActions().size());
assertEquals(
context.getString(com.android.internal.R.string.translate),
- classification.getActions().get(0).getTitle());
- Intent intent = (Intent) classification.getExtras()
- .getParcelableArrayList(TextClassifierImpl.ACTIONS_INTENTS).get(0);
+ translateAction.getTitle());
+
+ assertEquals(translateAction, ExtrasUtils.findTranslateAction(classification));
+ Intent intent = ExtrasUtils.getActionsIntents(classification).get(0);
assertEquals(Intent.ACTION_TRANSLATE, intent.getAction());
+ Bundle foreignLanguageInfo = ExtrasUtils.getForeignLanguageExtra(classification);
+ assertEquals("ja", ExtrasUtils.getEntityType(foreignLanguageInfo));
+ assertTrue(ExtrasUtils.getScore(foreignLanguageInfo) >= 0);
+ assertTrue(ExtrasUtils.getScore(foreignLanguageInfo) <= 1);
LocaleList.setDefault(originalLocales);
}
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
index aaa624e6b25e..21fcae780b80 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
@@ -16,12 +16,12 @@
package com.android.internal.app;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static com.android.internal.app.ChooserWrapperActivity.sOverrides;
@@ -33,12 +33,18 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.usage.UsageStatsManager;
+import android.content.ClipData;
import android.content.Intent;
import android.content.pm.ResolveInfo;
-
-import androidx.test.InstrumentationRegistry;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.net.Uri;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
-import androidx.test.runner.AndroidJUnit4;
import com.android.internal.R;
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
@@ -69,20 +75,34 @@ public class ChooserActivityTest {
@Test
public void customTitle() throws InterruptedException {
- Intent sendIntent = createSendImageIntent();
+ Intent viewIntent = createViewTextIntent();
List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
Mockito.anyBoolean(),
Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
- mActivityRule.launchActivity(Intent.createChooser(sendIntent, "chooser test"));
+ mActivityRule.launchActivity(Intent.createChooser(viewIntent, "chooser test"));
+
waitForIdle();
onView(withId(R.id.title)).check(matches(withText("chooser test")));
}
@Test
+ public void customTitleIgnoredForSendIntents() throws InterruptedException {
+ Intent sendIntent = createSendTextIntent();
+ List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+ when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+ Mockito.anyBoolean(),
+ Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+ mActivityRule.launchActivity(Intent.createChooser(sendIntent, "chooser test"));
+ waitForIdle();
+ onView(withId(R.id.title)).check(matches(withText(R.string.whichSendApplication)));
+ }
+
+ @Test
public void emptyTitle() throws InterruptedException {
- Intent sendIntent = createSendImageIntent();
+ Intent sendIntent = createSendTextIntent();
List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
@@ -95,8 +115,72 @@ public class ChooserActivityTest {
}
@Test
+ public void emptyPreviewTitleAndThumbnail() throws InterruptedException {
+ Intent sendIntent = createSendTextIntentWithPreview(null, null);
+ List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+ when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+ Mockito.anyBoolean(),
+ Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+ mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
+ waitForIdle();
+ onView(withId(R.id.content_preview_title)).check(matches(not(isDisplayed())));
+ onView(withId(R.id.content_preview_thumbnail)).check(matches(not(isDisplayed())));
+ }
+
+ @Test
+ public void visiblePreviewTitleWithoutThumbnail() throws InterruptedException {
+ String previewTitle = "My Content Preview Title";
+ Intent sendIntent = createSendTextIntentWithPreview(previewTitle, null);
+ List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+ when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+ Mockito.anyBoolean(),
+ Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+ mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
+ waitForIdle();
+ onView(withId(R.id.content_preview_title)).check(matches(isDisplayed()));
+ onView(withId(R.id.content_preview_title)).check(matches(withText(previewTitle)));
+ onView(withId(R.id.content_preview_thumbnail)).check(matches(not(isDisplayed())));
+ }
+
+ @Test
+ public void visiblePreviewTitleWithInvalidThumbnail() throws InterruptedException {
+ String previewTitle = "My Content Preview Title";
+ Intent sendIntent = createSendTextIntentWithPreview(previewTitle,
+ Uri.parse("tel:(+49)12345789"));
+ List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+ when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+ Mockito.anyBoolean(),
+ Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+ mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
+ waitForIdle();
+ onView(withId(R.id.content_preview_title)).check(matches(isDisplayed()));
+ onView(withId(R.id.content_preview_thumbnail)).check(matches(not(isDisplayed())));
+ }
+
+ @Test
+ public void visiblePreviewTitleAndThumbnail() throws InterruptedException {
+ String previewTitle = "My Content Preview Title";
+ Intent sendIntent = createSendTextIntentWithPreview(previewTitle,
+ Uri.parse("android.resource://com.android.frameworks.coretests/"
+ + com.android.frameworks.coretests.R.drawable.test320x240));
+ sOverrides.previewThumbnail = createBitmap();
+ List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
+
+ when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
+ Mockito.anyBoolean(),
+ Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
+ mActivityRule.launchActivity(Intent.createChooser(sendIntent, null));
+ waitForIdle();
+ onView(withId(R.id.content_preview_title)).check(matches(isDisplayed()));
+ onView(withId(R.id.content_preview_thumbnail)).check(matches(isDisplayed()));
+ }
+
+ @Test
public void twoOptionsAndUserSelectsOne() throws InterruptedException {
- Intent sendIntent = createSendImageIntent();
+ Intent sendIntent = createSendTextIntent();
List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
@@ -125,7 +209,7 @@ public class ChooserActivityTest {
@Test
public void updateChooserCountsAndModelAfterUserSelection() throws InterruptedException {
- Intent sendIntent = createSendImageIntent();
+ Intent sendIntent = createSendTextIntent();
List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
@@ -158,7 +242,7 @@ public class ChooserActivityTest {
when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
Mockito.anyBoolean(),
Mockito.isA(List.class))).thenReturn(null);
- Intent sendIntent = createSendImageIntent();
+ Intent sendIntent = createSendTextIntent();
final ChooserWrapperActivity activity = mActivityRule
.launchActivity(Intent.createChooser(sendIntent, null));
waitForIdle();
@@ -186,7 +270,7 @@ public class ChooserActivityTest {
Mockito.anyBoolean(),
Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
- Intent sendIntent = createSendImageIntent();
+ Intent sendIntent = createSendTextIntent();
final ChooserWrapperActivity activity = mActivityRule
.launchActivity(Intent.createChooser(sendIntent, null));
waitForIdle();
@@ -197,7 +281,7 @@ public class ChooserActivityTest {
@Test
public void hasOtherProfileOneOption() throws Exception {
- Intent sendIntent = createSendImageIntent();
+ Intent sendIntent = createSendTextIntent();
List<ResolvedComponentInfo> resolvedComponentInfos =
createResolvedComponentsForTestWithOtherProfile(2);
ResolveInfo toChoose = resolvedComponentInfos.get(1).getResolveInfoAt(0);
@@ -234,7 +318,7 @@ public class ChooserActivityTest {
@Test
public void hasOtherProfileTwoOptionsAndUserSelectsOne() throws Exception {
- Intent sendIntent = createSendImageIntent();
+ Intent sendIntent = createSendTextIntent();
List<ResolvedComponentInfo> resolvedComponentInfos =
createResolvedComponentsForTestWithOtherProfile(3);
ResolveInfo toChoose = resolvedComponentInfos.get(1).getResolveInfoAt(0);
@@ -273,7 +357,7 @@ public class ChooserActivityTest {
@Test
public void hasLastChosenActivityAndOtherProfile() throws Exception {
- Intent sendIntent = createSendImageIntent();
+ Intent sendIntent = createSendTextIntent();
List<ResolvedComponentInfo> resolvedComponentInfos =
createResolvedComponentsForTestWithOtherProfile(3);
ResolveInfo toChoose = resolvedComponentInfos.get(1).getResolveInfoAt(0);
@@ -308,14 +392,33 @@ public class ChooserActivityTest {
assertThat(chosen[0], is(toChoose));
}
- private Intent createSendImageIntent() {
+ private Intent createSendTextIntent() {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "testing intent sending");
- sendIntent.setType("image/jpeg");
return sendIntent;
}
+ private Intent createSendTextIntentWithPreview(String title, Uri imageThumbnail) {
+ Intent sendIntent = new Intent();
+ sendIntent.setAction(Intent.ACTION_SEND);
+ sendIntent.putExtra(Intent.EXTRA_TEXT, "testing intent sending");
+ sendIntent.putExtra(Intent.EXTRA_TITLE, title);
+ if (imageThumbnail != null) {
+ ClipData.Item clipItem = new ClipData.Item(imageThumbnail);
+ sendIntent.setClipData(new ClipData("Clip Label", new String[]{"image/png"}, clipItem));
+ }
+
+ return sendIntent;
+ }
+
+ private Intent createViewTextIntent() {
+ Intent viewIntent = new Intent();
+ viewIntent.setAction(Intent.ACTION_VIEW);
+ viewIntent.putExtra(Intent.EXTRA_TEXT, "testing intent viewing");
+ return viewIntent;
+ }
+
private List<ResolvedComponentInfo> createResolvedComponentsForTest(int numberOfResults) {
List<ResolvedComponentInfo> infoList = new ArrayList<>(numberOfResults);
for (int i = 0; i < numberOfResults; i++) {
@@ -340,4 +443,24 @@ public class ChooserActivityTest {
private void waitForIdle() {
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
}
-} \ No newline at end of file
+
+ private Bitmap createBitmap() {
+ int width = 200;
+ int height = 200;
+ Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+
+ Paint paint = new Paint();
+ paint.setColor(Color.RED);
+ paint.setStyle(Paint.Style.FILL);
+ canvas.drawPaint(paint);
+
+ paint.setColor(Color.WHITE);
+ paint.setAntiAlias(true);
+ paint.setTextSize(14.f);
+ paint.setTextAlign(Paint.Align.CENTER);
+ canvas.drawText("Hi!", (width / 2.f), (height / 2.f), paint);
+
+ return bitmap;
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
index 60529f6d4071..637d2eafc7af 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
@@ -21,6 +21,9 @@ import static org.mockito.Mockito.mock;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.util.Size;
import java.util.function.Function;
@@ -74,6 +77,14 @@ public class ChooserWrapperActivity extends ChooserActivity {
return super.getPackageManager();
}
+ @Override
+ protected Bitmap loadThumbnail(Uri uri, Size size) {
+ if (sOverrides.previewThumbnail != null) {
+ return sOverrides.previewThumbnail;
+ }
+ return super.loadThumbnail(uri, size);
+ }
+
/**
* We cannot directly mock the activity created since instrumentation creates it.
* <p>
@@ -85,11 +96,13 @@ public class ChooserWrapperActivity extends ChooserActivity {
public Function<TargetInfo, Boolean> onSafelyStartCallback;
public ResolverListController resolverListController;
public Boolean isVoiceInteraction;
+ public Bitmap previewThumbnail;
public void reset() {
onSafelyStartCallback = null;
isVoiceInteraction = null;
createPackageManager = null;
+ previewThumbnail = null;
resolverListController = mock(ResolverListController.class);
}
}
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index a47ab875804f..bcac5fd63930 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -329,6 +329,7 @@ applications that come with the platform
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
+ <permission name="android.permission.STATUS_BAR_SERVICE"/>
<permission name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL"/>
</privapp-permissions>
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index 65aaba17a55d..aaf40b41bc31 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -17,6 +17,7 @@
package android.graphics;
import android.annotation.ColorInt;
+import android.annotation.ColorLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
@@ -258,6 +259,16 @@ public abstract class BaseCanvas {
nDrawColor(mNativeCanvasWrapper, color, mode.getXfermode().porterDuffMode);
}
+ /**
+ * Make lint happy.
+ * See {@link Canvas#drawColor(long, BlendMode)}
+ */
+ public void drawColor(@ColorLong long color, @NonNull BlendMode mode) {
+ ColorSpace cs = Color.colorSpace(color);
+ nDrawColor(mNativeCanvasWrapper, cs.getNativeInstance(), color,
+ mode.getXfermode().porterDuffMode);
+ }
+
public void drawLine(float startX, float startY, float stopX, float stopY,
@NonNull Paint paint) {
throwIfHasHwBitmapInSwMode(paint);
@@ -669,6 +680,9 @@ public abstract class BaseCanvas {
private static native void nDrawColor(long nativeCanvas, int color, int mode);
+ private static native void nDrawColor(long nativeCanvas, long nativeColorSpace,
+ @ColorLong long color, int mode);
+
private static native void nDrawPaint(long nativeCanvas, long nativePaint);
private static native void nDrawPoint(long canvasHandle, float x, float y, long paintHandle);
diff --git a/graphics/java/android/graphics/BaseRecordingCanvas.java b/graphics/java/android/graphics/BaseRecordingCanvas.java
index 4f6093500cad..3e117411db01 100644
--- a/graphics/java/android/graphics/BaseRecordingCanvas.java
+++ b/graphics/java/android/graphics/BaseRecordingCanvas.java
@@ -17,6 +17,7 @@
package android.graphics;
import android.annotation.ColorInt;
+import android.annotation.ColorLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
@@ -217,6 +218,13 @@ public class BaseRecordingCanvas extends Canvas {
}
@Override
+ public final void drawColor(@ColorLong long color, @NonNull BlendMode mode) {
+ ColorSpace cs = Color.colorSpace(color);
+ nDrawColor(mNativeCanvasWrapper, cs.getNativeInstance(), color,
+ mode.getXfermode().porterDuffMode);
+ }
+
+ @Override
public final void drawLine(float startX, float startY, float stopX, float stopY,
@NonNull Paint paint) {
nDrawLine(mNativeCanvasWrapper, startX, startY, stopX, stopY, paint.getNativeInstance());
@@ -590,6 +598,10 @@ public class BaseRecordingCanvas extends Canvas {
private static native void nDrawColor(long nativeCanvas, int color, int mode);
@FastNative
+ private static native void nDrawColor(long nativeCanvas, long nativeColorSpace,
+ @ColorLong long color, int mode);
+
+ @FastNative
private static native void nDrawPaint(long nativeCanvas, long nativePaint);
@FastNative
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index f0e236168858..f9e7dd177342 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -21,7 +21,6 @@ import android.annotation.ColorInt;
import android.annotation.ColorLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.annotation.WorkerThread;
import android.content.res.ResourcesImpl;
@@ -31,6 +30,7 @@ import android.os.Parcelable;
import android.os.StrictMode;
import android.os.Trace;
import android.util.DisplayMetrics;
+import android.util.Half;
import android.util.Log;
import android.view.ThreadedRenderer;
@@ -1761,9 +1761,7 @@ public final class Bitmap implements Parcelable {
* previously assigned color space.
*
* @param colorSpace to assign to the bitmap
- * @hide
*/
- @TestApi
public void setColorSpace(@NonNull ColorSpace colorSpace) {
checkRecycled("setColorSpace called on a recycled bitmap");
if (colorSpace == null) {
@@ -1814,9 +1812,7 @@ public final class Bitmap implements Parcelable {
* @throws IllegalArgumentException if the color space encoded in the long
* is invalid or unknown.
*
- * @hide pending API approval
*/
- @TestApi
public void eraseColor(@ColorLong long c) {
checkRecycled("Can't erase a recycled bitmap");
if (!isMutable()) {
@@ -1848,6 +1844,45 @@ public final class Bitmap implements Parcelable {
return nativeGetPixel(mNativePtr, x, y);
}
+ private static float clamp(float value, @NonNull ColorSpace cs, int index) {
+ return Math.max(Math.min(value, cs.getMaxValue(index)), cs.getMinValue(index));
+ }
+
+ /**
+ * Returns the {@link Color} at the specified location. Throws an exception
+ * if x or y are out of bounds (negative or >= to the width or height
+ * respectively).
+ *
+ * @param x The x coordinate (0...width-1) of the pixel to return
+ * @param y The y coordinate (0...height-1) of the pixel to return
+ * @return The {@link Color} at the specified coordinate
+ * @throws IllegalArgumentException if x, y exceed the bitmap's bounds
+ * @throws IllegalStateException if the bitmap's config is {@link Config#HARDWARE}
+ *
+ */
+ public Color getColor(int x, int y) {
+ checkRecycled("Can't call getColor() on a recycled bitmap");
+ checkHardware("unable to getColor(), "
+ + "pixel access is not supported on Config#HARDWARE bitmaps");
+ checkPixelAccess(x, y);
+
+ final ColorSpace cs = getColorSpace();
+ if (cs.equals(ColorSpace.get(ColorSpace.Named.SRGB))) {
+ return Color.valueOf(nativeGetPixel(mNativePtr, x, y));
+ }
+ // The returned value is in kRGBA_F16_SkColorType, which is packed as
+ // four half-floats, r,g,b,a.
+ long rgba = nativeGetColor(mNativePtr, x, y);
+ float r = Half.toFloat((short) ((rgba >> 0) & 0xffff));
+ float g = Half.toFloat((short) ((rgba >> 16) & 0xffff));
+ float b = Half.toFloat((short) ((rgba >> 32) & 0xffff));
+ float a = Half.toFloat((short) ((rgba >> 48) & 0xffff));
+
+ // Skia may draw outside of the numerical range of the colorSpace.
+ // Clamp to get an expected value.
+ return Color.valueOf(clamp(r, cs, 0), clamp(g, cs, 1), clamp(b, cs, 2), a, cs);
+ }
+
/**
* Returns in pixels[] a copy of the data in the bitmap. Each value is
* a packed int representing a {@link Color}. The stride parameter allows
@@ -2176,6 +2211,7 @@ public final class Bitmap implements Parcelable {
private static native boolean nativeIsConfigF16(long nativeBitmap);
private static native int nativeGetPixel(long nativeBitmap, int x, int y);
+ private static native long nativeGetColor(long nativeBitmap, int x, int y);
private static native void nativeGetPixels(long nativeBitmap, int[] pixels,
int offset, int stride, int x, int y,
int width, int height);
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 8c1bae2a0527..034dff09946d 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -17,6 +17,7 @@
package android.graphics;
import android.annotation.ColorInt;
+import android.annotation.ColorLong;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -1682,6 +1683,18 @@ public class Canvas extends BaseCanvas {
}
/**
+ * Fill the entire canvas' bitmap (restricted to the current clip) with the specified color,
+ * using srcover porterduff mode.
+ *
+ * @param color the color to draw onto the canvas
+ * @throws IllegalArgumentException if the color space encoded in the long
+ * is invalid or unknown.
+ */
+ public void drawColor(@ColorLong long color) {
+ super.drawColor(color, BlendMode.SRC_OVER);
+ }
+
+ /**
* Fill the entire canvas' bitmap (restricted to the current clip) with the specified color and
* porter-duff xfermode.
*
@@ -1707,6 +1720,19 @@ public class Canvas extends BaseCanvas {
}
/**
+ * Fill the entire canvas' bitmap (restricted to the current clip) with the specified color and
+ * blendmode.
+ *
+ * @param color the color to draw with
+ * @param mode the blendmode to apply to the color
+ * @throws IllegalArgumentException if the color space encoded in the long
+ * is invalid or unknown.
+ */
+ public void drawColor(@ColorLong long color, @NonNull BlendMode mode) {
+ super.drawColor(color, mode);
+ }
+
+ /**
* Draw a line segment with the specified start and stop x,y coordinates, using the specified
* paint.
* <p>
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 7eee6f4bf37d..73442db1c143 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -24,7 +24,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Px;
import android.annotation.Size;
-import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.graphics.fonts.FontVariationAxis;
import android.os.Build;
@@ -974,10 +973,7 @@ public class Paint {
* @see Color for APIs that help manipulate a color long.
*
* @return the paint's color (and alpha).
- *
- * @hide pending API approval
*/
- @TestApi
@ColorLong
public long getColorLong() {
return mColor;
@@ -1006,10 +1002,7 @@ public class Paint {
* to set in the paint.
* @throws IllegalArgumentException if the color space encoded in the long
* is invalid or unknown.
- *
- * @hide pending API approval
*/
- @TestApi
public void setColor(@ColorLong long color) {
ColorSpace cs = Color.colorSpace(color);
float r = Color.red(color);
@@ -1445,10 +1438,7 @@ public class Paint {
*
* @throws IllegalArgumentException if the color space encoded in the long
* is invalid or unknown.
- *
- * @hide pending API approval
*/
- @TestApi
public void setShadowLayer(float radius, float dx, float dy, @ColorLong long shadowColor) {
ColorSpace cs = Color.colorSpace(shadowColor);
float r = Color.red(shadowColor);
@@ -1517,9 +1507,7 @@ public class Paint {
* Returns the color of the shadow layer.
* @see #setShadowLayer(float,float,float,int)
* @see #setShadowLayer(float,float,float,long)
- * @hide pending API approval
*/
- @TestApi
public @ColorLong long getShadowLayerColorLong() {
return mShadowLayerColor;
}
diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp
index 6dc9d34cc3fd..85947665839a 100644
--- a/libs/hwui/RecordingCanvas.cpp
+++ b/libs/hwui/RecordingCanvas.cpp
@@ -759,6 +759,8 @@ RecordingCanvas::RecordingCanvas() : INHERITED(1, 1), fDL(nullptr) {}
void RecordingCanvas::reset(DisplayListData* dl, const SkIRect& bounds) {
this->resetCanvas(bounds.right(), bounds.bottom());
fDL = dl;
+ mClipMayBeComplex = false;
+ mSaveCount = mComplexSaveCount = 0;
}
sk_sp<SkSurface> RecordingCanvas::onNewSurface(const SkImageInfo&, const SkSurfaceProps&) {
@@ -770,6 +772,7 @@ void RecordingCanvas::onFlush() {
}
void RecordingCanvas::willSave() {
+ mSaveCount++;
fDL->save();
}
SkCanvas::SaveLayerStrategy RecordingCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
@@ -778,6 +781,11 @@ SkCanvas::SaveLayerStrategy RecordingCanvas::getSaveLayerStrategy(const SaveLaye
return SkCanvas::kNoLayer_SaveLayerStrategy;
}
void RecordingCanvas::willRestore() {
+ mSaveCount--;
+ if (mSaveCount < mComplexSaveCount) {
+ mClipMayBeComplex = false;
+ mComplexSaveCount = 0;
+ }
fDL->restore();
}
@@ -798,17 +806,27 @@ void RecordingCanvas::didTranslate(SkScalar dx, SkScalar dy) {
void RecordingCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle style) {
fDL->clipRect(rect, op, style == kSoft_ClipEdgeStyle);
+ if (!getTotalMatrix().isScaleTranslate()) {
+ setClipMayBeComplex();
+ }
this->INHERITED::onClipRect(rect, op, style);
}
void RecordingCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle style) {
+ if (rrect.getType() > SkRRect::kRect_Type || !getTotalMatrix().isScaleTranslate()) {
+ setClipMayBeComplex();
+ }
fDL->clipRRect(rrect, op, style == kSoft_ClipEdgeStyle);
this->INHERITED::onClipRRect(rrect, op, style);
}
void RecordingCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle style) {
+ setClipMayBeComplex();
fDL->clipPath(path, op, style == kSoft_ClipEdgeStyle);
this->INHERITED::onClipPath(path, op, style);
}
void RecordingCanvas::onClipRegion(const SkRegion& region, SkClipOp op) {
+ if (region.isComplex() || !getTotalMatrix().isScaleTranslate()) {
+ setClipMayBeComplex();
+ }
fDL->clipRegion(region, op);
this->INHERITED::onClipRegion(region, op);
}
diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h
index caaef67f724f..3a76ca1137a5 100644
--- a/libs/hwui/RecordingCanvas.h
+++ b/libs/hwui/RecordingCanvas.h
@@ -203,10 +203,41 @@ public:
void drawVectorDrawable(VectorDrawableRoot* tree);
+ /**
+ * If "isClipMayBeComplex" returns false, it is guaranteed the current clip is a rectangle.
+ * If the return value is true, then clip may or may not be complex (there is no guarantee).
+ */
+ inline bool isClipMayBeComplex() { return mClipMayBeComplex; }
+
private:
typedef SkCanvasVirtualEnforcer<SkNoDrawCanvas> INHERITED;
+ inline void setClipMayBeComplex() {
+ if (!mClipMayBeComplex) {
+ mComplexSaveCount = mSaveCount;
+ mClipMayBeComplex = true;
+ }
+ }
+
DisplayListData* fDL;
+
+ /**
+ * mClipMayBeComplex tracks if the current clip is a rectangle. This flag is used to promote
+ * FunctorDrawable to a layer, if it is clipped by a non-rect.
+ */
+ bool mClipMayBeComplex = false;
+
+ /**
+ * mSaveCount is the current level of our save tree.
+ */
+ int mSaveCount = 0;
+
+ /**
+ * mComplexSaveCount is the first save level, which has a complex clip. Every level below
+ * mComplexSaveCount is assumed to have a complex clip and every level above mComplexSaveCount
+ * is guaranteed to not be complex.
+ */
+ int mComplexSaveCount = 0;
};
} // namespace uirenderer
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index ddb7e4e4ce74..e6710cc8f950 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -151,6 +151,7 @@ public:
// parent may have already dictated that a descendant layer is needed
bool functorsNeedLayer =
ancestorDictatesFunctorsNeedLayer
+ || CC_UNLIKELY(isClipMayBeComplex())
// Round rect clipping forces layer for functors
|| CC_UNLIKELY(getOutline().willRoundRectClip()) ||
@@ -193,6 +194,12 @@ public:
bool isProjectionReceiver() const { return mPrimitiveFields.mProjectionReceiver; }
+ bool setClipMayBeComplex(bool isClipMayBeComplex) {
+ return RP_SET(mPrimitiveFields.mClipMayBeComplex, isClipMayBeComplex);
+ }
+
+ bool isClipMayBeComplex() const { return mPrimitiveFields.mClipMayBeComplex; }
+
bool setStaticMatrix(const SkMatrix* matrix) {
delete mStaticMatrix;
if (matrix) {
@@ -563,6 +570,7 @@ private:
bool mProjectBackwards = false;
bool mProjectionReceiver = false;
bool mAllowForceDark = true;
+ bool mClipMayBeComplex = false;
Rect mClipBounds;
Outline mOutline;
RevealClip mRevealClip;
diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
index 230065c222a9..29d5ef233338 100644
--- a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
+++ b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
@@ -73,7 +73,6 @@ bool SkiaDisplayList::prepareListAndChildren(
RenderNode* childNode = child.getRenderNode();
Matrix4 mat4(child.getRecordedMatrix());
info.damageAccumulator->pushTransform(&mat4);
- // TODO: a layer is needed if the canvas is rotated or has a non-rect clip
info.hasBackwardProjectedNodes = false;
childFn(childNode, observer, info, functorsNeedLayer);
hasBackwardProjectedNodesSubtree |= info.hasBackwardProjectedNodes;
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
index d54275fe7e19..b67aea224055 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
@@ -113,6 +113,10 @@ void SkiaRecordingCanvas::drawRenderNode(uirenderer::RenderNode* renderNode) {
// Record the child node. Drawable dtor will be invoked when mChildNodes deque is cleared.
mDisplayList->mChildNodes.emplace_back(renderNode, asSkCanvas(), true, mCurrentBarrier);
auto& renderNodeDrawable = mDisplayList->mChildNodes.back();
+ if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) {
+ // Put Vulkan WebViews with non-rectangular clips in a HW layer
+ renderNode->mutateStagingProperties().setClipMayBeComplex(mRecorder.isClipMayBeComplex());
+ }
drawDrawable(&renderNodeDrawable);
// use staging property, since recording on UI thread
diff --git a/libs/hwui/private/hwui/DrawVkInfo.h b/libs/hwui/private/hwui/DrawVkInfo.h
index abc4dbf9fa1c..fb55f5ca4c93 100644
--- a/libs/hwui/private/hwui/DrawVkInfo.h
+++ b/libs/hwui/private/hwui/DrawVkInfo.h
@@ -29,7 +29,7 @@ struct VkFunctorInitParams {
VkDevice device;
VkQueue queue;
uint32_t graphics_queue_index;
- uint32_t instance_version;
+ uint32_t api_version;
const char* const* enabled_instance_extension_names;
uint32_t enabled_instance_extension_names_length;
const char* const* enabled_device_extension_names;
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 1e7520216d66..582d51e6af94 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -83,7 +83,6 @@ void VulkanManager::destroy() {
mDevice = VK_NULL_HANDLE;
mPhysicalDevice = VK_NULL_HANDLE;
mInstance = VK_NULL_HANDLE;
- mInstanceVersion = 0u;
mInstanceExtensions.clear();
mDeviceExtensions.clear();
free_features_extensions_structs(mPhysicalDeviceFeatures2);
@@ -100,7 +99,7 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
0, // applicationVersion
"android framework", // pEngineName
0, // engineVerison
- VK_MAKE_VERSION(1, 1, 0), // apiVersion
+ mAPIVersion, // apiVersion
};
{
@@ -377,8 +376,9 @@ void VulkanManager::initialize() {
}
GET_PROC(EnumerateInstanceVersion);
- LOG_ALWAYS_FATAL_IF(mEnumerateInstanceVersion(&mInstanceVersion));
- LOG_ALWAYS_FATAL_IF(mInstanceVersion < VK_MAKE_VERSION(1, 1, 0));
+ uint32_t instanceVersion;
+ LOG_ALWAYS_FATAL_IF(mEnumerateInstanceVersion(&instanceVersion));
+ LOG_ALWAYS_FATAL_IF(instanceVersion < VK_MAKE_VERSION(1, 1, 0));
GrVkExtensions extensions;
LOG_ALWAYS_FATAL_IF(!this->setupDevice(extensions, mPhysicalDeviceFeatures2));
@@ -398,7 +398,7 @@ void VulkanManager::initialize() {
backendContext.fDevice = mDevice;
backendContext.fQueue = mGraphicsQueue;
backendContext.fGraphicsQueueIndex = mGraphicsQueueIndex;
- backendContext.fInstanceVersion = mInstanceVersion;
+ backendContext.fMaxAPIVersion = mAPIVersion;
backendContext.fVkExtensions = &extensions;
backendContext.fDeviceFeatures2 = &mPhysicalDeviceFeatures2;
backendContext.fGetProc = std::move(getProc);
@@ -446,7 +446,7 @@ VkFunctorInitParams VulkanManager::getVkFunctorInitParams() const {
.device = mDevice,
.queue = mGraphicsQueue,
.graphics_queue_index = mGraphicsQueueIndex,
- .instance_version = mInstanceVersion,
+ .api_version = mAPIVersion,
.enabled_instance_extension_names = mInstanceExtensions.data(),
.enabled_instance_extension_names_length =
static_cast<uint32_t>(mInstanceExtensions.size()),
diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h
index abe78efc9174..6426fe2808b7 100644
--- a/libs/hwui/renderthread/VulkanManager.h
+++ b/libs/hwui/renderthread/VulkanManager.h
@@ -246,7 +246,7 @@ private:
VkCommandBuffer mDummyCB = VK_NULL_HANDLE;
// Variables saved to populate VkFunctorInitParams.
- uint32_t mInstanceVersion = 0u;
+ static const uint32_t mAPIVersion = VK_MAKE_VERSION(1, 1, 0);
std::vector<const char*> mInstanceExtensions;
std::vector<const char*> mDeviceExtensions;
VkPhysicalDeviceFeatures2 mPhysicalDeviceFeatures2{};
diff --git a/location/java/android/location/GnssMeasurementCorrections.java b/location/java/android/location/GnssMeasurementCorrections.java
index b81bf908053c..3ce48b4f7627 100644
--- a/location/java/android/location/GnssMeasurementCorrections.java
+++ b/location/java/android/location/GnssMeasurementCorrections.java
@@ -43,13 +43,27 @@ public final class GnssMeasurementCorrections implements Parcelable {
* are computed.
*/
private double mAltitudeMeters;
+ /**
+ * Represents the horizontal uncertainty (68% confidence) in meters on the device position at
+ * which the corrections are provided.
+ *
+ * <p> This value is useful for example to judge how accurate the provided corrections are.
+ */
+ private double mHorizontalPositionUncertaintyMeters;
+ /**
+ * Represents the vertical uncertainty (68% confidence) in meters on the device position at
+ * which the corrections are provided.
+ *
+ * <p> This value is useful for example to judge how accurate the provided corrections are.
+ */
+ private double mVerticalPositionUncertaintyMeters;
- /** Time Of Applicability, GPS time of week */
+ /** Time Of Applicability, GPS time of week in nanoseconds. */
private long mToaGpsNanosecondsOfWeek;
/**
* A set of {@link GnssSingleSatCorrection} each containing measurement corrections for a
- * satellite in view
+ * satellite in view.
*/
private @Nullable List<GnssSingleSatCorrection> mSingleSatCorrectionList;
@@ -57,6 +71,8 @@ public final class GnssMeasurementCorrections implements Parcelable {
mLatitudeDegrees = builder.mLatitudeDegrees;
mLongitudeDegrees = builder.mLongitudeDegrees;
mAltitudeMeters = builder.mAltitudeMeters;
+ mHorizontalPositionUncertaintyMeters = builder.mHorizontalPositionUncertaintyMeters;
+ mVerticalPositionUncertaintyMeters = builder.mVerticalPositionUncertaintyMeters;
mToaGpsNanosecondsOfWeek = builder.mToaGpsNanosecondsOfWeek;
mSingleSatCorrectionList =
builder.mSingleSatCorrectionList == null
@@ -83,6 +99,22 @@ public final class GnssMeasurementCorrections implements Parcelable {
return mAltitudeMeters;
}
+ /**
+ * Gets the horizontal uncertainty (68% confidence) in meters on the device position at
+ * which the corrections are provided.
+ */
+ public double getHorizontalPositionUncertaintyMeters() {
+ return mHorizontalPositionUncertaintyMeters;
+ }
+
+ /**
+ * Gets the vertical uncertainty (68% confidence) in meters on the device position at
+ * which the corrections are provided.
+ */
+ public double getVerticalPositionUncertaintyMeters() {
+ return mVerticalPositionUncertaintyMeters;
+ }
+
/** Gets the time of applicability, GPS time of week in nanoseconds. */
public long getToaGpsNanosecondsOfWeek() {
return mToaGpsNanosecondsOfWeek;
@@ -110,6 +142,8 @@ public final class GnssMeasurementCorrections implements Parcelable {
.setLatitudeDegrees(parcel.readDouble())
.setLongitudeDegrees(parcel.readDouble())
.setAltitudeMeters(parcel.readDouble())
+ .setHorizontalPositionUncertaintyMeters(parcel.readDouble())
+ .setVerticalPositionUncertaintyMeters(parcel.readDouble())
.setToaGpsNanosecondsOfWeek(parcel.readLong());
List<GnssSingleSatCorrection> singleSatCorrectionList = new ArrayList<>();
parcel.readTypedList(singleSatCorrectionList, GnssSingleSatCorrection.CREATOR);
@@ -131,6 +165,10 @@ public final class GnssMeasurementCorrections implements Parcelable {
builder.append(String.format(format, "LatitudeDegrees = ", mLatitudeDegrees));
builder.append(String.format(format, "LongitudeDegrees = ", mLongitudeDegrees));
builder.append(String.format(format, "AltitudeMeters = ", mAltitudeMeters));
+ builder.append(String.format(format, "HorizontalPositionUncertaintyMeters = ",
+ mHorizontalPositionUncertaintyMeters));
+ builder.append(String.format(format, "VerticalPositionUncertaintyMeters = ",
+ mVerticalPositionUncertaintyMeters));
builder.append(
String.format(format, "ToaGpsNanosecondsOfWeek = ", mToaGpsNanosecondsOfWeek));
builder.append(
@@ -143,6 +181,8 @@ public final class GnssMeasurementCorrections implements Parcelable {
parcel.writeDouble(mLatitudeDegrees);
parcel.writeDouble(mLongitudeDegrees);
parcel.writeDouble(mAltitudeMeters);
+ parcel.writeDouble(mHorizontalPositionUncertaintyMeters);
+ parcel.writeDouble(mVerticalPositionUncertaintyMeters);
parcel.writeLong(mToaGpsNanosecondsOfWeek);
parcel.writeTypedList(mSingleSatCorrectionList);
}
@@ -154,9 +194,10 @@ public final class GnssMeasurementCorrections implements Parcelable {
* GnssMeasurementCorrections}.
*/
private double mLatitudeDegrees;
-
private double mLongitudeDegrees;
private double mAltitudeMeters;
+ private double mHorizontalPositionUncertaintyMeters;
+ private double mVerticalPositionUncertaintyMeters;
private long mToaGpsNanosecondsOfWeek;
private List<GnssSingleSatCorrection> mSingleSatCorrectionList;
@@ -181,6 +222,27 @@ public final class GnssMeasurementCorrections implements Parcelable {
return this;
}
+
+ /**
+ * Sets the horizontal uncertainty (68% confidence) in meters on the device position at
+ * which the corrections are provided.
+ */
+ public Builder setHorizontalPositionUncertaintyMeters(
+ double horizontalPositionUncertaintyMeters) {
+ mHorizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters;
+ return this;
+ }
+
+ /**
+ * Sets the vertical uncertainty (68% confidence) in meters on the device position at which
+ * the corrections are provided.
+ */
+ public Builder setVerticalPositionUncertaintyMeters(
+ double verticalPositionUncertaintyMeters) {
+ mVerticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters;
+ return this;
+ }
+
/** Sets the time of applicability, GPS time of week in nanoseconds. */
public Builder setToaGpsNanosecondsOfWeek(long toaGpsNanosecondsOfWeek) {
mToaGpsNanosecondsOfWeek = toaGpsNanosecondsOfWeek;
diff --git a/location/java/android/location/GnssSingleSatCorrection.java b/location/java/android/location/GnssSingleSatCorrection.java
index 3922d2f9f558..4d5303f18b81 100644
--- a/location/java/android/location/GnssSingleSatCorrection.java
+++ b/location/java/android/location/GnssSingleSatCorrection.java
@@ -317,8 +317,8 @@ public final class GnssSingleSatCorrection implements Parcelable {
* between 0 and 1.
*/
public Builder setProbSatIsLos(@FloatRange(from = 0f, to = 1f) float probSatIsLos) {
- Preconditions.checkArgumentInRange(probSatIsLos, 0, 1,
- "probSatIsLos should be between 0 and 1.");
+ Preconditions.checkArgumentInRange(
+ probSatIsLos, 0, 1, "probSatIsLos should be between 0 and 1.");
mProbSatIsLos = probSatIsLos;
mSingleSatCorrectionFlags =
(byte) (mSingleSatCorrectionFlags | HAS_PROB_SAT_IS_LOS_MASK);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 59c6a0a21cd1..63b57d166f1f 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -181,22 +181,14 @@ public class LocationManager {
"android.location.GPS_ENABLED_CHANGE";
/**
- * Broadcast intent action when the configured location providers
- * change. For use with {@link #isProviderEnabled(String)}. If you're interacting with the
- * {@link android.provider.Settings.Secure#LOCATION_MODE} API, use {@link #MODE_CHANGED_ACTION}
- * instead.
+ * Broadcast intent action when the set of enabled location providers changes. To check the
+ * status of a provider, use {@link #isProviderEnabled(String)}.
*/
- public static final String PROVIDERS_CHANGED_ACTION =
- "android.location.PROVIDERS_CHANGED";
+ public static final String PROVIDERS_CHANGED_ACTION = "android.location.PROVIDERS_CHANGED";
/**
- * Broadcast intent action when {@link android.provider.Settings.Secure#LOCATION_MODE} changes.
- * For use with the {@link android.provider.Settings.Secure#LOCATION_MODE} API.
- * If you're interacting with {@link #isProviderEnabled(String)}, use
- * {@link #PROVIDERS_CHANGED_ACTION} instead.
- *
- * In the future, there may be mode changes that do not result in
- * {@link #PROVIDERS_CHANGED_ACTION} broadcasts.
+ * Broadcast intent action when the device location mode changes. To check the location mode,
+ * use {@link #isLocationEnabled()}.
*/
public static final String MODE_CHANGED_ACTION = "android.location.MODE_CHANGED";
@@ -207,8 +199,10 @@ public class LocationManager {
* If you're interacting with {@link #isProviderEnabled(String)}, use
* {@link #PROVIDERS_CHANGED_ACTION} instead.
*
+ * @deprecated Do not use.
* @hide
*/
+ @Deprecated
public static final String MODE_CHANGING_ACTION = "com.android.settings.location.MODE_CHANGING";
/**
@@ -299,7 +293,7 @@ public class LocationManager {
"com.android.settings.location.FOOTER_STRING";
// Map from LocationListeners to their associated ListenerTransport objects
- private HashMap<LocationListener,ListenerTransport> mListeners =
+ private final HashMap<LocationListener, ListenerTransport> mListeners =
new HashMap<LocationListener,ListenerTransport>();
private class ListenerTransport extends ILocationListener.Stub {
@@ -1264,39 +1258,20 @@ public class LocationManager {
}
/**
- * Returns the current enabled/disabled status of location
+ * Returns the current enabled/disabled state of location. To listen for changes, see
+ * {@link #MODE_CHANGED_ACTION}.
*
- * @return true if location is enabled. false if location is disabled.
+ * @return true if location is enabled and false if location is disabled.
*/
public boolean isLocationEnabled() {
return isLocationEnabledForUser(Process.myUserHandle());
}
/**
- * Method for enabling or disabling location.
- *
- * @param enabled true to enable location. false to disable location
- * @param userHandle the user to set
- *
- * @hide
- */
- @SystemApi
- @RequiresPermission(WRITE_SECURE_SETTINGS)
- public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
- Settings.Secure.putIntForUser(
- mContext.getContentResolver(),
- Settings.Secure.LOCATION_MODE,
- enabled
- ? Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
- : Settings.Secure.LOCATION_MODE_OFF,
- userHandle.getIdentifier());
- }
-
- /**
- * Returns the current enabled/disabled status of location
+ * Returns the current enabled/disabled state of location.
*
* @param userHandle the user to query
- * @return true location is enabled. false if location is disabled.
+ * @return true if location is enabled and false if location is disabled.
*
* @hide
*/
@@ -1310,19 +1285,32 @@ public class LocationManager {
}
/**
- * Returns the current enabled/disabled status of the given provider.
+ * Enables or disables the location setting.
*
- * <p>If the user has enabled this provider in the Settings menu, true
- * is returned otherwise false is returned
+ * @param enabled true to enable location and false to disable location.
+ * @param userHandle the user to set
*
- * <p>Callers should instead use {@link #isLocationEnabled()}
- * unless they depend on provider-specific APIs such as
- * {@link #requestLocationUpdates(String, long, float, LocationListener)}.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(WRITE_SECURE_SETTINGS)
+ public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
+ Settings.Secure.putIntForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_MODE,
+ enabled
+ ? Settings.Secure.LOCATION_MODE_ON
+ : Settings.Secure.LOCATION_MODE_OFF,
+ userHandle.getIdentifier());
+ }
+
+ /**
+ * Returns the current enabled/disabled status of the given provider. To listen for changes, see
+ * {@link #PROVIDERS_CHANGED_ACTION}.
*
- * <p>
- * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this
- * method would throw {@link SecurityException} if the location permissions
- * were not sufficient to use the specified provider.
+ * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method would throw
+ * {@link SecurityException} if the location permissions were not sufficient to use the
+ * specified provider.
*
* @param provider the name of the provider
* @return true if the provider exists and is enabled
@@ -1334,19 +1322,13 @@ public class LocationManager {
}
/**
- * Returns the current enabled/disabled status of the given provider and user.
- *
- * <p>If the user has enabled this provider in the Settings menu, true
- * is returned otherwise false is returned
- *
- * <p>Callers should instead use {@link #isLocationEnabled()}
- * unless they depend on provider-specific APIs such as
- * {@link #requestLocationUpdates(String, long, float, LocationListener)}.
+ * Returns the current enabled/disabled status of the given provider and user. Callers should
+ * prefer {@link #isLocationEnabledForUser(UserHandle)} unless they depend on provider-specific
+ * APIs.
*
- * <p>
- * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this
- * method would throw {@link SecurityException} if the location permissions
- * were not sufficient to use the specified provider.
+ * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method would throw
+ * {@link SecurityException} if the location permissions were not sufficient to use the
+ * specified provider.
*
* @param provider the name of the provider
* @param userHandle the user to query
@@ -1367,12 +1349,14 @@ public class LocationManager {
}
/**
- * Method for enabling or disabling a single location provider.
+ * Method for enabling or disabling a single location provider. This method is deprecated and
+ * functions as a best effort. It should not be relied on in any meaningful sense as providers
+ * may no longer be enabled or disabled by clients.
*
* @param provider the name of the provider
* @param enabled true to enable the provider. false to disable the provider
* @param userHandle the user to set
- * @return true if the value was set, false on database errors
+ * @return true if the value was set, false otherwise
*
* @throws IllegalArgumentException if provider is null
* @deprecated Do not manipulate providers individually, use
diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java
index 3d0afb098697..0480eab580ac 100644
--- a/location/java/android/location/LocationRequest.java
+++ b/location/java/android/location/LocationRequest.java
@@ -683,6 +683,7 @@ public final class LocationRequest implements Parcelable {
request.setSmallestDisplacement(in.readFloat());
request.setHideFromAppOps(in.readInt() != 0);
request.setLowPowerMode(in.readInt() != 0);
+ request.setLocationSettingsIgnored(in.readInt() != 0);
String provider = in.readString();
if (provider != null) request.setProvider(provider);
WorkSource workSource = in.readParcelable(null);
@@ -711,6 +712,7 @@ public final class LocationRequest implements Parcelable {
parcel.writeFloat(mSmallestDisplacement);
parcel.writeInt(mHideFromAppOps ? 1 : 0);
parcel.writeInt(mLowPowerMode ? 1 : 0);
+ parcel.writeInt(mLocationSettingsIgnored ? 1 : 0);
parcel.writeString(mProvider);
parcel.writeParcelable(mWorkSource, 0);
}
@@ -755,6 +757,9 @@ public final class LocationRequest implements Parcelable {
s.append(" num=").append(mNumUpdates);
}
s.append(" lowPowerMode=").append(mLowPowerMode);
+ if (mLocationSettingsIgnored) {
+ s.append(" ignoreSettings");
+ }
s.append(']');
return s.toString();
}
diff --git a/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java b/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java
index d6227bbfcd0d..8f46e84195d5 100644
--- a/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java
+++ b/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java
@@ -48,6 +48,8 @@ public class GnssMeasurementCorrectionsTest extends TestCase {
assertEquals(37.386051, measurementCorrections.getLatitudeDegrees());
assertEquals(-122.083855, measurementCorrections.getLongitudeDegrees());
assertEquals(32.0, measurementCorrections.getAltitudeMeters());
+ assertEquals(9.25, measurementCorrections.getHorizontalPositionUncertaintyMeters());
+ assertEquals(2.3, measurementCorrections.getVerticalPositionUncertaintyMeters());
assertEquals(604000000000000L, measurementCorrections.getToaGpsNanosecondsOfWeek());
GnssSingleSatCorrection singleSatCorrection =
@@ -74,6 +76,8 @@ public class GnssMeasurementCorrectionsTest extends TestCase {
.setLatitudeDegrees(37.386051)
.setLongitudeDegrees(-122.083855)
.setAltitudeMeters(32)
+ .setHorizontalPositionUncertaintyMeters(9.25)
+ .setVerticalPositionUncertaintyMeters(2.3)
.setToaGpsNanosecondsOfWeek(604000000000000L);
List<GnssSingleSatCorrection> singleSatCorrectionList = new ArrayList<>();
singleSatCorrectionList.add(GnssSingleSatCorrectionsTest.generateTestSingleSatCorrection());
diff --git a/media/Android.bp b/media/Android.bp
index 3181a2988d99..d7b8dd23bd6b 100644
--- a/media/Android.bp
+++ b/media/Android.bp
@@ -1,30 +1,4 @@
java_library {
- name: "updatable-media1",
-
- srcs: [
- ":media1-srcs",
- ":framework-media-annotation-srcs",
- ],
-
- aidl: {
- export_include_dirs: [
- "apex/java",
- ],
-
- // TODO: find out a way to include only the necessary aidl files instead of dirs.
- include_dirs: [
- "frameworks/base/core/java",
- "frameworks/base/media/java",
- ],
- },
-
- installable: true,
-
- // Make sure that the implementaion only relies on SDK or system APIs.
- sdk_version: "system_current",
-}
-
-java_library {
name: "updatable-media",
srcs: [
@@ -57,53 +31,12 @@ java_library {
filegroup {
name: "media-srcs-without-aidls",
srcs : [
- ":media1-srcs-without-aidls",
":mediasession2-srcs-without-aidls",
":mediaplayer2-srcs",
],
}
filegroup {
- name: "media1-srcs",
- srcs: [
- "apex/java/android/media/MediaParceledListSlice.java",
- "apex/java/android/media/VolumeProvider.java",
- "apex/java/android/media/browse/MediaBrowser.java",
- "apex/java/android/media/browse/MediaBrowserUtils.java",
- "apex/java/android/media/session/ControllerCallbackLink.java",
- "apex/java/android/media/session/ControllerLink.java",
- "apex/java/android/media/session/ISession.aidl",
- "apex/java/android/media/session/ISessionCallback.aidl",
- "apex/java/android/media/session/ISessionController.aidl",
- "apex/java/android/media/session/ISessionControllerCallback.aidl",
- "apex/java/android/media/session/MediaController.java",
- "apex/java/android/media/session/MediaSessionEngine.java",
- "apex/java/android/media/session/MediaSessionProviderService.java",
- "apex/java/android/media/session/PlaybackState.java",
- "apex/java/android/media/session/SessionCallbackLink.java",
- "apex/java/android/media/session/SessionLink.java",
- "apex/java/android/service/media/IMediaBrowserService.aidl",
- "apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl",
- "apex/java/android/service/media/MediaBrowserService.java",
- ],
-}
-
-filegroup {
- name: "media1-srcs-without-aidls",
- srcs: [
- ":media1-srcs",
- ],
- exclude_srcs: [
- "apex/java/android/media/session/ISession.aidl",
- "apex/java/android/media/session/ISessionCallback.aidl",
- "apex/java/android/media/session/ISessionController.aidl",
- "apex/java/android/media/session/ISessionControllerCallback.aidl",
- "apex/java/android/service/media/IMediaBrowserService.aidl",
- "apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl",
- ],
-}
-
-filegroup {
name: "mediasession2-srcs",
srcs: [
"apex/java/android/media/Controller2Link.java",
diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java
index 1a1f6fb4457a..0fd496bda251 100644
--- a/media/apex/java/android/media/MediaPlayer2.java
+++ b/media/apex/java/android/media/MediaPlayer2.java
@@ -21,6 +21,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringDef;
+import android.annotation.TestApi;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
@@ -3667,53 +3668,66 @@ public class MediaPlayer2 implements AutoCloseable
}
/**
- * The status codes for {@link DrmEventCallback#onDrmPrepared} listener.
+ * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
* <p>
*
* DRM preparation has succeeded.
- * @hide
*/
public static final int PREPARE_DRM_STATUS_SUCCESS = 0;
/**
+ * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+ * <p>
+ *
* The device required DRM provisioning but couldn't reach the provisioning server.
- * @hide
*/
public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1;
/**
+ * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+ * <p>
+ *
* The device required DRM provisioning but the provisioning server denied the request.
- * @hide
*/
public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2;
/**
+ * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+ * <p>
+ *
* The DRM preparation has failed .
- * @hide
*/
public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3;
/**
+ * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+ * <p>
+ *
* The crypto scheme UUID is not supported by the device.
- * @hide
*/
public static final int PREPARE_DRM_STATUS_UNSUPPORTED_SCHEME = 4;
/**
+ * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+ * <p>
+ *
* The hardware resources are not available, due to being in use.
- * @hide
*/
public static final int PREPARE_DRM_STATUS_RESOURCE_BUSY = 5;
/**
+ * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+ * <p>
+ *
* Restoring persisted offline keys failed.
- * @hide
*/
public static final int PREPARE_DRM_STATUS_RESTORE_ERROR = 6;
/**
+ * A status code for {@link DrmEventCallback#onDrmPrepared} listener.
+ * <p>
+ *
* Error during key request/response exchange with license server.
- * @hide
*/
public static final int PREPARE_DRM_STATUS_KEY_EXCHANGE_ERROR = 7;
@@ -3758,6 +3772,7 @@ public class MediaPlayer2 implements AutoCloseable
* @throws IllegalStateException if called before being prepared
* @hide
*/
+ @TestApi
public DrmInfo getDrmInfo(@NonNull DataSourceDesc dsd) {
final SourceInfo sourceInfo = getSourceInfo(dsd);
if (sourceInfo != null) {
@@ -3814,6 +3829,7 @@ public class MediaPlayer2 implements AutoCloseable
* @hide
*/
// This is an asynchronous call.
+ @TestApi
public Object prepareDrm(@NonNull DataSourceDesc dsd, @NonNull UUID uuid) {
return addTask(newPrepareDrmTask(dsd, uuid));
}
@@ -3905,6 +3921,7 @@ public class MediaPlayer2 implements AutoCloseable
* @hide
*/
// This is a synchronous call.
+ @TestApi
public void releaseDrm(@NonNull DataSourceDesc dsd)
throws NoDrmSchemeException {
final SourceInfo sourceInfo = getSourceInfo(dsd);
@@ -3955,6 +3972,7 @@ public class MediaPlayer2 implements AutoCloseable
* @throws NoDrmSchemeException if there is no active DRM session
* @hide
*/
+ @TestApi
public MediaDrm.KeyRequest getDrmKeyRequest(
@NonNull DataSourceDesc dsd,
@Nullable byte[] keySetId, @Nullable byte[] initData,
@@ -3997,6 +4015,7 @@ public class MediaPlayer2 implements AutoCloseable
* @hide
*/
// This is a synchronous call.
+ @TestApi
public byte[] provideDrmKeyResponse(
@NonNull DataSourceDesc dsd,
@Nullable byte[] keySetId, @NonNull byte[] response)
@@ -4023,6 +4042,7 @@ public class MediaPlayer2 implements AutoCloseable
* @hide
*/
// This is a synchronous call.
+ @TestApi
public void restoreDrmKeys(
@NonNull DataSourceDesc dsd,
@NonNull byte[] keySetId)
@@ -4050,6 +4070,7 @@ public class MediaPlayer2 implements AutoCloseable
* @throws NoDrmSchemeException if there is no active DRM session
* @hide
*/
+ @TestApi
public String getDrmPropertyString(
@NonNull DataSourceDesc dsd,
@NonNull @MediaDrmStringProperty String propertyName)
@@ -4078,6 +4099,7 @@ public class MediaPlayer2 implements AutoCloseable
* @hide
*/
// This is a synchronous call.
+ @TestApi
public void setDrmPropertyString(
@NonNull DataSourceDesc dsd,
@NonNull @MediaDrmStringProperty String propertyName, @NonNull String value)
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index f756658b4fa8..0c3d6255f871 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -3314,7 +3314,7 @@ final public class MediaCodec {
*/
public void setAudioPresentation(@NonNull AudioPresentation presentation) {
if (presentation == null) {
- throw new IllegalArgumentException("audio presentation is null");
+ throw new NullPointerException("audio presentation is null");
}
native_setAudioPresentation(presentation.getPresentationId(), presentation.getProgramId());
}
diff --git a/media/java/android/media/MediaDescription.java b/media/java/android/media/MediaDescription.java
index 31079e5c54d4..39eeb3eae49f 100644
--- a/media/java/android/media/MediaDescription.java
+++ b/media/java/android/media/MediaDescription.java
@@ -1,3 +1,19 @@
+/*
+ * 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.
+ */
+
package android.media;
import android.annotation.Nullable;
@@ -226,7 +242,7 @@ public class MediaDescription implements Parcelable {
return false;
}
- if (!(o instanceof MediaDescription)){
+ if (!(o instanceof MediaDescription)) {
return false;
}
@@ -375,6 +391,11 @@ public class MediaDescription implements Parcelable {
return this;
}
+ /**
+ * Build {@link MediaDescription}.
+ *
+ * @return a new media description.
+ */
public MediaDescription build() {
return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, mIcon, mIconUri,
mExtras, mMediaUri);
diff --git a/media/apex/java/android/media/MediaParceledListSlice.aidl b/media/java/android/media/MediaParceledListSlice.aidl
index 5c0e5bc84720..5c0e5bc84720 100644
--- a/media/apex/java/android/media/MediaParceledListSlice.aidl
+++ b/media/java/android/media/MediaParceledListSlice.aidl
diff --git a/media/apex/java/android/media/MediaParceledListSlice.java b/media/java/android/media/MediaParceledListSlice.java
index 16a37d99fb86..16a37d99fb86 100644
--- a/media/apex/java/android/media/MediaParceledListSlice.java
+++ b/media/java/android/media/MediaParceledListSlice.java
diff --git a/media/java/android/media/Rating.java b/media/java/android/media/Rating.java
index 04d5364f7c81..ffe7e48f25e4 100644
--- a/media/java/android/media/Rating.java
+++ b/media/java/android/media/Rating.java
@@ -33,7 +33,7 @@ import java.lang.annotation.RetentionPolicy;
* through one of the factory methods.
*/
public final class Rating implements Parcelable {
- private final static String TAG = "Rating";
+ private static final String TAG = "Rating";
/**
* @hide
@@ -55,40 +55,40 @@ public final class Rating implements Parcelable {
* type, but can be used by other classes to indicate they do not support
* Rating.
*/
- public final static int RATING_NONE = 0;
+ public static final int RATING_NONE = 0;
/**
* A rating style with a single degree of rating, "heart" vs "no heart". Can be used to
* indicate the content referred to is a favorite (or not).
*/
- public final static int RATING_HEART = 1;
+ public static final int RATING_HEART = 1;
/**
* A rating style for "thumb up" vs "thumb down".
*/
- public final static int RATING_THUMB_UP_DOWN = 2;
+ public static final int RATING_THUMB_UP_DOWN = 2;
/**
* A rating style with 0 to 3 stars.
*/
- public final static int RATING_3_STARS = 3;
+ public static final int RATING_3_STARS = 3;
/**
* A rating style with 0 to 4 stars.
*/
- public final static int RATING_4_STARS = 4;
+ public static final int RATING_4_STARS = 4;
/**
* A rating style with 0 to 5 stars.
*/
- public final static int RATING_5_STARS = 5;
+ public static final int RATING_5_STARS = 5;
/**
* A rating style expressed as a percentage.
*/
- public final static int RATING_PERCENTAGE = 6;
+ public static final int RATING_PERCENTAGE = 6;
- private final static float RATING_NOT_RATED = -1.0f;
+ private static final float RATING_NOT_RATED = -1.0f;
private final int mRatingStyle;
@@ -116,8 +116,7 @@ public final class Rating implements Parcelable {
dest.writeFloat(mRatingValue);
}
- public static final Parcelable.Creator<Rating> CREATOR
- = new Parcelable.Creator<Rating>() {
+ public static final Parcelable.Creator<Rating> CREATOR = new Parcelable.Creator<Rating>() {
/**
* Rebuilds a Rating previously stored with writeToParcel().
* @param p Parcel object to read the Rating from
@@ -205,7 +204,7 @@ public final class Rating implements Parcelable {
break;
default:
Log.e(TAG, "Invalid rating style (" + starRatingStyle + ") for a star rating");
- return null;
+ return null;
}
if ((starRating < 0.0f) || (starRating > maxRating)) {
Log.e(TAG, "Trying to set out of range star-based rating");
@@ -281,16 +280,16 @@ public final class Rating implements Parcelable {
* not star-based, or if it is unrated.
*/
public float getStarRating() {
+ float ratingValue = -1.0f;
switch (mRatingStyle) {
case RATING_3_STARS:
case RATING_4_STARS:
case RATING_5_STARS:
if (isRated()) {
- return mRatingValue;
+ ratingValue = mRatingValue;
}
- default:
- return -1.0f;
}
+ return ratingValue;
}
/**
diff --git a/media/apex/java/android/media/VolumeProvider.java b/media/java/android/media/VolumeProvider.java
index 49202eecef19..49202eecef19 100644
--- a/media/apex/java/android/media/VolumeProvider.java
+++ b/media/java/android/media/VolumeProvider.java
diff --git a/media/apex/java/android/media/browse/MediaBrowser.aidl b/media/java/android/media/browse/MediaBrowser.aidl
index 782e09471a56..782e09471a56 100644
--- a/media/apex/java/android/media/browse/MediaBrowser.aidl
+++ b/media/java/android/media/browse/MediaBrowser.aidl
diff --git a/media/apex/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java
index 2dffef9fb40a..2dffef9fb40a 100644
--- a/media/apex/java/android/media/browse/MediaBrowser.java
+++ b/media/java/android/media/browse/MediaBrowser.java
diff --git a/media/apex/java/android/media/browse/MediaBrowserUtils.java b/media/java/android/media/browse/MediaBrowserUtils.java
index 19d9f008d3db..19d9f008d3db 100644
--- a/media/apex/java/android/media/browse/MediaBrowserUtils.java
+++ b/media/java/android/media/browse/MediaBrowserUtils.java
diff --git a/media/apex/java/android/media/session/ControllerCallbackLink.aidl b/media/java/android/media/session/ControllerCallbackLink.aidl
index 8ee8c7d00148..8ee8c7d00148 100644
--- a/media/apex/java/android/media/session/ControllerCallbackLink.aidl
+++ b/media/java/android/media/session/ControllerCallbackLink.aidl
diff --git a/media/apex/java/android/media/session/ControllerCallbackLink.java b/media/java/android/media/session/ControllerCallbackLink.java
index adc14a550b7d..adc14a550b7d 100644
--- a/media/apex/java/android/media/session/ControllerCallbackLink.java
+++ b/media/java/android/media/session/ControllerCallbackLink.java
diff --git a/media/apex/java/android/media/session/ControllerLink.aidl b/media/java/android/media/session/ControllerLink.aidl
index 532df59d16cf..532df59d16cf 100644
--- a/media/apex/java/android/media/session/ControllerLink.aidl
+++ b/media/java/android/media/session/ControllerLink.aidl
diff --git a/media/apex/java/android/media/session/ControllerLink.java b/media/java/android/media/session/ControllerLink.java
index f60ec000f2d2..f60ec000f2d2 100644
--- a/media/apex/java/android/media/session/ControllerLink.java
+++ b/media/java/android/media/session/ControllerLink.java
diff --git a/media/apex/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl
index 9b1ad7bcf77c..9b1ad7bcf77c 100644
--- a/media/apex/java/android/media/session/ISession.aidl
+++ b/media/java/android/media/session/ISession.aidl
diff --git a/media/apex/java/android/media/session/ISessionCallback.aidl b/media/java/android/media/session/ISessionCallback.aidl
index 9b86bfced340..9b86bfced340 100644
--- a/media/apex/java/android/media/session/ISessionCallback.aidl
+++ b/media/java/android/media/session/ISessionCallback.aidl
diff --git a/media/apex/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl
index e697c65e11c0..e697c65e11c0 100644
--- a/media/apex/java/android/media/session/ISessionController.aidl
+++ b/media/java/android/media/session/ISessionController.aidl
diff --git a/media/apex/java/android/media/session/ISessionControllerCallback.aidl b/media/java/android/media/session/ISessionControllerCallback.aidl
index 56ae852d6f50..56ae852d6f50 100644
--- a/media/apex/java/android/media/session/ISessionControllerCallback.aidl
+++ b/media/java/android/media/session/ISessionControllerCallback.aidl
diff --git a/media/apex/java/android/media/session/MediaController.aidl b/media/java/android/media/session/MediaController.aidl
index 17167f45d0e3..17167f45d0e3 100644
--- a/media/apex/java/android/media/session/MediaController.aidl
+++ b/media/java/android/media/session/MediaController.aidl
diff --git a/media/apex/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
index 1333ab097219..1333ab097219 100644
--- a/media/apex/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java
index ca3346c9a8c4..03627de9343c 100644
--- a/media/java/android/media/session/MediaSession.java
+++ b/media/java/android/media/session/MediaSession.java
@@ -142,10 +142,9 @@ public final class MediaSession {
MediaSessionManager manager = (MediaSessionManager) context
.getSystemService(Context.MEDIA_SESSION_SERVICE);
try {
- MediaSessionEngine.CallbackStub cbStub = new MediaSessionEngine.CallbackStub();
- SessionCallbackLink cbLink = new SessionCallbackLink(context, cbStub);
+ SessionCallbackLink cbLink = new SessionCallbackLink(context);
SessionLink sessionLink = manager.createSession(cbLink, tag);
- mImpl = new MediaSessionEngine(context, sessionLink, cbLink, cbStub);
+ mImpl = new MediaSessionEngine(context, sessionLink, cbLink);
mMaxBitmapSize = context.getResources().getDimensionPixelSize(
android.R.dimen.config_mediaMetadataBitmapMaxSize);
} catch (RuntimeException e) {
diff --git a/media/apex/java/android/media/session/MediaSessionEngine.java b/media/java/android/media/session/MediaSessionEngine.java
index 31714e1bde7f..7fea90dd0c43 100644
--- a/media/apex/java/android/media/session/MediaSessionEngine.java
+++ b/media/java/android/media/session/MediaSessionEngine.java
@@ -19,7 +19,6 @@ package android.media.session;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.annotation.UnsupportedAppUsage;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
@@ -44,7 +43,6 @@ import android.util.Pair;
import android.view.KeyEvent;
import android.view.ViewConfiguration;
-import java.lang.ref.WeakReference;
import java.util.List;
import java.util.Objects;
@@ -60,10 +58,7 @@ public final class MediaSessionEngine implements AutoCloseable {
private final MediaSession.Token mSessionToken;
private final MediaController mController;
private final SessionLink mSessionLink;
- private final SessionCallbackLink mCbLink;
- // Do not change the name of mCallbackWrapper. Support lib accesses this by using reflection.
- @UnsupportedAppUsage
private CallbackMessageHandler mCallbackHandler;
private VolumeProvider mVolumeProvider;
private PlaybackState mPlaybackState;
@@ -78,14 +73,12 @@ public final class MediaSessionEngine implements AutoCloseable {
*
* @param context The context to use to create the session.
* @param sessionLink A session link for the binder of MediaSessionRecord
- * @param cbStub A callback link that handles incoming command to {@link MediaSession.Callback}.
*/
public MediaSessionEngine(@NonNull Context context, @NonNull SessionLink sessionLink,
- @NonNull SessionCallbackLink cbLink, @NonNull CallbackStub cbStub) {
+ @NonNull SessionCallbackLink cbLink) {
mSessionLink = sessionLink;
- mCbLink = cbLink;
- cbStub.setSessionImpl(this);
+ cbLink.setSessionEngine(this);
mSessionToken = new MediaSession.Token(mSessionLink.getController());
mController = new MediaController(context, mSessionToken);
}
@@ -479,97 +472,97 @@ public final class MediaSessionEngine implements AutoCloseable {
}
}
- private void dispatchPrepare(RemoteUserInfo caller) {
+ void dispatchPrepare(RemoteUserInfo caller) {
postToCallback(caller, CallbackMessageHandler.MSG_PREPARE, null, null);
}
- private void dispatchPrepareFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
+ void dispatchPrepareFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_MEDIA_ID, mediaId, extras);
}
- private void dispatchPrepareFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
+ void dispatchPrepareFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_SEARCH, query, extras);
}
- private void dispatchPrepareFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
+ void dispatchPrepareFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_URI, uri, extras);
}
- private void dispatchPlay(RemoteUserInfo caller) {
+ void dispatchPlay(RemoteUserInfo caller) {
postToCallback(caller, CallbackMessageHandler.MSG_PLAY, null, null);
}
- private void dispatchPlayFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
+ void dispatchPlayFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) {
postToCallback(caller, CallbackMessageHandler.MSG_PLAY_MEDIA_ID, mediaId, extras);
}
- private void dispatchPlayFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
+ void dispatchPlayFromSearch(RemoteUserInfo caller, String query, Bundle extras) {
postToCallback(caller, CallbackMessageHandler.MSG_PLAY_SEARCH, query, extras);
}
- private void dispatchPlayFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
+ void dispatchPlayFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) {
postToCallback(caller, CallbackMessageHandler.MSG_PLAY_URI, uri, extras);
}
- private void dispatchSkipToItem(RemoteUserInfo caller, long id) {
+ void dispatchSkipToItem(RemoteUserInfo caller, long id) {
postToCallback(caller, CallbackMessageHandler.MSG_SKIP_TO_ITEM, id, null);
}
- private void dispatchPause(RemoteUserInfo caller) {
+ void dispatchPause(RemoteUserInfo caller) {
postToCallback(caller, CallbackMessageHandler.MSG_PAUSE, null, null);
}
- private void dispatchStop(RemoteUserInfo caller) {
+ void dispatchStop(RemoteUserInfo caller) {
postToCallback(caller, CallbackMessageHandler.MSG_STOP, null, null);
}
- private void dispatchNext(RemoteUserInfo caller) {
+ void dispatchNext(RemoteUserInfo caller) {
postToCallback(caller, CallbackMessageHandler.MSG_NEXT, null, null);
}
- private void dispatchPrevious(RemoteUserInfo caller) {
+ void dispatchPrevious(RemoteUserInfo caller) {
postToCallback(caller, CallbackMessageHandler.MSG_PREVIOUS, null, null);
}
- private void dispatchFastForward(RemoteUserInfo caller) {
+ void dispatchFastForward(RemoteUserInfo caller) {
postToCallback(caller, CallbackMessageHandler.MSG_FAST_FORWARD, null, null);
}
- private void dispatchRewind(RemoteUserInfo caller) {
+ void dispatchRewind(RemoteUserInfo caller) {
postToCallback(caller, CallbackMessageHandler.MSG_REWIND, null, null);
}
- private void dispatchSeekTo(RemoteUserInfo caller, long pos) {
+ void dispatchSeekTo(RemoteUserInfo caller, long pos) {
postToCallback(caller, CallbackMessageHandler.MSG_SEEK_TO, pos, null);
}
- private void dispatchRate(RemoteUserInfo caller, Rating rating) {
+ void dispatchRate(RemoteUserInfo caller, Rating rating) {
postToCallback(caller, CallbackMessageHandler.MSG_RATE, rating, null);
}
- private void dispatchCustomAction(RemoteUserInfo caller, String action, Bundle args) {
+ void dispatchCustomAction(RemoteUserInfo caller, String action, Bundle args) {
postToCallback(caller, CallbackMessageHandler.MSG_CUSTOM_ACTION, action, args);
}
- private void dispatchMediaButton(RemoteUserInfo caller, Intent mediaButtonIntent) {
+ void dispatchMediaButton(RemoteUserInfo caller, Intent mediaButtonIntent) {
postToCallback(caller, CallbackMessageHandler.MSG_MEDIA_BUTTON, mediaButtonIntent, null);
}
- private void dispatchMediaButtonDelayed(RemoteUserInfo info, Intent mediaButtonIntent,
+ void dispatchMediaButtonDelayed(RemoteUserInfo info, Intent mediaButtonIntent,
long delay) {
postToCallbackDelayed(info, CallbackMessageHandler.MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT,
mediaButtonIntent, null, delay);
}
- private void dispatchAdjustVolume(RemoteUserInfo caller, int direction) {
+ void dispatchAdjustVolume(RemoteUserInfo caller, int direction) {
postToCallback(caller, CallbackMessageHandler.MSG_ADJUST_VOLUME, direction, null);
}
- private void dispatchSetVolumeTo(RemoteUserInfo caller, int volume) {
+ void dispatchSetVolumeTo(RemoteUserInfo caller, int volume) {
postToCallback(caller, CallbackMessageHandler.MSG_SET_VOLUME, volume, null);
}
- private void dispatchCommand(RemoteUserInfo caller, String command, Bundle args,
+ void dispatchCommand(RemoteUserInfo caller, String command, Bundle args,
ResultReceiver resultCb) {
Command cmd = new Command(command, args, resultCb);
postToCallback(caller, CallbackMessageHandler.MSG_COMMAND, cmd, null);
@@ -979,259 +972,7 @@ public final class MediaSessionEngine implements AutoCloseable {
}
}
- /**
- * @hide
- */
- @SystemApi
- public static final class CallbackStub extends SessionCallbackLink.CallbackStub {
- private WeakReference<MediaSessionEngine> mSessionImpl;
-
- private static RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid) {
- return new RemoteUserInfo(packageName, pid, uid);
- }
-
- public CallbackStub() {
- }
-
- @Override
- public void onCommand(String packageName, int pid, int uid,
- ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchCommand(createRemoteUserInfo(packageName, pid, uid),
- command, args, cb);
- }
- }
-
- @Override
- public void onMediaButton(String packageName, int pid, int uid, Intent mediaButtonIntent,
- int sequenceNumber, ResultReceiver cb) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- try {
- if (sessionImpl != null) {
- sessionImpl.dispatchMediaButton(
- createRemoteUserInfo(packageName, pid, uid), mediaButtonIntent);
- }
- } finally {
- if (cb != null) {
- cb.send(sequenceNumber, null);
- }
- }
- }
-
- @Override
- public void onMediaButtonFromController(String packageName, int pid, int uid,
- ControllerCallbackLink caller, Intent mediaButtonIntent) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid),
- mediaButtonIntent);
- }
- }
-
- @Override
- public void onPrepare(String packageName, int pid, int uid,
- ControllerCallbackLink caller) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPrepare(createRemoteUserInfo(packageName, pid, uid));
- }
- }
-
- @Override
- public void onPrepareFromMediaId(String packageName, int pid, int uid,
- ControllerCallbackLink caller, String mediaId,
- Bundle extras) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPrepareFromMediaId(
- createRemoteUserInfo(packageName, pid, uid), mediaId, extras);
- }
- }
-
- @Override
- public void onPrepareFromSearch(String packageName, int pid, int uid,
- ControllerCallbackLink caller, String query,
- Bundle extras) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPrepareFromSearch(
- createRemoteUserInfo(packageName, pid, uid), query, extras);
- }
- }
-
- @Override
- public void onPrepareFromUri(String packageName, int pid, int uid,
- ControllerCallbackLink caller, Uri uri, Bundle extras) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPrepareFromUri(
- createRemoteUserInfo(packageName, pid, uid), uri, extras);
- }
- }
-
- @Override
- public void onPlay(String packageName, int pid, int uid,
- ControllerCallbackLink caller) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPlay(createRemoteUserInfo(packageName, pid, uid));
- }
- }
-
- @Override
- public void onPlayFromMediaId(String packageName, int pid, int uid,
- ControllerCallbackLink caller, String mediaId,
- Bundle extras) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPlayFromMediaId(
- createRemoteUserInfo(packageName, pid, uid), mediaId, extras);
- }
- }
-
- @Override
- public void onPlayFromSearch(String packageName, int pid, int uid,
- ControllerCallbackLink caller, String query,
- Bundle extras) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPlayFromSearch(
- createRemoteUserInfo(packageName, pid, uid), query, extras);
- }
- }
-
- @Override
- public void onPlayFromUri(String packageName, int pid, int uid,
- ControllerCallbackLink caller, Uri uri, Bundle extras) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPlayFromUri(
- createRemoteUserInfo(packageName, pid, uid), uri, extras);
- }
- }
-
- @Override
- public void onSkipToTrack(String packageName, int pid, int uid,
- ControllerCallbackLink caller, long id) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchSkipToItem(
- createRemoteUserInfo(packageName, pid, uid), id);
- }
- }
-
- @Override
- public void onPause(String packageName, int pid, int uid,
- ControllerCallbackLink caller) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPause(createRemoteUserInfo(packageName, pid, uid));
- }
- }
-
- @Override
- public void onStop(String packageName, int pid, int uid,
- ControllerCallbackLink caller) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchStop(createRemoteUserInfo(packageName, pid, uid));
- }
- }
-
- @Override
- public void onNext(String packageName, int pid, int uid,
- ControllerCallbackLink caller) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchNext(createRemoteUserInfo(packageName, pid, uid));
- }
- }
-
- @Override
- public void onPrevious(String packageName, int pid, int uid,
- ControllerCallbackLink caller) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchPrevious(createRemoteUserInfo(packageName, pid, uid));
- }
- }
-
- @Override
- public void onFastForward(String packageName, int pid, int uid,
- ControllerCallbackLink caller) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchFastForward(
- createRemoteUserInfo(packageName, pid, uid));
- }
- }
-
- @Override
- public void onRewind(String packageName, int pid, int uid,
- ControllerCallbackLink caller) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchRewind(createRemoteUserInfo(packageName, pid, uid));
- }
- }
-
- @Override
- public void onSeekTo(String packageName, int pid, int uid,
- ControllerCallbackLink caller, long pos) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchSeekTo(
- createRemoteUserInfo(packageName, pid, uid), pos);
- }
- }
-
- @Override
- public void onRate(String packageName, int pid, int uid, ControllerCallbackLink caller,
- Rating rating) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchRate(
- createRemoteUserInfo(packageName, pid, uid), rating);
- }
- }
-
- @Override
- public void onCustomAction(String packageName, int pid, int uid,
- ControllerCallbackLink caller, String action, Bundle args) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchCustomAction(
- createRemoteUserInfo(packageName, pid, uid), action, args);
- }
- }
-
- @Override
- public void onAdjustVolume(String packageName, int pid, int uid,
- ControllerCallbackLink caller, int direction) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchAdjustVolume(
- createRemoteUserInfo(packageName, pid, uid), direction);
- }
- }
-
- @Override
- public void onSetVolumeTo(String packageName, int pid, int uid,
- ControllerCallbackLink caller, int value) {
- MediaSessionEngine sessionImpl = mSessionImpl.get();
- if (sessionImpl != null) {
- sessionImpl.dispatchSetVolumeTo(
- createRemoteUserInfo(packageName, pid, uid), value);
- }
- }
-
- void setSessionImpl(MediaSessionEngine sessionImpl) {
- mSessionImpl = new WeakReference<>(sessionImpl);
- }
- }
-
- /**
+ /**
* A single item that is part of the play queue. It contains a description
* of the item and its id in the queue.
*/
diff --git a/media/apex/java/android/media/session/MediaSessionProviderService.java b/media/java/android/media/session/MediaSessionProviderService.java
index 9a346ff4a12e..9a346ff4a12e 100644
--- a/media/apex/java/android/media/session/MediaSessionProviderService.java
+++ b/media/java/android/media/session/MediaSessionProviderService.java
diff --git a/media/apex/java/android/media/session/PlaybackState.aidl b/media/java/android/media/session/PlaybackState.aidl
index 0876ebd2d4d2..0876ebd2d4d2 100644
--- a/media/apex/java/android/media/session/PlaybackState.aidl
+++ b/media/java/android/media/session/PlaybackState.aidl
diff --git a/media/apex/java/android/media/session/PlaybackState.java b/media/java/android/media/session/PlaybackState.java
index 6b28c976c710..6b28c976c710 100644
--- a/media/apex/java/android/media/session/PlaybackState.java
+++ b/media/java/android/media/session/PlaybackState.java
diff --git a/media/apex/java/android/media/session/SessionCallbackLink.aidl b/media/java/android/media/session/SessionCallbackLink.aidl
index c489e5bee6e2..c489e5bee6e2 100644
--- a/media/apex/java/android/media/session/SessionCallbackLink.aidl
+++ b/media/java/android/media/session/SessionCallbackLink.aidl
diff --git a/media/apex/java/android/media/session/SessionCallbackLink.java b/media/java/android/media/session/SessionCallbackLink.java
index 3bcb65c42010..4c2918a0fa94 100644
--- a/media/apex/java/android/media/session/SessionCallbackLink.java
+++ b/media/java/android/media/session/SessionCallbackLink.java
@@ -25,6 +25,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.Rating;
+import android.media.session.MediaSessionManager.RemoteUserInfo;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
@@ -35,6 +36,8 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.ResultReceiver;
+import java.lang.ref.WeakReference;
+
/**
* Handles incoming commands to {@link MediaSession.Callback}.
* @hide
@@ -42,16 +45,15 @@ import android.os.ResultReceiver;
@SystemApi
public final class SessionCallbackLink implements Parcelable {
final Context mContext;
- final CallbackStub mCallbackStub;
final ISessionCallback mISessionCallback;
/**
* Constructor for stub (Callee)
+ * @hide
*/
- SessionCallbackLink(@NonNull Context context, @NonNull CallbackStub callbackStub) {
+ public SessionCallbackLink(@NonNull Context context) {
mContext = context;
- mCallbackStub = callbackStub;
- mISessionCallback = new CallbackStubProxy();
+ mISessionCallback = new CallbackStub();
}
/**
@@ -59,11 +61,19 @@ public final class SessionCallbackLink implements Parcelable {
*/
public SessionCallbackLink(IBinder binder) {
mContext = null;
- mCallbackStub = null;
mISessionCallback = ISessionCallback.Stub.asInterface(binder);
}
/**
+ * Set {@link MediaSessionEngine} which will be used by {@link CallbackStub}.
+ */
+ void setSessionEngine(@Nullable MediaSessionEngine sessionImpl) {
+ if (mISessionCallback instanceof CallbackStub) {
+ ((CallbackStub) mISessionCallback).mSessionImpl = new WeakReference<>(sessionImpl);
+ }
+ }
+
+ /**
* Notify session that a controller sends a command.
*
* @param packageName the package name of the controller
@@ -540,139 +550,24 @@ public final class SessionCallbackLink implements Parcelable {
}
};
- /**
- * Class for Stub implementation
- */
- abstract static class CallbackStub {
- /** Stub method for ISessionCallback.notifyCommand */
- public void onCommand(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, @NonNull String command,
- @Nullable Bundle args, @Nullable ResultReceiver cb) {
- }
-
- /** Stub method for ISessionCallback.notifyMediaButton */
- public void onMediaButton(@NonNull String packageName, int pid, int uid,
- @NonNull Intent mediaButtonIntent, int sequenceNumber,
- @Nullable ResultReceiver cb) {
- }
-
- /** Stub method for ISessionCallback.notifyMediaButtonFromController */
- public void onMediaButtonFromController(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, @NonNull Intent mediaButtonIntent) {
- }
-
- /** Stub method for ISessionCallback.notifyPrepare */
- public void onPrepare(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller) {
- }
-
- /** Stub method for ISessionCallback.notifyPrepareFromMediaId */
- public void onPrepareFromMediaId(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, @NonNull String mediaId,
- @Nullable Bundle extras) {
- }
-
- /** Stub method for ISessionCallback.notifyPrepareFromSearch */
- public void onPrepareFromSearch(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, String query, @Nullable Bundle extras) {
- }
-
- /** Stub method for ISessionCallback.notifyPrepareFromUri */
- public void onPrepareFromUri(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) {
- }
-
- /** Stub method for ISessionCallback.notifyPlay */
- public void onPlay(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller) {
- }
-
- /** Stub method for ISessionCallback.notifyPlayFromMediaId */
- public void onPlayFromMediaId(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, @NonNull String mediaId,
- @Nullable Bundle extras) {
- }
-
- /** Stub method for ISessionCallback.notifyPlayFromSearch */
- public void onPlayFromSearch(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, String query, @Nullable Bundle extras) {
- }
-
- /** Stub method for ISessionCallback.notifyPlayFromUri */
- public void onPlayFromUri(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) {
- }
-
- /** Stub method for ISessionCallback.notifySkipToTrack */
- public void onSkipToTrack(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, long id) {
- }
-
- /** Stub method for ISessionCallback.notifyPause */
- public void onPause(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller) {
- }
-
- /** Stub method for ISessionCallback.notifyStop */
- public void onStop(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller) {
- }
-
- /** Stub method for ISessionCallback.notifyNext */
- public void onNext(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller) {
- }
-
- /** Stub method for ISessionCallback.notifyPrevious */
- public void onPrevious(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller) {
- }
-
- /** Stub method for ISessionCallback.notifyFastForward */
- public void onFastForward(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller) {
- }
-
- /** Stub method for ISessionCallback.notifyRewind */
- public void onRewind(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller) {
- }
+ private class CallbackStub extends ISessionCallback.Stub {
+ private WeakReference<MediaSessionEngine> mSessionImpl;
- /** Stub method for ISessionCallback.notifySeekTo */
- public void onSeekTo(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, long pos) {
+ private RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid) {
+ return new RemoteUserInfo(packageName, pid, uid);
}
- /** Stub method for ISessionCallback.notifyRate */
- public void onRate(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, @NonNull Rating rating) {
- }
-
- /** Stub method for ISessionCallback.notifyCustomAction */
- public void onCustomAction(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, @NonNull String action,
- @Nullable Bundle args) {
- }
-
- /** Stub method for ISessionCallback.notifyAdjustVolume */
- public void onAdjustVolume(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, int direction) {
- }
-
- /** Stub method for ISessionCallback.notifySetVolumeTo */
- public void onSetVolumeTo(@NonNull String packageName, int pid, int uid,
- @NonNull ControllerCallbackLink caller, int value) {
- }
- }
-
- private class CallbackStubProxy extends ISessionCallback.Stub {
@Override
public void notifyCommand(String packageName, int pid, int uid,
ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onCommand(packageName, pid, uid, caller, command, args, cb);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchCommand(createRemoteUserInfo(packageName, pid, uid),
+ command, args, cb);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -684,9 +579,15 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onMediaButton(packageName, pid, uid, mediaButtonIntent,
- sequenceNumber, cb);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchMediaButton(
+ createRemoteUserInfo(packageName, pid, uid), mediaButtonIntent);
+ }
} finally {
+ if (cb != null) {
+ cb.send(sequenceNumber, null);
+ }
Binder.restoreCallingIdentity(token);
}
}
@@ -697,8 +598,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onMediaButtonFromController(packageName, pid, uid, caller,
- mediaButtonIntent);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid),
+ mediaButtonIntent);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -710,7 +614,10 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPrepare(packageName, pid, uid, caller);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPrepare(createRemoteUserInfo(packageName, pid, uid));
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -722,7 +629,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPrepareFromMediaId(packageName, pid, uid, caller, mediaId, extras);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPrepareFromMediaId(
+ createRemoteUserInfo(packageName, pid, uid), mediaId, extras);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -734,7 +645,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPrepareFromSearch(packageName, pid, uid, caller, query, extras);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPrepareFromSearch(
+ createRemoteUserInfo(packageName, pid, uid), query, extras);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -746,7 +661,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPrepareFromUri(packageName, pid, uid, caller, uri, extras);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPrepareFromUri(
+ createRemoteUserInfo(packageName, pid, uid), uri, extras);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -758,7 +677,10 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPlay(packageName, pid, uid, caller);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPlay(createRemoteUserInfo(packageName, pid, uid));
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -770,7 +692,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPlayFromMediaId(packageName, pid, uid, caller, mediaId, extras);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPlayFromMediaId(
+ createRemoteUserInfo(packageName, pid, uid), mediaId, extras);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -782,7 +708,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPlayFromSearch(packageName, pid, uid, caller, query, extras);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPlayFromSearch(
+ createRemoteUserInfo(packageName, pid, uid), query, extras);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -794,7 +724,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPlayFromUri(packageName, pid, uid, caller, uri, extras);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPlayFromUri(
+ createRemoteUserInfo(packageName, pid, uid), uri, extras);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -806,7 +740,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onSkipToTrack(packageName, pid, uid, caller, id);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchSkipToItem(
+ createRemoteUserInfo(packageName, pid, uid), id);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -818,7 +756,10 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPause(packageName, pid, uid, caller);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPause(createRemoteUserInfo(packageName, pid, uid));
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -830,7 +771,10 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onStop(packageName, pid, uid, caller);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchStop(createRemoteUserInfo(packageName, pid, uid));
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -842,7 +786,10 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onNext(packageName, pid, uid, caller);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchNext(createRemoteUserInfo(packageName, pid, uid));
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -854,7 +801,10 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onPrevious(packageName, pid, uid, caller);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchPrevious(createRemoteUserInfo(packageName, pid, uid));
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -866,7 +816,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onFastForward(packageName, pid, uid, caller);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchFastForward(
+ createRemoteUserInfo(packageName, pid, uid));
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -878,7 +832,10 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onRewind(packageName, pid, uid, caller);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchRewind(createRemoteUserInfo(packageName, pid, uid));
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -890,7 +847,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onSeekTo(packageName, pid, uid, caller, pos);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchSeekTo(
+ createRemoteUserInfo(packageName, pid, uid), pos);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -902,7 +863,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onRate(packageName, pid, uid, caller, rating);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchRate(
+ createRemoteUserInfo(packageName, pid, uid), rating);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -913,7 +878,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onCustomAction(packageName, pid, uid, caller, action, args);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchCustomAction(
+ createRemoteUserInfo(packageName, pid, uid), action, args);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -925,7 +894,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onAdjustVolume(packageName, pid, uid, caller, direction);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchAdjustVolume(
+ createRemoteUserInfo(packageName, pid, uid), direction);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -937,7 +910,11 @@ public final class SessionCallbackLink implements Parcelable {
ensureMediaControlPermission();
final long token = Binder.clearCallingIdentity();
try {
- mCallbackStub.onSetVolumeTo(packageName, pid, uid, caller, value);
+ MediaSessionEngine sessionImpl = mSessionImpl.get();
+ if (sessionImpl != null) {
+ sessionImpl.dispatchSetVolumeTo(
+ createRemoteUserInfo(packageName, pid, uid), value);
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/media/apex/java/android/media/session/SessionLink.aidl b/media/java/android/media/session/SessionLink.aidl
index c3be23e8f6b7..c3be23e8f6b7 100644
--- a/media/apex/java/android/media/session/SessionLink.aidl
+++ b/media/java/android/media/session/SessionLink.aidl
diff --git a/media/apex/java/android/media/session/SessionLink.java b/media/java/android/media/session/SessionLink.java
index 4ea762367010..4ea762367010 100644
--- a/media/apex/java/android/media/session/SessionLink.java
+++ b/media/java/android/media/session/SessionLink.java
diff --git a/media/apex/java/android/service/media/IMediaBrowserService.aidl b/media/java/android/service/media/IMediaBrowserService.aidl
index 1c50ec7ac421..1c50ec7ac421 100644
--- a/media/apex/java/android/service/media/IMediaBrowserService.aidl
+++ b/media/java/android/service/media/IMediaBrowserService.aidl
diff --git a/media/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl b/media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl
index 507a8f72ea57..507a8f72ea57 100644
--- a/media/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl
+++ b/media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl
diff --git a/media/apex/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java
index d9ef6ae40dfb..d9ef6ae40dfb 100644
--- a/media/apex/java/android/service/media/MediaBrowserService.java
+++ b/media/java/android/service/media/MediaBrowserService.java
diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp
index 81fce8a8044b..866325c5ea9c 100644
--- a/media/jni/android_media_MediaDrm.cpp
+++ b/media/jni/android_media_MediaDrm.cpp
@@ -426,6 +426,9 @@ static bool throwExceptionAsNecessary(
if (err == BAD_VALUE || err == ERROR_DRM_CANNOT_HANDLE) {
jniThrowException(env, "java/lang/IllegalArgumentException", msg);
return true;
+ } else if (err == ERROR_UNSUPPORTED) {
+ jniThrowException(env, "java/lang/UnsupportedOperationException", msg);
+ return true;
} else if (err == ERROR_DRM_NOT_PROVISIONED) {
jniThrowException(env, "android/media/NotProvisionedException", msg);
return true;
@@ -542,15 +545,15 @@ void JDrm::disconnect() {
// static
-bool JDrm::IsCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType,
- DrmPlugin::SecurityLevel securityLevel) {
+status_t JDrm::IsCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType,
+ DrmPlugin::SecurityLevel securityLevel, bool *isSupported) {
sp<IDrm> drm = MakeDrm();
if (drm == NULL) {
- return false;
+ return BAD_VALUE;
}
- return drm->isCryptoSchemeSupported(uuid, mimeType, securityLevel);
+ return drm->isCryptoSchemeSupported(uuid, mimeType, securityLevel, isSupported);
}
status_t JDrm::initCheck() const {
@@ -977,7 +980,14 @@ static jboolean android_media_MediaDrm_isCryptoSchemeSupportedNative(
}
DrmPlugin::SecurityLevel securityLevel = jintToSecurityLevel(jSecurityLevel);
- return JDrm::IsCryptoSchemeSupported(uuid.array(), mimeType, securityLevel);
+ bool isSupported;
+ status_t err = JDrm::IsCryptoSchemeSupported(uuid.array(), mimeType,
+ securityLevel, &isSupported);
+
+ if (throwExceptionAsNecessary(env, err, "Failed to query crypto scheme support")) {
+ return false;
+ }
+ return isSupported;
}
static jbyteArray android_media_MediaDrm_openSession(
diff --git a/media/jni/android_media_MediaDrm.h b/media/jni/android_media_MediaDrm.h
index 93388612efcf..5ebac1d61648 100644
--- a/media/jni/android_media_MediaDrm.h
+++ b/media/jni/android_media_MediaDrm.h
@@ -37,9 +37,10 @@ public:
};
struct JDrm : public BnDrmClient {
- static bool IsCryptoSchemeSupported(const uint8_t uuid[16],
- const String8 &mimeType,
- DrmPlugin::SecurityLevel level);
+ static status_t IsCryptoSchemeSupported(const uint8_t uuid[16],
+ const String8 &mimeType,
+ DrmPlugin::SecurityLevel level,
+ bool *isSupported);
JDrm(JNIEnv *env, jobject thiz, const uint8_t uuid[16], const String8 &appPackageName);
diff --git a/native/webview/plat_support/draw_fn.h b/native/webview/plat_support/draw_fn.h
index e31ce195214f..5b3e496be81a 100644
--- a/native/webview/plat_support/draw_fn.h
+++ b/native/webview/plat_support/draw_fn.h
@@ -84,7 +84,7 @@ struct AwDrawFn_InitVkParams {
VkDevice device;
VkQueue queue;
uint32_t graphics_queue_index;
- uint32_t instance_version;
+ uint32_t api_version;
const char* const* enabled_instance_extension_names;
uint32_t enabled_instance_extension_names_length;
const char* const* enabled_device_extension_names;
diff --git a/native/webview/plat_support/draw_functor.cpp b/native/webview/plat_support/draw_functor.cpp
index afe103a25043..6deb47f09347 100644
--- a/native/webview/plat_support/draw_functor.cpp
+++ b/native/webview/plat_support/draw_functor.cpp
@@ -102,7 +102,7 @@ void initializeVk(int functor, void* data,
.device = init_vk_params.device,
.queue = init_vk_params.queue,
.graphics_queue_index = init_vk_params.graphics_queue_index,
- .instance_version = init_vk_params.instance_version,
+ .api_version = init_vk_params.api_version,
.enabled_instance_extension_names =
init_vk_params.enabled_instance_extension_names,
.enabled_instance_extension_names_length =
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index 7eaf04bfb775..0a571c5c2736 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -60,7 +60,6 @@ import android.widget.TextView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import java.io.IOException;
@@ -107,11 +106,11 @@ public class CaptivePortalLoginActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ mCaptivePortal = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL);
logMetricsEvent(MetricsEvent.ACTION_CAPTIVE_PORTAL_LOGIN_ACTIVITY);
mCm = ConnectivityManager.from(this);
mNetwork = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_NETWORK);
- mCaptivePortal = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL);
mUserAgent =
getIntent().getStringExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_USER_AGENT);
mUrl = getUrl();
@@ -637,7 +636,7 @@ public class CaptivePortalLoginActivity extends Activity {
}
private void logMetricsEvent(int event) {
- MetricsLogger.action(this, event, getPackageName());
+ mCaptivePortal.logEvent(event, getPackageName());
}
private static final SparseArray<String> SSL_ERRORS = new SparseArray<>();
diff --git a/packages/CarSystemUI/res/values/integers_car.xml b/packages/CarSystemUI/res/values/integers_car.xml
index 777283d6bf92..be2cb0d8d900 100644
--- a/packages/CarSystemUI/res/values/integers_car.xml
+++ b/packages/CarSystemUI/res/values/integers_car.xml
@@ -23,7 +23,7 @@
<!-- Number of milliseconds user can spend driving with the keyguard up. After that, we switch to Guest. -->
<!-- If the number is negative, the feature is disabled.
If it's zero, we switch to guest immediately as we start driving. -->
- <integer name="driving_on_keyguard_timeout_ms">30000</integer>
+ <integer name="driving_on_keyguard_timeout_ms">-1</integer>
<!--Percentage of the screen height, from the bottom, that a notification panel being
partially closed at will result in it remaining open if released-->
diff --git a/packages/ExtServices/Android.bp b/packages/ExtServices/Android.bp
new file mode 100644
index 000000000000..77972fedfb0d
--- /dev/null
+++ b/packages/ExtServices/Android.bp
@@ -0,0 +1,11 @@
+android_library {
+ name: "ExtServices-core",
+ srcs: [
+ "src/**/*.java",
+ ],
+ resource_dirs: [
+ "res",
+ ],
+
+ manifest: "AndroidManifest.xml",
+} \ No newline at end of file
diff --git a/packages/ExtServices/AndroidManifest.xml b/packages/ExtServices/AndroidManifest.xml
index 010a810cd791..7fb51b9496b9 100644
--- a/packages/ExtServices/AndroidManifest.xml
+++ b/packages/ExtServices/AndroidManifest.xml
@@ -22,6 +22,7 @@
coreApp="true">
<uses-permission android:name="android.permission.PROVIDE_RESOLVER_RANKER_SERVICE" />
+ <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
<application android:label="@string/app_name"
android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/ExtServices/tests/Android.bp b/packages/ExtServices/tests/Android.bp
new file mode 100644
index 000000000000..5de454836c2a
--- /dev/null
+++ b/packages/ExtServices/tests/Android.bp
@@ -0,0 +1,26 @@
+android_test {
+ name: "ExtServicesUnitTests",
+
+ // Include all test java files.
+ srcs: ["src/**/*.java"],
+
+ // We only want this apk build for tests.
+ certificate: "platform",
+
+ libs: [
+ "android.test.runner",
+ "android.test.base",
+ ],
+
+ static_libs: [
+ "ExtServices-core",
+ "android-support-test",
+ "mockito-target-minus-junit4",
+ "espresso-core",
+ "truth-prebuilt",
+ "testables",
+ "testng",
+ ],
+
+ platform_apis: true,
+} \ No newline at end of file
diff --git a/packages/ExtServices/tests/Android.mk b/packages/ExtServices/tests/Android.mk
deleted file mode 100644
index a57fa9458f08..000000000000
--- a/packages/ExtServices/tests/Android.mk
+++ /dev/null
@@ -1,26 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# We only want this apk build for tests.
-LOCAL_MODULE_TAGS := tests
-LOCAL_CERTIFICATE := platform
-
-LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
- mockito-target-minus-junit4 \
- espresso-core \
- truth-prebuilt \
- testables \
- testng
-
-# Include all test java files.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := ExtServicesUnitTests
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_INSTRUMENTATION_FOR := ExtServices
-
-include $(BUILD_PACKAGE)
diff --git a/packages/ExtServices/tests/AndroidManifest.xml b/packages/ExtServices/tests/AndroidManifest.xml
index ddf725b8cdfe..3cf152753e65 100644
--- a/packages/ExtServices/tests/AndroidManifest.xml
+++ b/packages/ExtServices/tests/AndroidManifest.xml
@@ -24,7 +24,7 @@
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="android.ext.services"
+ android:targetPackage="android.ext.services.tests.unit"
android:label="ExtServices Test Cases">
</instrumentation>
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 12908e619a3c..c59885e9f4d2 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
@@ -180,7 +180,7 @@ public class NotificationCategorizerTest {
assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_SYSTEM));
when(mSbn.getUid()).thenReturn(FIRST_APPLICATION_UID);
- assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry));
+ assertEquals(NotificationCategorizer.CATEGORY_HIGH, nc.getCategory(mEntry));
}
@Test
diff --git a/packages/NetworkStack/Android.bp b/packages/NetworkStack/Android.bp
index 9b0d896e483e..b0522f2a99a0 100644
--- a/packages/NetworkStack/Android.bp
+++ b/packages/NetworkStack/Android.bp
@@ -18,6 +18,7 @@
// system server on devices that run the stack there
java_library {
name: "NetworkStackLib",
+ sdk_version: "system_current",
installable: true,
srcs: [
"src/**/*.java",
@@ -25,14 +26,15 @@ java_library {
":services-networkstack-shared-srcs",
],
static_libs: [
- "services-netlink-lib",
+ "netd_aidl_interface-java",
+ "networkstack-aidl-interfaces-java",
]
}
// Updatable network stack packaged as an application
android_app {
name: "NetworkStack",
- platform_apis: true,
+ sdk_version: "system_current",
certificate: "platform",
privileged: true,
static_libs: [
diff --git a/packages/NetworkStack/src/android/net/apf/ApfFilter.java b/packages/NetworkStack/src/android/net/apf/ApfFilter.java
index 08452bbbe433..4fa7d6462092 100644
--- a/packages/NetworkStack/src/android/net/apf/ApfFilter.java
+++ b/packages/NetworkStack/src/android/net/apf/ApfFilter.java
@@ -38,7 +38,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.net.LinkAddress;
import android.net.LinkProperties;
-import android.net.NetworkUtils;
import android.net.apf.ApfGenerator.IllegalInstructionException;
import android.net.apf.ApfGenerator.Register;
import android.net.ip.IpClient.IpClientCallbacksWrapper;
@@ -47,6 +46,8 @@ import android.net.metrics.ApfStats;
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.RaEvent;
import android.net.util.InterfaceParams;
+import android.net.util.NetworkStackUtils;
+import android.net.util.SocketUtils;
import android.os.PowerManager;
import android.os.SystemClock;
import android.system.ErrnoException;
@@ -60,8 +61,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.HexDump;
import com.android.internal.util.IndentingPrintWriter;
-import libcore.io.IoBridge;
-
import java.io.FileDescriptor;
import java.io.IOException;
import java.net.Inet4Address;
@@ -200,10 +199,8 @@ public class ApfFilter {
public void halt() {
mStopped = true;
- try {
- // Interrupts the read() call the thread is blocked in.
- IoBridge.closeAndSignalBlockedThreads(mSocket);
- } catch (IOException ignored) {}
+ // Interrupts the read() call the thread is blocked in.
+ NetworkStackUtils.closeSocketQuietly(mSocket);
}
@Override
@@ -470,8 +467,8 @@ public class ApfFilter {
socket = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IPV6);
SocketAddress addr = makePacketSocketAddress(
(short) ETH_P_IPV6, mInterfaceParams.index);
- Os.bind(socket, addr);
- NetworkUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat);
+ SocketUtils.bindSocket(socket, addr);
+ SocketUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat);
} catch(SocketException|ErrnoException e) {
Log.e(TAG, "Error starting filter", e);
return;
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java
index 12eecc070a06..b0e8da9a7fb7 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java
@@ -28,6 +28,7 @@ import static android.net.dhcp.DhcpPacket.DHCP_SUBNET_MASK;
import static android.net.dhcp.DhcpPacket.DHCP_VENDOR_INFO;
import static android.net.dhcp.DhcpPacket.INADDR_ANY;
import static android.net.dhcp.DhcpPacket.INADDR_BROADCAST;
+import static android.net.util.NetworkStackUtils.closeSocketQuietly;
import static android.net.util.SocketUtils.makePacketSocketAddress;
import static android.system.OsConstants.AF_INET;
import static android.system.OsConstants.AF_PACKET;
@@ -44,7 +45,6 @@ import static com.android.server.util.NetworkStackConstants.IPV4_ADDR_ANY;
import android.content.Context;
import android.net.DhcpResults;
-import android.net.NetworkUtils;
import android.net.TrafficStats;
import android.net.ip.IpClient;
import android.net.metrics.DhcpClientEvent;
@@ -66,8 +66,6 @@ import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import com.android.internal.util.WakeupMessage;
-import libcore.io.IoBridge;
-
import java.io.FileDescriptor;
import java.io.IOException;
import java.net.Inet4Address;
@@ -108,6 +106,12 @@ public class DhcpClient extends StateMachine {
private static final boolean MSG_DBG = false;
private static final boolean PACKET_DBG = false;
+ // Metrics events: must be kept in sync with server-side aggregation code.
+ /** Represents transitions from DhcpInitState to DhcpBoundState */
+ private static final String EVENT_INITIAL_BOUND = "InitialBoundState";
+ /** Represents transitions from and to DhcpBoundState via DhcpRenewingState */
+ private static final String EVENT_RENEWING_BOUND = "RenewingBoundState";
+
// Timers and timeouts.
private static final int SECONDS = 1000;
private static final int FIRST_TIMEOUT_MS = 2 * SECONDS;
@@ -313,8 +317,8 @@ public class DhcpClient extends StateMachine {
try {
mPacketSock = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IP);
SocketAddress addr = makePacketSocketAddress((short) ETH_P_IP, mIface.index);
- Os.bind(mPacketSock, addr);
- NetworkUtils.attachDhcpFilter(mPacketSock);
+ SocketUtils.bindSocket(mPacketSock, addr);
+ SocketUtils.attachDhcpFilter(mPacketSock);
} catch(SocketException|ErrnoException e) {
Log.e(TAG, "Error creating packet socket", e);
return false;
@@ -350,15 +354,9 @@ public class DhcpClient extends StateMachine {
}
}
- private static void closeQuietly(FileDescriptor fd) {
- try {
- IoBridge.closeAndSignalBlockedThreads(fd);
- } catch (IOException ignored) {}
- }
-
private void closeSockets() {
- closeQuietly(mUdpSock);
- closeQuietly(mPacketSock);
+ closeSocketQuietly(mUdpSock);
+ closeSocketQuietly(mPacketSock);
}
class ReceiveThread extends Thread {
@@ -414,7 +412,8 @@ public class DhcpClient extends StateMachine {
try {
if (encap == DhcpPacket.ENCAP_L2) {
if (DBG) Log.d(TAG, "Broadcasting " + description);
- Os.sendto(mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr);
+ SocketUtils.sendTo(
+ mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr);
} else if (encap == DhcpPacket.ENCAP_BOOTP && to.equals(INADDR_BROADCAST)) {
if (DBG) Log.d(TAG, "Broadcasting " + description);
// We only send L3-encapped broadcasts in DhcpRebindingState,
@@ -928,9 +927,9 @@ public class DhcpClient extends StateMachine {
private void logTimeToBoundState() {
long now = SystemClock.elapsedRealtime();
if (mLastBoundExitTime > mLastInitEnterTime) {
- logState(DhcpClientEvent.RENEWING_BOUND, (int)(now - mLastBoundExitTime));
+ logState(EVENT_RENEWING_BOUND, (int) (now - mLastBoundExitTime));
} else {
- logState(DhcpClientEvent.INITIAL_BOUND, (int)(now - mLastInitEnterTime));
+ logState(EVENT_INITIAL_BOUND, (int) (now - mLastInitEnterTime));
}
}
}
@@ -1021,7 +1020,7 @@ public class DhcpClient extends StateMachine {
// We need to broadcast and possibly reconnect the socket to a
// completely different server.
- closeQuietly(mUdpSock);
+ closeSocketQuietly(mUdpSock);
if (!initUdpSocket()) {
Log.e(TAG, "Failed to recreate UDP socket");
transitionTo(mDhcpInitState);
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java b/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java
index eac8d2a3b410..96d1a287ef09 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java
@@ -64,7 +64,7 @@ abstract class DhcpPacketListener extends FdEventsReader<DhcpPacketListener.Payl
@Override
protected int readPacket(@NonNull FileDescriptor fd, @NonNull Payload packetBuffer)
throws Exception {
- final InetSocketAddress addr = new InetSocketAddress();
+ final InetSocketAddress addr = new InetSocketAddress(0);
final int read = Os.recvfrom(
fd, packetBuffer.mBytes, 0, packetBuffer.mBytes.length, 0 /* flags */, addr);
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java b/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java
index beabd3eb3152..cd993e93998b 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java
@@ -28,6 +28,7 @@ import static android.net.shared.Inet4AddressUtils.getPrefixMaskAsInet4Address;
import static android.system.OsConstants.AF_INET;
import static android.system.OsConstants.IPPROTO_UDP;
import static android.system.OsConstants.SOCK_DGRAM;
+import static android.system.OsConstants.SOCK_NONBLOCK;
import static android.system.OsConstants.SOL_SOCKET;
import static android.system.OsConstants.SO_BROADCAST;
import static android.system.OsConstants.SO_REUSEADDR;
@@ -43,7 +44,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.INetworkStackStatusCallback;
import android.net.MacAddress;
-import android.net.NetworkUtils;
import android.net.TrafficStats;
import android.net.util.SharedLog;
import android.net.util.SocketUtils;
@@ -207,7 +207,7 @@ public class DhcpServer extends IDhcpServer.Stub {
@Override
public void addArpEntry(@NonNull Inet4Address ipv4Addr, @NonNull MacAddress ethAddr,
@NonNull String ifname, @NonNull FileDescriptor fd) throws IOException {
- NetworkUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd);
+ SocketUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd);
}
@Override
@@ -630,7 +630,7 @@ public class DhcpServer extends IDhcpServer.Stub {
// TODO: have and use an API to set a socket tag without going through the thread tag
final int oldTag = TrafficStats.getAndSetThreadStatsTag(TAG_SYSTEM_DHCP_SERVER);
try {
- mSocket = Os.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ mSocket = Os.socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP);
SocketUtils.bindSocketToInterface(mSocket, mIfName);
Os.setsockoptInt(mSocket, SOL_SOCKET, SO_REUSEADDR, 1);
Os.setsockoptInt(mSocket, SOL_SOCKET, SO_BROADCAST, 1);
diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java
index 31ce95b11ba9..3cd2aa40dfb2 100644
--- a/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java
+++ b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java
@@ -209,7 +209,7 @@ public class DhcpServingParams {
* but it must always be set explicitly before building the {@link DhcpServingParams}.
*/
public Builder setDefaultRouters(@NonNull Inet4Address... defaultRouters) {
- return setDefaultRouters(new ArraySet<>(Arrays.asList(defaultRouters)));
+ return setDefaultRouters(makeArraySet(defaultRouters));
}
/**
@@ -239,7 +239,7 @@ public class DhcpServingParams {
* building the {@link DhcpServingParams}.
*/
public Builder setDnsServers(@NonNull Inet4Address... dnsServers) {
- return setDnsServers(new ArraySet<>(Arrays.asList(dnsServers)));
+ return setDnsServers(makeArraySet(dnsServers));
}
/**
@@ -269,7 +269,7 @@ public class DhcpServingParams {
* and do not need to be set here.
*/
public Builder setExcludedAddrs(@NonNull Inet4Address... excludedAddrs) {
- return setExcludedAddrs(new ArraySet<>(Arrays.asList(excludedAddrs)));
+ return setExcludedAddrs(makeArraySet(excludedAddrs));
}
/**
@@ -368,4 +368,10 @@ public class DhcpServingParams {
static IpPrefix makeIpPrefix(@NonNull LinkAddress addr) {
return new IpPrefix(addr.getAddress(), addr.getPrefixLength());
}
+
+ private static <T> ArraySet<T> makeArraySet(T[] elements) {
+ final ArraySet<T> set = new ArraySet<>(elements.length);
+ set.addAll(Arrays.asList(elements));
+ return set;
+ }
}
diff --git a/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java b/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java
index 385dd52e4576..649257ae3b5f 100644
--- a/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java
+++ b/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java
@@ -20,12 +20,13 @@ import static android.net.util.SocketUtils.makePacketSocketAddress;
import static android.system.OsConstants.AF_PACKET;
import static android.system.OsConstants.ARPHRD_ETHER;
import static android.system.OsConstants.ETH_P_ALL;
+import static android.system.OsConstants.SOCK_NONBLOCK;
import static android.system.OsConstants.SOCK_RAW;
-import android.net.NetworkUtils;
import android.net.util.ConnectivityPacketSummary;
import android.net.util.InterfaceParams;
import android.net.util.PacketReader;
+import android.net.util.SocketUtils;
import android.os.Handler;
import android.system.ErrnoException;
import android.system.Os;
@@ -33,7 +34,7 @@ import android.text.TextUtils;
import android.util.LocalLog;
import android.util.Log;
-import libcore.util.HexEncoding;
+import com.android.internal.util.HexDump;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -101,9 +102,10 @@ public class ConnectivityPacketTracker {
protected FileDescriptor createFd() {
FileDescriptor s = null;
try {
- s = Os.socket(AF_PACKET, SOCK_RAW, 0);
- NetworkUtils.attachControlPacketFilter(s, ARPHRD_ETHER);
- Os.bind(s, makePacketSocketAddress((short) ETH_P_ALL, mInterface.index));
+ s = Os.socket(AF_PACKET, SOCK_RAW | SOCK_NONBLOCK, 0);
+ SocketUtils.attachControlPacketFilter(s, ARPHRD_ETHER);
+ SocketUtils.bindSocket(
+ s, makePacketSocketAddress((short) ETH_P_ALL, mInterface.index));
} catch (ErrnoException | IOException e) {
logError("Failed to create packet tracking socket: ", e);
closeFd(s);
@@ -119,8 +121,7 @@ public class ConnectivityPacketTracker {
if (summary == null) return;
if (DBG) Log.d(mTag, summary);
- addLogEntry(summary +
- "\n[" + new String(HexEncoding.encode(recvbuf, 0, length)) + "]");
+ addLogEntry(summary + "\n[" + HexDump.toHexString(recvbuf, 0, length) + "]");
}
@Override
diff --git a/packages/NetworkStack/src/android/net/ip/IpClient.java b/packages/NetworkStack/src/android/net/ip/IpClient.java
index 4315d34ba447..12fe8c507db4 100644
--- a/packages/NetworkStack/src/android/net/ip/IpClient.java
+++ b/packages/NetworkStack/src/android/net/ip/IpClient.java
@@ -16,6 +16,7 @@
package android.net.ip;
+import static android.net.RouteInfo.RTN_UNICAST;
import static android.net.shared.IpConfigurationParcelableUtil.toStableParcelable;
import static android.net.shared.LinkPropertiesParcelableUtil.fromStableParcelable;
import static android.net.shared.LinkPropertiesParcelableUtil.toStableParcelable;
@@ -36,7 +37,6 @@ import android.net.RouteInfo;
import android.net.apf.ApfCapabilities;
import android.net.apf.ApfFilter;
import android.net.dhcp.DhcpClient;
-import android.net.ip.IIpClientCallbacks;
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.IpManagerEvent;
import android.net.shared.InitialConfiguration;
@@ -52,7 +52,6 @@ import android.util.LocalLog;
import android.util.Log;
import android.util.SparseArray;
-import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IState;
import com.android.internal.util.IndentingPrintWriter;
@@ -992,7 +991,7 @@ public class IpClient extends StateMachine {
// specified in the InitialConfiguration have been observed with Netlink.
if (config.isProvisionedBy(newLp.getLinkAddresses(), null)) {
for (IpPrefix prefix : config.directlyConnectedRoutes) {
- newLp.addRoute(new RouteInfo(prefix, null, mInterfaceName));
+ newLp.addRoute(new RouteInfo(prefix, null, mInterfaceName, RTN_UNICAST));
}
}
addAllReachableDnsServers(newLp, config.dnsServers);
@@ -1093,7 +1092,7 @@ public class IpClient extends StateMachine {
// If we have a StaticIpConfiguration attempt to apply it and
// handle the result accordingly.
if (mConfiguration.mStaticIpConfig != null) {
- if (mInterfaceCtrl.setIPv4Address(mConfiguration.mStaticIpConfig.ipAddress)) {
+ if (mInterfaceCtrl.setIPv4Address(mConfiguration.mStaticIpConfig.getIpAddress())) {
handleIPv4Success(new DhcpResults(mConfiguration.mStaticIpConfig));
} else {
return false;
@@ -1348,10 +1347,8 @@ public class IpClient extends StateMachine {
apfConfig.apfCapabilities = mConfiguration.mApfCapabilities;
apfConfig.multicastFilter = mMulticastFiltering;
// Get the Configuration for ApfFilter from Context
- apfConfig.ieee802_3Filter =
- mContext.getResources().getBoolean(R.bool.config_apfDrop802_3Frames);
- apfConfig.ethTypeBlackList =
- mContext.getResources().getIntArray(R.array.config_apfEthTypeBlackList);
+ apfConfig.ieee802_3Filter = ApfCapabilities.getApfDrop8023Frames(mContext);
+ apfConfig.ethTypeBlackList = ApfCapabilities.getApfEthTypeBlackList(mContext);
mApfFilter = ApfFilter.maybeCreate(mContext, apfConfig, mInterfaceParams, mCallback);
// TODO: investigate the effects of any multicast filtering racing/interfering with the
// rest of this IP configuration startup.
diff --git a/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java b/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java
index 2e6ff243a628..b29d61793a61 100644
--- a/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java
+++ b/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java
@@ -20,6 +20,10 @@ import static android.net.netlink.NetlinkConstants.RTM_DELNEIGH;
import static android.net.netlink.NetlinkConstants.hexify;
import static android.net.netlink.NetlinkConstants.stringForNlMsgType;
import static android.net.util.SocketUtils.makeNetlinkSocketAddress;
+import static android.system.OsConstants.AF_NETLINK;
+import static android.system.OsConstants.NETLINK_ROUTE;
+import static android.system.OsConstants.SOCK_DGRAM;
+import static android.system.OsConstants.SOCK_NONBLOCK;
import android.net.MacAddress;
import android.net.netlink.NetlinkErrorMessage;
@@ -27,8 +31,10 @@ import android.net.netlink.NetlinkMessage;
import android.net.netlink.NetlinkSocket;
import android.net.netlink.RtNetlinkNeighborMessage;
import android.net.netlink.StructNdMsg;
+import android.net.util.NetworkStackUtils;
import android.net.util.PacketReader;
import android.net.util.SharedLog;
+import android.net.util.SocketUtils;
import android.os.Handler;
import android.os.SystemClock;
import android.system.ErrnoException;
@@ -36,8 +42,6 @@ import android.system.Os;
import android.system.OsConstants;
import android.util.Log;
-import libcore.io.IoUtils;
-
import java.io.FileDescriptor;
import java.net.InetAddress;
import java.net.SocketAddress;
@@ -77,7 +81,7 @@ public class IpNeighborMonitor extends PacketReader {
1, ip, StructNdMsg.NUD_PROBE, ifIndex, null);
try {
- NetlinkSocket.sendOneShotKernelMessage(OsConstants.NETLINK_ROUTE, msg);
+ NetlinkSocket.sendOneShotKernelMessage(NETLINK_ROUTE, msg);
} catch (ErrnoException e) {
Log.e(TAG, "Error " + msgSnippet + ": " + e);
return -e.errno;
@@ -145,8 +149,8 @@ public class IpNeighborMonitor extends PacketReader {
FileDescriptor fd = null;
try {
- fd = NetlinkSocket.forProto(OsConstants.NETLINK_ROUTE);
- Os.bind(fd, makeNetlinkSocketAddress(0, OsConstants.RTMGRP_NEIGH));
+ fd = Os.socket(AF_NETLINK, SOCK_DGRAM | SOCK_NONBLOCK, NETLINK_ROUTE);
+ SocketUtils.bindSocket(fd, makeNetlinkSocketAddress(0, OsConstants.RTMGRP_NEIGH));
NetlinkSocket.connectToKernel(fd);
if (VDBG) {
@@ -155,7 +159,7 @@ public class IpNeighborMonitor extends PacketReader {
}
} catch (ErrnoException|SocketException e) {
logError("Failed to create rtnetlink socket", e);
- IoUtils.closeQuietly(fd);
+ NetworkStackUtils.closeSocketQuietly(fd);
return null;
}
diff --git a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java
index 6dcf0c0d1626..98123a5c7261 100644
--- a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java
+++ b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java
@@ -16,6 +16,9 @@
package android.net.util;
+import java.io.FileDescriptor;
+import java.io.IOException;
+
/**
* Collection of utilities for the network stack.
*/
@@ -27,4 +30,14 @@ public class NetworkStackUtils {
public static <T> boolean isEmpty(T[] array) {
return array == null || array.length == 0;
}
+
+ /**
+ * Close a socket, ignoring any exception while closing.
+ */
+ public static void closeSocketQuietly(FileDescriptor fd) {
+ try {
+ SocketUtils.closeSocket(fd);
+ } catch (IOException ignored) {
+ }
+ }
}
diff --git a/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java b/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java
index 4f55779f473b..6fb4b0d79a64 100644
--- a/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java
+++ b/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java
@@ -15,6 +15,8 @@
*/
package com.android.server;
+import static android.net.RouteInfo.RTN_UNICAST;
+
import android.annotation.NonNull;
import android.net.INetd;
import android.net.INetdUnsolicitedEventListener;
@@ -169,7 +171,7 @@ public class NetworkObserverRegistry extends INetdUnsolicitedEventListener.Stub
public void onRouteChanged(boolean updated, String route, String gateway, String ifName) {
final RouteInfo processRoute = new RouteInfo(new IpPrefix(route),
("".equals(gateway)) ? null : InetAddresses.parseNumericAddress(gateway),
- ifName);
+ ifName, RTN_UNICAST);
if (updated) {
invokeForAllObservers(o -> o.onRouteUpdated(processRoute));
} else {
diff --git a/packages/NetworkStack/src/com/android/server/NetworkStackService.java b/packages/NetworkStack/src/com/android/server/NetworkStackService.java
index 7405c471808a..cedcb84e9d08 100644
--- a/packages/NetworkStack/src/com/android/server/NetworkStackService.java
+++ b/packages/NetworkStack/src/com/android/server/NetworkStackService.java
@@ -19,6 +19,7 @@ package com.android.server;
import static android.net.dhcp.IDhcpServer.STATUS_INVALID_ARGUMENT;
import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR;
+import static android.net.shared.NetworkParcelableUtil.fromStableParcelable;
import static com.android.server.util.PermissionUtil.checkDumpPermission;
import static com.android.server.util.PermissionUtil.checkNetworkStackCallingPermission;
@@ -34,7 +35,7 @@ import android.net.INetworkMonitor;
import android.net.INetworkMonitorCallbacks;
import android.net.INetworkStackConnector;
import android.net.Network;
-import android.net.NetworkRequest;
+import android.net.NetworkParcelable;
import android.net.PrivateDnsConfigParcel;
import android.net.dhcp.DhcpServer;
import android.net.dhcp.DhcpServingParams;
@@ -150,13 +151,12 @@ public class NetworkStackService extends Service {
}
@Override
- public void makeNetworkMonitor(int netId, String name, INetworkMonitorCallbacks cb)
+ public void makeNetworkMonitor(
+ NetworkParcelable network, String name, INetworkMonitorCallbacks cb)
throws RemoteException {
- final Network network = new Network(netId, false /* privateDnsBypass */);
- final NetworkRequest defaultRequest = mCm.getDefaultRequest();
- final SharedLog log = addValidationLogs(network, name);
- final NetworkMonitor nm = new NetworkMonitor(
- mContext, cb, network, defaultRequest, log);
+ final Network parsedNetwork = fromStableParcelable(network);
+ final SharedLog log = addValidationLogs(parsedNetwork, name);
+ final NetworkMonitor nm = new NetworkMonitor(mContext, cb, parsedNetwork, log);
cb.onNetworkMonitorCreated(new NetworkMonitorImpl(nm));
}
diff --git a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
index 96eaa505389d..b34efc46f3b4 100644
--- a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
+++ b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java
@@ -47,7 +47,6 @@ import android.net.INetworkMonitorCallbacks;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
import android.net.ProxyInfo;
import android.net.TrafficStats;
import android.net.Uri;
@@ -310,14 +309,14 @@ public class NetworkMonitor extends StateMachine {
private long mLastProbeTime;
public NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
- NetworkRequest defaultRequest, SharedLog validationLog) {
- this(context, cb, network, defaultRequest, new IpConnectivityLog(), validationLog,
+ SharedLog validationLog) {
+ this(context, cb, network, new IpConnectivityLog(), validationLog,
Dependencies.DEFAULT);
}
@VisibleForTesting
protected NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
- NetworkRequest defaultRequest, IpConnectivityLog logger, SharedLog validationLogs,
+ IpConnectivityLog logger, SharedLog validationLogs,
Dependencies deps) {
// Add suffix indicating which NetworkMonitor we're talking about.
super(TAG + "/" + network.toString());
@@ -369,8 +368,7 @@ public class NetworkMonitor extends StateMachine {
// we can ever fetch them.
// TODO: Delete ASAP.
mLinkProperties = new LinkProperties();
- mNetworkCapabilities = new NetworkCapabilities();
- mNetworkCapabilities.clearAll();
+ mNetworkCapabilities = new NetworkCapabilities(null);
}
/**
@@ -689,6 +687,15 @@ public class NetworkMonitor extends StateMachine {
}
sendMessage(CMD_CAPTIVE_PORTAL_APP_FINISHED, response);
}
+
+ @Override
+ public void logEvent(int eventId, String packageName)
+ throws RemoteException {
+ mContext.enforceCallingPermission(
+ android.Manifest.permission.CONNECTIVITY_INTERNAL,
+ "CaptivePortal");
+ mCallback.logCaptivePortalLoginEvent(eventId, packageName);
+ }
}));
final CaptivePortalProbeResult probeRes = mLastPortalProbeResult;
intent.putExtra(EXTRA_CAPTIVE_PORTAL_URL, probeRes.detectUrl);
diff --git a/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java b/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java
index dced7435ee74..6e11c409e104 100644
--- a/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java
+++ b/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java
@@ -17,7 +17,13 @@
package android.net.util;
import static android.net.util.PacketReader.DEFAULT_RECV_BUF_SIZE;
-import static android.system.OsConstants.*;
+import static android.system.OsConstants.AF_INET6;
+import static android.system.OsConstants.IPPROTO_UDP;
+import static android.system.OsConstants.SOCK_DGRAM;
+import static android.system.OsConstants.SOCK_NONBLOCK;
+import static android.system.OsConstants.SOL_SOCKET;
+import static android.system.OsConstants.SO_SNDTIMEO;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -31,10 +37,12 @@ import android.system.ErrnoException;
import android.system.Os;
import android.system.StructTimeval;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.UncheckedIOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet6Address;
@@ -45,13 +53,6 @@ import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-import org.junit.runner.RunWith;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import libcore.io.IoBridge;
-
/**
* Tests for PacketReader.
*
@@ -80,7 +81,7 @@ public class PacketReaderTest {
protected FileDescriptor createFd() {
FileDescriptor s = null;
try {
- s = Os.socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
+ s = Os.socket(AF_INET6, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP);
Os.bind(s, LOOPBACK6, 0);
mLocalSockName = (InetSocketAddress) Os.getsockname(s);
Os.setsockoptTimeval(s, SOL_SOCKET, SO_SNDTIMEO, TIMEO);
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 d31fa7732e66..d11bb64213c3 100644
--- a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
+++ b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -21,7 +21,6 @@ import static android.net.ConnectivityManager.EXTRA_CAPTIVE_PORTAL;
import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID;
import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID;
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
@@ -51,7 +50,6 @@ import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
-import android.net.NetworkRequest;
import android.net.captiveportal.CaptivePortalProbeResult;
import android.net.metrics.IpConnectivityLog;
import android.net.util.SharedLog;
@@ -103,7 +101,6 @@ public class NetworkMonitorTest {
private @Mock NetworkMonitor.Dependencies mDependencies;
private @Mock INetworkMonitorCallbacks mCallbacks;
private @Spy Network mNetwork = new Network(TEST_NETID);
- private NetworkRequest mRequest;
private static final int TEST_NETID = 4242;
@@ -178,10 +175,6 @@ public class NetworkMonitorTest {
InetAddresses.parseNumericAddress("192.168.0.0")
}).when(mNetwork).getAllByName(any());
- mRequest = new NetworkRequest.Builder()
- .addCapability(NET_CAPABILITY_INTERNET)
- .addCapability(NET_CAPABILITY_NOT_RESTRICTED)
- .build();
// Default values. Individual tests can override these.
when(mCm.getLinkProperties(any())).thenReturn(TEST_LINKPROPERTIES);
when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES);
@@ -195,9 +188,9 @@ public class NetworkMonitorTest {
private class WrappedNetworkMonitor extends NetworkMonitor {
private long mProbeTime = 0;
- WrappedNetworkMonitor(Context context, Network network, NetworkRequest defaultRequest,
- IpConnectivityLog logger, Dependencies deps) {
- super(context, mCallbacks, network, defaultRequest, logger,
+ WrappedNetworkMonitor(Context context, Network network, IpConnectivityLog logger,
+ Dependencies deps) {
+ super(context, mCallbacks, network, logger,
new SharedLog("test_nm"), deps);
}
@@ -213,7 +206,7 @@ public class NetworkMonitorTest {
private WrappedNetworkMonitor makeMeteredWrappedNetworkMonitor() {
final WrappedNetworkMonitor nm = new WrappedNetworkMonitor(
- mContext, mNetwork, mRequest, mLogger, mDependencies);
+ mContext, mNetwork, mLogger, mDependencies);
when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES);
nm.start();
waitForIdle(nm.getHandler());
@@ -222,7 +215,7 @@ public class NetworkMonitorTest {
private WrappedNetworkMonitor makeNotMeteredWrappedNetworkMonitor() {
final WrappedNetworkMonitor nm = new WrappedNetworkMonitor(
- mContext, mNetwork, mRequest, mLogger, mDependencies);
+ mContext, mNetwork, mLogger, mDependencies);
when(mCm.getNetworkCapabilities(any())).thenReturn(NOT_METERED_CAPABILITIES);
nm.start();
waitForIdle(nm.getHandler());
@@ -231,7 +224,7 @@ public class NetworkMonitorTest {
private NetworkMonitor makeMonitor() {
final NetworkMonitor nm = new NetworkMonitor(
- mContext, mCallbacks, mNetwork, mRequest, mLogger, mValidationLogger,
+ mContext, mCallbacks, mNetwork, mLogger, mValidationLogger,
mDependencies);
nm.start();
waitForIdle(nm.getHandler());
diff --git a/packages/SettingsLib/ActionBarShadow/Android.bp b/packages/SettingsLib/ActionBarShadow/Android.bp
new file mode 100644
index 000000000000..d2848564abea
--- /dev/null
+++ b/packages/SettingsLib/ActionBarShadow/Android.bp
@@ -0,0 +1,14 @@
+android_library {
+ name: "SettingsLibActionBarShadow",
+
+ srcs: ["src/**/*.java"],
+
+ static_libs: [
+ "androidx.annotation_annotation",
+ "androidx.lifecycle_lifecycle-runtime",
+ "androidx.recyclerview_recyclerview",
+ ],
+
+ sdk_version: "system_current",
+ min_sdk_version: "21",
+}
diff --git a/packages/SettingsLib/ActionBarShadow/AndroidManifest.xml b/packages/SettingsLib/ActionBarShadow/AndroidManifest.xml
new file mode 100644
index 000000000000..4b9f1ab8d6cc
--- /dev/null
+++ b/packages/SettingsLib/ActionBarShadow/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.settingslib.widget">
+
+ <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
diff --git a/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java b/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java
new file mode 100644
index 000000000000..68ba5fbd120f
--- /dev/null
+++ b/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java
@@ -0,0 +1,133 @@
+/*
+ * 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.widget;
+
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.view.View;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * UI controller that adds a shadow appear/disappear animation to action bar scroll.
+ */
+public class ActionBarShadowController implements LifecycleObserver {
+
+ @VisibleForTesting
+ static final float ELEVATION_HIGH = 8;
+ @VisibleForTesting
+ static final float ELEVATION_LOW = 0;
+
+ @VisibleForTesting
+ ScrollChangeWatcher mScrollChangeWatcher;
+ private RecyclerView mRecyclerView;
+ private boolean mIsScrollWatcherAttached;
+
+ /**
+ * Wire up the animation to to an {@link Activity}. Shadow will be applied to activity's
+ * action bar.
+ */
+ public static ActionBarShadowController attachToRecyclerView(
+ Activity activity, Lifecycle lifecycle, RecyclerView recyclerView) {
+ return new ActionBarShadowController(activity, lifecycle, recyclerView);
+ }
+
+ /**
+ * Wire up the animation to to a {@link View}. Shadow will be applied to the view.
+ */
+ public static ActionBarShadowController attachToRecyclerView(
+ View anchorView, Lifecycle lifecycle, RecyclerView recyclerView) {
+ return new ActionBarShadowController(anchorView, lifecycle, recyclerView);
+ }
+
+ private ActionBarShadowController(Activity activity, Lifecycle lifecycle,
+ RecyclerView recyclerView) {
+ mScrollChangeWatcher =
+ new ActionBarShadowController.ScrollChangeWatcher(activity);
+ mRecyclerView = recyclerView;
+ attachScrollWatcher();
+ lifecycle.addObserver(this);
+ }
+
+ private ActionBarShadowController(View anchorView, Lifecycle lifecycle,
+ RecyclerView recyclerView) {
+ mScrollChangeWatcher =
+ new ActionBarShadowController.ScrollChangeWatcher(anchorView);
+ mRecyclerView = recyclerView;
+ attachScrollWatcher();
+ lifecycle.addObserver(this);
+ }
+
+ @OnLifecycleEvent(ON_START)
+ private void attachScrollWatcher() {
+ if (!mIsScrollWatcherAttached) {
+ mIsScrollWatcherAttached = true;
+ mRecyclerView.addOnScrollListener(mScrollChangeWatcher);
+ mScrollChangeWatcher.updateDropShadow(mRecyclerView);
+ }
+ }
+
+ @OnLifecycleEvent(ON_STOP)
+ private void detachScrollWatcher() {
+ mRecyclerView.removeOnScrollListener(mScrollChangeWatcher);
+ mIsScrollWatcherAttached = false;
+ }
+
+ /**
+ * Update the drop shadow as the scrollable entity is scrolled.
+ */
+ final class ScrollChangeWatcher extends RecyclerView.OnScrollListener {
+
+ private final Activity mActivity;
+ private final View mAnchorView;
+
+ ScrollChangeWatcher(Activity activity) {
+ mActivity = activity;
+ mAnchorView = null;
+ }
+
+ ScrollChangeWatcher(View anchorView) {
+ mAnchorView = anchorView;
+ mActivity = null;
+ }
+
+ // RecyclerView scrolled.
+ @Override
+ public void onScrolled(RecyclerView view, int dx, int dy) {
+ updateDropShadow(view);
+ }
+
+ public void updateDropShadow(View view) {
+ final boolean shouldShowShadow = view.canScrollVertically(-1);
+ if (mAnchorView != null) {
+ mAnchorView.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW);
+ } else if (mActivity != null) { // activity can become null when running monkey
+ final ActionBar actionBar = mActivity.getActionBar();
+ if (actionBar != null) {
+ actionBar.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW);
+ }
+ }
+ }
+ }
+}
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp
index 2321790fa960..5a81f8bc6566 100644
--- a/packages/SettingsLib/Android.bp
+++ b/packages/SettingsLib/Android.bp
@@ -13,6 +13,7 @@ android_library {
"SettingsLibHelpUtils",
"SettingsLibRestrictedLockUtils",
+ "SettingsLibActionBarShadow",
"SettingsLibAppPreference",
"SettingsLibSearchWidget",
"SettingsLibSettingsSpinner",
diff --git a/packages/SettingsLib/OWNERS b/packages/SettingsLib/OWNERS
index d188c65be883..d87908738b56 100644
--- a/packages/SettingsLib/OWNERS
+++ b/packages/SettingsLib/OWNERS
@@ -4,7 +4,7 @@ asargent@google.com
dehboxturtle@google.com
dhnishi@google.com
dling@google.com
-dsandler@google.com
+dsandler@android.com
evanlaird@google.com
jackqdyulei@google.com
jmonk@google.com
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index c8f8d737fb0e..191bd8fadaf8 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -99,12 +99,14 @@
<string name="connected_via_network_scorer_default">Automatically connected via network rating provider</string>
<!-- Status message of Wi-Fi when it is connected by Passpoint configuration. [CHAR LIMIT=NONE] -->
<string name="connected_via_passpoint">Connected via %1$s</string>
+ <!-- Status message of Wi-Fi when it is connected by a app (via suggestion or network request). [CHAR LIMIT=NONE] -->
+ <string name="connected_via_app">Connected via <xliff:g id="name" example="Wifi App">%1$s</xliff:g></string>
<!-- Status message of Wi-Fi when it is connected by Passpoint configuration. [CHAR LIMIT=NONE] -->
<string name="ssid_by_passpoint_provider"><xliff:g id="ssid" example="Cafe Wifi">%1$s</xliff:g> by <xliff:g id="passpointProvider" example="Passpoint Provider">%2$s</xliff:g></string>
<!-- Status message of Wi-Fi when network has matching passpoint credentials. [CHAR LIMIT=NONE] -->
<string name="available_via_passpoint">Available via %1$s</string>
<!-- Status message of OSU Provider network when not connected. [CHAR LIMIT=NONE] -->
- <string name="tap_to_set_up">Tap to set up</string>
+ <string name="tap_to_sign_up">Tap to sign up</string>
<!-- Package name for Settings app-->
<string name="settings_package" translatable="false">com.android.settings</string>
<!-- Package name for Certinstaller app-->
@@ -127,78 +129,16 @@
<!-- Status message of Wi-Fi when an available network is a carrier network. [CHAR LIMIT=NONE] -->
<string name="available_via_carrier">Available via %1$s</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_AP_CONNECTION. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_ap_connection">Connection failed</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_URL_INVALID. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_server_url_invalid">Invalid OSU server URL</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_CONNECTION. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_server_connection">OSU server connection failed</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_VALIDATION. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_server_validation">OSU server validation failed</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_service_provider_verification">Invalid OSU server certificate</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_ABORTED. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_provisioning_aborted">Provisioning aborted</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_NOT_AVAILABLE. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_provisioning_not_available">Provisioning not available</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_INVALID_SERVER_URL. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_invalid_server_url">Invalid OSU server URL</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_COMMAND_TYPE. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_unexpected_command_type">Unexpected command type</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_unexpected_soap_message_type">Unexpected SOAP message type</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_SOAP_MESSAGE_EXCHANGE. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_soap_message_exchange">SOAP message exchange failed</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_START_REDIRECT_LISTENER. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_start_redirect_listener">Redirect listener failed to start</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_timed_out_redirect_listener">Timed out waiting for redirect</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_OSU_ACTIVITY_FOUND. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_no_osu_activity_found">No OSU activity found</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_unexpected_soap_message_status">Unexpected SOAP message status</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_PPS_MO. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_no_pps_mo">Failed to find PPS-MO</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_no_aaa_server_trust_root_node">Failed to find trust root node for AAA server</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_no_remediation_server_trust_root_node">Failed to find trust root node for remediation server</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_no_policy_server_trust_root_node">Failed to find trust root node for policy server</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_retrieve_trust_root_certificates">Failed to retrieve trust root certificates</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_no_aaa_trust_root_certificate">Failed to find trust root certificate for AAA server</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_add_passpoint_configuration">Failed to add PassPoint configuration</string>
- <!-- Status message of OSU Provider on receiving OSU_FAILURE_OSU_PROVIDER_NOT_FOUND. [CHAR LIMIT=NONE] -->
- <string name="osu_failure_osu_provider_not_found">Failed to find an OSU provider</string>
-
- <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTING. [CHAR LIMIT=NONE] -->
- <string name="osu_status_ap_connecting">Connecting</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTED. [CHAR LIMIT=NONE] -->
- <string name="osu_status_ap_connected">Connected</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTING. [CHAR LIMIT=NONE] -->
- <string name="osu_status_server_connecting">Connecting to OSU server</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_VALIDATED. [CHAR LIMIT=NONE] -->
- <string name="osu_status_server_validated">OSU server validated</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTED. [CHAR LIMIT=NONE] -->
- <string name="osu_status_server_connected">Connected to OSU server</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_INIT_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
- <string name="osu_status_init_soap_exchange">Initial SOAP exchange</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE. [CHAR LIMIT=NONE] -->
- <string name="osu_status_waiting_for_redirect_response">Waiting for redirect response</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_REDIRECT_RESPONSE_RECEIVED. [CHAR LIMIT=NONE] -->
- <string name="osu_status_redirect_response_received">Received redirect response</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_SECOND_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
- <string name="osu_status_second_soap_exchange">Second SOAP exchange</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_THIRD_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
- <string name="osu_status_third_soap_exchange">Third SOAP exchange</string>
- <!-- Status message of OSU Provider on receiving OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS. [CHAR LIMIT=NONE] -->
- <string name="osu_status_retrieving_trust_root_certs">Retrieving trust root certificates</string>
-
+ <!-- Status message of OSU Provider upon initiating provisioning flow [CHAR LIMIT=NONE] -->
+ <string name="osu_opening_provider">Opening <xliff:g id="passpointProvider" example="Passpoint Provider">%1$s</xliff:g></string>
+ <!-- Status message of OSU Provider when connection fails [CHAR LIMIT=NONE] -->
+ <string name="osu_connect_failed">Couldn\u2019t connect</string>
+ <!-- Status message of OSU Provider after user completes provisioning flow [CHAR LIMIT=NONE] -->
+ <string name="osu_completing_sign_up">Completing sign-up\u2026</string>
+ <!-- Status message of OSU Provider when sign up could not be completed [CHAR LIMIT=NONE] -->
+ <string name="osu_sign_up_failed">Couldn\u2019t complete sign-up. Tap to try again.</string>
<!-- Status message of OSU Provider on completing provisioning. [CHAR LIMIT=NONE] -->
- <string name="osu_provisioning_complete">Provisioning complete</string>
+ <string name="osu_sign_up_complete">Sign-up complete. Connecting\u2026</string>
<!-- Speed label for very slow network speed -->
<string name="speed_label_very_slow">Very Slow</string>
@@ -616,8 +556,6 @@
<string name="wifi_display_certification">Wireless display certification</string>
<!-- Setting Checkbox title whether to enable WiFi Verbose Logging. [CHAR LIMIT=40] -->
<string name="wifi_verbose_logging">Enable Wi\u2011Fi Verbose Logging</string>
- <!-- Setting Checkbox title whether to enable connected MAC randomization -->
- <string name="wifi_connected_mac_randomization">Connected MAC Randomization</string>
<!-- Setting Checkbox title whether to always keep mobile data active. [CHAR LIMIT=80] -->
<string name="mobile_data_always_on">Mobile data always active</string>
<!-- Setting Checkbox title whether to enable hardware acceleration for tethering. [CHAR LIMIT=80] -->
@@ -673,8 +611,6 @@
<string name="wifi_display_certification_summary">Show options for wireless display certification</string>
<!-- Setting Checkbox summary whether to enable Wifi verbose Logging [CHAR LIMIT=80] -->
<string name="wifi_verbose_logging_summary">Increase Wi\u2011Fi logging level, show per SSID RSSI in Wi\u2011Fi Picker</string>
- <!-- Setting Checkbox title whether to enable connected MAC randomization -->
- <string name="wifi_connected_mac_randomization_summary">Randomize MAC address when connecting to Wi\u2011Fi networks</string>
<!-- Label indicating network has been manually marked as metered -->
<string name="wifi_metered_label">Metered</string>
<!-- Label indicating network has been manually marked as unmetered -->
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 9b12a31dc149..ed8b48742f98 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -888,19 +888,19 @@ public class AccessPoint implements Comparable<AccessPoint> {
if (isOsuProvider()) {
if (mOsuProvisioningComplete) {
- summary.append(mContext.getString(R.string.osu_provisioning_complete));
+ summary.append(mContext.getString(R.string.osu_sign_up_complete));
} else if (mOsuFailure != null) {
summary.append(mOsuFailure);
} else if (mOsuStatus != null) {
summary.append(mOsuStatus);
} else {
- summary.append(mContext.getString(R.string.tap_to_set_up));
+ summary.append(mContext.getString(R.string.tap_to_sign_up));
}
} else if (isActive()) {
if (isPasspoint()) {
// This is the active connection on passpoint
summary.append(getSummary(mContext, ssid, getDetailedState(),
- false, mConfig.providerFriendlyName));
+ false, null, mConfig.providerFriendlyName));
} else if (mConfig != null && getDetailedState() == DetailedState.CONNECTED
&& mIsCarrierAp) {
// This is the active connection on a carrier AP
@@ -909,7 +909,8 @@ public class AccessPoint implements Comparable<AccessPoint> {
} else {
// This is the active connection on non-passpoint network
summary.append(getSummary(mContext, getDetailedState(),
- mInfo != null && mInfo.isEphemeral()));
+ mInfo != null && mInfo.isEphemeral(),
+ mInfo != null ? mInfo.getNetworkSuggestionOrSpecifierPackageName() : null));
}
} else { // not active
if (mConfig != null && mConfig.hasNoInternetAccess()) {
@@ -1322,13 +1323,34 @@ public class AccessPoint implements Comparable<AccessPoint> {
return mRssi != UNREACHABLE_RSSI;
}
+ private static CharSequence getAppLabel(String packageName, PackageManager packageManager) {
+ CharSequence appLabel = "";
+ ApplicationInfo appInfo = null;
+ try {
+ int userId = UserHandle.getUserId(UserHandle.USER_CURRENT);
+ appInfo = packageManager.getApplicationInfoAsUser(packageName, 0 /* flags */, userId);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Failed to get app info", e);
+ return appLabel;
+ }
+ if (appInfo != null) {
+ appLabel = appInfo.loadLabel(packageManager);
+ }
+ return appLabel;
+ }
+
public static String getSummary(Context context, String ssid, DetailedState state,
- boolean isEphemeral, String passpointProvider) {
+ boolean isEphemeral, String suggestionOrSpecifierPackageName,
+ String passpointProvider) {
if (state == DetailedState.CONNECTED) {
if (!TextUtils.isEmpty(passpointProvider)) {
// Special case for connected + passpoint networks.
String format = context.getString(R.string.ssid_by_passpoint_provider);
return String.format(format, ssid, passpointProvider);
+ } else if (isEphemeral && !TextUtils.isEmpty(suggestionOrSpecifierPackageName)) {
+ CharSequence appLabel =
+ getAppLabel(suggestionOrSpecifierPackageName, context.getPackageManager());
+ return context.getString(R.string.connected_via_app, appLabel);
} else if (isEphemeral) {
// Special case for connected + ephemeral networks.
final NetworkScoreManager networkScoreManager = context.getSystemService(
@@ -1379,13 +1401,17 @@ public class AccessPoint implements Comparable<AccessPoint> {
return String.format(formats[index], ssid);
}
- public static String getSummary(Context context, DetailedState state, boolean isEphemeral) {
- return getSummary(context, null, state, isEphemeral, null);
+ public static String getSummary(Context context, DetailedState state, boolean isEphemeral,
+ String suggestionOrSpecifierPackageName) {
+ return getSummary(context, null, state, isEphemeral, suggestionOrSpecifierPackageName,
+ null);
}
public static String getSummary(Context context, DetailedState state, boolean isEphemeral,
- String passpointProvider) {
- return getSummary(context, null, state, isEphemeral, passpointProvider);
+ String suggestionOrSpecifierPackageName,
+ String passpointProvider) {
+ return getSummary(context, null, state, false, suggestionOrSpecifierPackageName,
+ passpointProvider);
}
public static String convertToQuotedString(String string) {
@@ -1528,91 +1554,12 @@ public class AccessPoint implements Comparable<AccessPoint> {
* All methods are invoked on the Main Thread
*/
private class AccessPointProvisioningCallback extends ProvisioningCallback {
- // TODO: Remove logs and implement summary changing logic for these provisioning callbacks.
@Override
@MainThread public void onProvisioningFailure(int status) {
- switch (status) {
- case OSU_FAILURE_AP_CONNECTION:
- mOsuFailure = mContext.getString(R.string.osu_failure_ap_connection);
- break;
- case OSU_FAILURE_SERVER_URL_INVALID:
- mOsuFailure = mContext.getString(R.string.osu_failure_server_url_invalid);
- break;
- case OSU_FAILURE_SERVER_CONNECTION:
- mOsuFailure = mContext.getString(R.string.osu_failure_server_connection);
- break;
- case OSU_FAILURE_SERVER_VALIDATION:
- mOsuFailure = mContext.getString(R.string.osu_failure_server_validation);
- break;
- case OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_service_provider_verification);
- break;
- case OSU_FAILURE_PROVISIONING_ABORTED:
- mOsuFailure = mContext.getString(R.string.osu_failure_provisioning_aborted);
- break;
- case OSU_FAILURE_PROVISIONING_NOT_AVAILABLE:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_provisioning_not_available);
- break;
- case OSU_FAILURE_INVALID_URL_FORMAT_FOR_OSU:
- mOsuFailure = mContext.getString(R.string.osu_failure_invalid_server_url);
- break;
- case OSU_FAILURE_UNEXPECTED_COMMAND_TYPE:
- mOsuFailure = mContext.getString(R.string.osu_failure_unexpected_command_type);
- break;
- case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_unexpected_soap_message_type);
- break;
- case OSU_FAILURE_SOAP_MESSAGE_EXCHANGE:
- mOsuFailure = mContext.getString(R.string.osu_failure_soap_message_exchange);
- break;
- case OSU_FAILURE_START_REDIRECT_LISTENER:
- mOsuFailure = mContext.getString(R.string.osu_failure_start_redirect_listener);
- break;
- case OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_timed_out_redirect_listener);
- break;
- case OSU_FAILURE_NO_OSU_ACTIVITY_FOUND:
- mOsuFailure = mContext.getString(R.string.osu_failure_no_osu_activity_found);
- break;
- case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_unexpected_soap_message_status);
- break;
- case OSU_FAILURE_NO_PPS_MO:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_no_pps_mo);
- break;
- case OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_no_aaa_server_trust_root_node);
- break;
- case OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_no_remediation_server_trust_root_node);
- break;
- case OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_no_policy_server_trust_root_node);
- break;
- case OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_retrieve_trust_root_certificates);
- break;
- case OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_no_aaa_trust_root_certificate);
- break;
- case OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION:
- mOsuFailure = mContext.getString(
- R.string.osu_failure_add_passpoint_configuration);
- break;
- case OSU_FAILURE_OSU_PROVIDER_NOT_FOUND:
- mOsuFailure = mContext.getString(R.string.osu_failure_osu_provider_not_found);
- break;
+ if (TextUtils.equals(mOsuStatus, mContext.getString(R.string.osu_completing_sign_up))) {
+ mOsuFailure = mContext.getString(R.string.osu_sign_up_failed);
+ } else {
+ mOsuFailure = mContext.getString(R.string.osu_connect_failed);
}
mOsuStatus = null;
mOsuProvisioningComplete = false;
@@ -1625,50 +1572,37 @@ public class AccessPoint implements Comparable<AccessPoint> {
@Override
@MainThread public void onProvisioningStatus(int status) {
+ String newStatus = null;
switch (status) {
case OSU_STATUS_AP_CONNECTING:
- mOsuStatus = mContext.getString(R.string.osu_status_ap_connecting);
- break;
case OSU_STATUS_AP_CONNECTED:
- mOsuStatus = mContext.getString(R.string.osu_status_ap_connected);
- break;
case OSU_STATUS_SERVER_CONNECTING:
- mOsuStatus = mContext.getString(R.string.osu_status_server_connecting);
- break;
case OSU_STATUS_SERVER_VALIDATED:
- mOsuStatus = mContext.getString(R.string.osu_status_server_validated);
- break;
case OSU_STATUS_SERVER_CONNECTED:
- mOsuStatus = mContext.getString(R.string.osu_status_server_connected);
- break;
case OSU_STATUS_INIT_SOAP_EXCHANGE:
- mOsuStatus = mContext.getString(R.string.osu_status_init_soap_exchange);
- break;
case OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE:
- mOsuStatus = mContext.getString(
- R.string.osu_status_waiting_for_redirect_response);
+ newStatus = String.format(mContext.getString(R.string.osu_opening_provider),
+ mOsuProvider.getFriendlyName());
break;
case OSU_STATUS_REDIRECT_RESPONSE_RECEIVED:
- mOsuStatus = mContext.getString(R.string.osu_status_redirect_response_received);
- break;
case OSU_STATUS_SECOND_SOAP_EXCHANGE:
- mOsuStatus = mContext.getString(R.string.osu_status_second_soap_exchange);
- break;
case OSU_STATUS_THIRD_SOAP_EXCHANGE:
- mOsuStatus = mContext.getString(R.string.osu_status_third_soap_exchange);
- break;
case OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS:
- mOsuStatus = mContext.getString(
- R.string.osu_status_retrieving_trust_root_certs);
+ newStatus = mContext.getString(
+ R.string.osu_completing_sign_up);
break;
}
+ boolean updated = !TextUtils.equals(mOsuStatus, newStatus);
+ mOsuStatus = newStatus;
mOsuFailure = null;
mOsuProvisioningComplete = false;
- ThreadUtils.postOnMainThread(() -> {
- if (mAccessPointListener != null) {
- mAccessPointListener.onAccessPointChanged(AccessPoint.this);
- }
- });
+ if (updated) {
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(AccessPoint.this);
+ }
+ });
+ }
}
@Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
index afea5d2078b0..17a73acb9bda 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
@@ -72,9 +72,13 @@ public class TestAccessPointBuilder {
public AccessPoint build() {
Bundle bundle = new Bundle();
- WifiConfiguration wifiConfig = new WifiConfiguration();
- wifiConfig.networkId = mNetworkId;
- wifiConfig.BSSID = mBssid;
+ WifiConfiguration wifiConfig = null;
+ // ephemeral networks don't have a WifiConfiguration object in AccessPoint representation.
+ if (mNetworkId != WifiConfiguration.INVALID_NETWORK_ID) {
+ wifiConfig = new WifiConfiguration();
+ wifiConfig.networkId = mNetworkId;
+ wifiConfig.BSSID = mBssid;
+ }
bundle.putString(AccessPoint.KEY_SSID, ssid);
bundle.putParcelable(AccessPoint.KEY_CONFIG, wifiConfig);
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 fc3034efc08b..5e3472b830a0 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
@@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.mock;
@@ -26,6 +27,9 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkKey;
@@ -483,6 +487,45 @@ public class AccessPointTest {
}
@Test
+ public void testSummaryString_showsConnectedViaSuggestionOrSpecifierApp() throws Exception {
+ final int rssi = -55;
+ final String appPackageName = "com.test.app";
+ final CharSequence appLabel = "Test App";
+ final String connectedViaAppResourceString = "Connected via ";
+
+ WifiInfo wifiInfo = new WifiInfo();
+ wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
+ wifiInfo.setEphemeral(true);
+ wifiInfo.setNetworkSuggestionOrSpecifierPackageName(appPackageName);
+ wifiInfo.setRssi(rssi);
+
+ Context context = mock(Context.class);
+ Resources resources = mock(Resources.class);
+ PackageManager packageManager = mock(PackageManager.class);
+ ApplicationInfo applicationInfo = mock(ApplicationInfo.class);
+ when(context.getPackageManager()).thenReturn(packageManager);
+ when(context.getResources()).thenReturn(resources);
+ when(resources.getString(R.string.connected_via_app, appLabel))
+ .thenReturn(connectedViaAppResourceString + appLabel.toString());
+ when(packageManager.getApplicationInfoAsUser(eq(appPackageName), anyInt(), anyInt()))
+ .thenReturn(applicationInfo);
+ when(applicationInfo.loadLabel(packageManager)).thenReturn(appLabel);
+
+ NetworkInfo networkInfo =
+ new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", "");
+ networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", "");
+
+ AccessPoint ap = new TestAccessPointBuilder(context)
+ .setSsid(TEST_SSID)
+ .setNetworkInfo(networkInfo)
+ .setRssi(rssi)
+ .setSecurity(AccessPoint.SECURITY_NONE)
+ .setWifiInfo(wifiInfo)
+ .build();
+ assertThat(ap.getSummary()).isEqualTo("Connected via Test App");
+ }
+
+ @Test
public void testSetScanResultWithCarrierInfo() {
String ssid = "ssid";
AccessPoint ap = new TestAccessPointBuilder(mContext).setSsid(ssid).build();
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java
new file mode 100644
index 000000000000..a25b51298d3e
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.widget;
+
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+
+import static com.google.common.truth.Truth.assertThat;
+
+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.ActionBar;
+import android.app.Activity;
+import android.view.View;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class ActionBarShadowControllerTest {
+
+ @Mock
+ private RecyclerView mRecyclerView;
+ @Mock
+ private Activity mActivity;
+ @Mock
+ private ActionBar mActionBar;
+ private Lifecycle mLifecycle;
+ private LifecycleOwner mLifecycleOwner;
+ private View mView;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mActivity.getActionBar()).thenReturn(mActionBar);
+ mView = new View(RuntimeEnvironment.application);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ }
+
+ @Test
+ public void attachToRecyclerView_shouldAddScrollWatcherAndUpdateActionBar() {
+ when(mRecyclerView.canScrollVertically(-1)).thenReturn(false);
+
+ ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView);
+
+ verify(mActionBar).setElevation(ActionBarShadowController.ELEVATION_LOW);
+ }
+
+ @Test
+ public void attachToRecyclerView_customViewAsActionBar_shouldUpdateElevationOnScroll() {
+ // Setup
+ mView.setElevation(50);
+ when(mRecyclerView.canScrollVertically(-1)).thenReturn(false);
+ final ActionBarShadowController controller =
+ ActionBarShadowController.attachToRecyclerView(mView, mLifecycle, mRecyclerView);
+ assertThat(mView.getElevation()).isEqualTo(ActionBarShadowController.ELEVATION_LOW);
+
+ // Scroll
+ when(mRecyclerView.canScrollVertically(-1)).thenReturn(true);
+ controller.mScrollChangeWatcher.onScrolled(mRecyclerView, 10 /* dx */, 10 /* dy */);
+ assertThat(mView.getElevation()).isEqualTo(ActionBarShadowController.ELEVATION_HIGH);
+ }
+
+ @Test
+ public void attachToRecyclerView_lifecycleChange_shouldAttachDetach() {
+ ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView);
+
+ verify(mRecyclerView).addOnScrollListener(any());
+
+ mLifecycle.handleLifecycleEvent(ON_START);
+ mLifecycle.handleLifecycleEvent(ON_STOP);
+ verify(mRecyclerView).removeOnScrollListener(any());
+
+ mLifecycle.handleLifecycleEvent(ON_START);
+ verify(mRecyclerView, times(2)).addOnScrollListener(any());
+ }
+
+ @Test
+ public void onScrolled_nullAnchorViewAndActivity_shouldNotCrash() {
+ final Activity activity = null;
+ final ActionBarShadowController controller =
+ ActionBarShadowController.attachToRecyclerView(activity, mLifecycle, mRecyclerView);
+
+ // Scroll
+ controller.mScrollChangeWatcher.onScrolled(mRecyclerView, 10 /* dx */, 10 /* dy */);
+ // no crash
+ }
+}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 3877c90fee23..6ca8261ac4f9 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1511,9 +1511,6 @@ class SettingsProtoDumpUtil {
Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED,
GlobalSettingsProto.Wifi.VERBOSE_LOGGING_ENABLED);
dumpSetting(s, p,
- Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
- GlobalSettingsProto.Wifi.CONNECTED_MAC_RANDOMIZATION_ENABLED);
- dumpSetting(s, p,
Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT,
GlobalSettingsProto.Wifi.MAX_DHCP_RETRY_COUNT);
dumpSetting(s, p,
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 445312168eba..23e5f0eea46d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -4231,7 +4231,7 @@ public class SettingsProvider extends ContentProvider {
String defLocationMode = Integer.toString(
!TextUtils.isEmpty(locationProvidersAllowed.getValue())
- ? Secure.LOCATION_MODE_HIGH_ACCURACY
+ ? Secure.LOCATION_MODE_ON
: Secure.LOCATION_MODE_OFF);
secureSettings.insertSettingLocked(
Secure.LOCATION_MODE, defLocationMode,
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index c3c3f25a9f03..c03268381367 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -145,6 +145,7 @@
<uses-permission android:name="android.permission.SET_TIME_ZONE" />
<uses-permission android:name="android.permission.DISABLE_HIDDEN_API_CHECKS" />
<uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" />
+ <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
<!-- Permission needed to rename bugreport notifications (so they're not shown as Shell) -->
<uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" />
<!-- Permission needed to hold a wakelock in dumpstate.cpp (drop_root_user()) -->
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 3453e798c7ae..815ae9ac225c 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -22,6 +22,11 @@
android:sharedUserId="android.uid.systemui"
coreApp="true">
+ <!-- Using OpenGL ES 2.0 -->
+ <uses-feature
+ android:glEsVersion="0x00020000"
+ android:required="true" />
+
<!-- SysUI must be the one to define this permission; its name is
referenced by the core OS. -->
<permission android:name="android.permission.systemui.IDENTITY"
@@ -593,11 +598,6 @@
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
android:process=":ui"
android:visibleToInstantApps="true">
- <intent-filter>
- <action android:name="android.intent.action.CHOOSER_UI" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.VOICE" />
- </intent-filter>
</activity>
<!-- Doze with notifications, run in main sysui process for every user -->
diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS
index 2f6e32b2c6d2..e7e2c1aafa78 100644
--- a/packages/SystemUI/OWNERS
+++ b/packages/SystemUI/OWNERS
@@ -1,6 +1,6 @@
set noparent
-dsandler@google.com
+dsandler@android.com
adamcohen@google.com
asc@google.com
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index 4e2937ade812..55c822b76d25 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_1">%d</xliff:g> pogings oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item>
<item quantity="one">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_0">%d</xliff:g> poging oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index b64e0cf7ce36..2632db4b4c15 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item>
<item quantity="other">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index af958e54dd70..9149d7ef9459 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -182,4 +182,78 @@
<item quantity="other">‏تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك <xliff:g id="_NUMBER_1">%d</xliff:g> محاولة قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item>
<item quantity="one">‏تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك محاولة واحدة (<xliff:g id="_NUMBER_0">%d</xliff:g>) قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index 258219abae5f..0a6b896f3df7 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item>
<item quantity="other">ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index 18671869fc29..8e6df65c9bae 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_1">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item>
<item quantity="one">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_0">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index ef0e1ce2e9a1..ca32751a59ce 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -158,4 +158,78 @@
<item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item>
<item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index 873a87bd56e2..20488697cc35 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -166,4 +166,78 @@
<item quantity="many">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спроб, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item>
<item quantity="other">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спробы, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 3725a5eeed30..362fc51d3ff7 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остават ви <xliff:g id="_NUMBER_1">%d</xliff:g> опита, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item>
<item quantity="one">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остава ви <xliff:g id="_NUMBER_0">%d</xliff:g> опит, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index ff925f8996c6..e3f0f6559cbf 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর <xliff:g id="_NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</item>
<item quantity="other">সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর <xliff:g id="_NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 110680751347..042c11e2e1db 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -158,4 +158,78 @@
<item quantity="few">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera.</item>
<item quantity="other">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 3a734b1c0281..f6ca03c68dae 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queden <xliff:g id="_NUMBER_1">%d</xliff:g> intents; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item>
<item quantity="one">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queda <xliff:g id="_NUMBER_0">%d</xliff:g> intent; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index 1bfc29463cab..f31342352760 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -166,4 +166,78 @@
<item quantity="other">SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_1">%d</xliff:g> pokusů, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item>
<item quantity="one">SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index f4a3794f1cc6..acc91b6f5495 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item>
<item quantity="other">SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 83d7da5c9c54..b925ac69f725 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_1">%d</xliff:g> Versuche, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item>
<item quantity="one">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_0">%d</xliff:g> Versuch, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index 89b05ec57943..91afac65740f 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένουν <xliff:g id="_NUMBER_1">%d</xliff:g> ακόμη προσπάθειες προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item>
<item quantity="one">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένει <xliff:g id="_NUMBER_0">%d</xliff:g> ακόμη προσπάθεια προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index 415e3de46a3f..12fae43f3afb 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item>
<item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index 56a4bcc5e85b..fb587c35dca4 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item>
<item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index 415e3de46a3f..12fae43f3afb 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item>
<item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index 415e3de46a3f..12fae43f3afb 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item>
<item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index f3b398d845fd..da98ea91b4a3 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -150,4 +150,81 @@
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎SIM is now disabled. Enter PUK code to continue. You have ‎‏‎‎‏‏‎<xliff:g id="_NUMBER_1">%d</xliff:g>‎‏‎‎‏‏‏‎ remaining attempts before SIM becomes permanently unusable. Contact carrier for details.‎‏‎‎‏‎</item>
<item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎SIM is now disabled. Enter PUK code to continue. You have ‎‏‎‎‏‏‎<xliff:g id="_NUMBER_0">%d</xliff:g>‎‏‎‎‏‏‏‎ remaining attempt before SIM becomes permanently unusable. Contact carrier for details.‎‏‎‎‏‎</item>
</plurals>
+ <string name="type_clock_header" msgid="4786545441902447636">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎It’s‎‏‎‎‏‎"</string>
+ <string-array name="type_clock_hours">
+ <item msgid="3543074812389379830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎Twelve‎‏‎‎‏‎"</item>
+ <item msgid="7389464214252023751">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+ <item msgid="8803180377002008046">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎Two‎‏‎‎‏‎"</item>
+ <item msgid="8614897059944644719">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎Three‎‏‎‎‏‎"</item>
+ <item msgid="2293058674782619556">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‎‎Four‎‏‎‎‏‎"</item>
+ <item msgid="4815402358455041664">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎Five‎‏‎‎‏‎"</item>
+ <item msgid="3325754778509665687">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+ <item msgid="5805551341866280575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‎Seven‎‏‎‎‏‎"</item>
+ <item msgid="203334816668238610">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‎‎‏‎‎Eight‎‏‎‎‏‎"</item>
+ <item msgid="4828052671464488923">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎Nine‎‏‎‎‏‎"</item>
+ <item msgid="2233497913571137419">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‎Ten‎‏‎‎‏‎"</item>
+ <item msgid="5621554266768657830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎Eleven‎‏‎‎‏‎"</item>
+ </string-array>
+ <string-array name="type_clock_minutes">
+ <item msgid="8322049385467207985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‎O’Clock‎‏‎‎‏‎"</item>
+ <item msgid="8837126587669001578">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‎‏‎‎O’One‎‏‎‎‏‎"</item>
+ <item msgid="4294343372940455660">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎O’Two‎‏‎‎‏‎"</item>
+ <item msgid="7129166637707421536">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎O’Three‎‏‎‎‏‎"</item>
+ <item msgid="7579404865008788673">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‏‎O’Four‎‏‎‎‏‎"</item>
+ <item msgid="3873924689207380586">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎O’Five‎‏‎‎‏‎"</item>
+ <item msgid="4849565597850069377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎O’Six‎‏‎‎‏‎"</item>
+ <item msgid="4404219424523572364">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎O’Seven‎‏‎‎‏‎"</item>
+ <item msgid="8740481214764087329">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‎O’Eight‎‏‎‎‏‎"</item>
+ <item msgid="1713216865806811237">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‏‎‏‎O’Nine‎‏‎‎‏‎"</item>
+ <item msgid="3508406095411245038">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎Ten‎‏‎‎‏‎"</item>
+ <item msgid="7161996337755311711">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎Eleven‎‏‎‎‏‎"</item>
+ <item msgid="4044549963329624197">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎Twelve‎‏‎‎‏‎"</item>
+ <item msgid="333373157917379088">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‎Thirteen‎‏‎‎‏‎"</item>
+ <item msgid="2631202907124819385">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎Fourteen‎‏‎‎‏‎"</item>
+ <item msgid="6472396076858033453">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎Fifteen‎‏‎‎‏‎"</item>
+ <item msgid="8656981856181581643">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎Sixteen‎‏‎‎‏‎"</item>
+ <item msgid="7289026608562030619">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‏‏‎Seventeen‎‏‎‎‏‎"</item>
+ <item msgid="3881477602692646573">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎Eighteen‎‏‎‎‏‎"</item>
+ <item msgid="3358129827772984226">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎Nineteen‎‏‎‎‏‎"</item>
+ <item msgid="3308575407402865807">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‏‎Twenty‎‏‎‎‏‎"</item>
+ <item msgid="5346560955382229629">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+ <item msgid="226750304761473436">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎"</item>
+ <item msgid="616811325336838734">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎"</item>
+ <item msgid="616346116869053440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎"</item>
+ <item msgid="4642996410384042830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎"</item>
+ <item msgid="7506092849993571465">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‏‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+ <item msgid="1915078191101042031">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎"</item>
+ <item msgid="4292378641900520252">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎"</item>
+ <item msgid="5339513901773103696">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‎‎‎Twenty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎"</item>
+ <item msgid="3574673250891657607">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‏‎Thirty‎‏‎‎‏‎"</item>
+ <item msgid="5796923836589110940">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+ <item msgid="5859323597571702052">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎"</item>
+ <item msgid="5133326723148876507">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎"</item>
+ <item msgid="2693999494655663096">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎"</item>
+ <item msgid="3316754944962836197">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎"</item>
+ <item msgid="816891008836796723">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+ <item msgid="9158890488666520078">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎"</item>
+ <item msgid="1894769703213894011">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎"</item>
+ <item msgid="5638820345598572399">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎Thirty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎"</item>
+ <item msgid="8838304023017895439">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎Forty‎‏‎‎‏‎"</item>
+ <item msgid="1834742948932559597">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+ <item msgid="6573707308847773944">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎"</item>
+ <item msgid="2450149950652678001">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎"</item>
+ <item msgid="2874667401318178036">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎"</item>
+ <item msgid="3391101532763048862">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎"</item>
+ <item msgid="1671489330863254362">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+ <item msgid="5916017359554531038">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎"</item>
+ <item msgid="8205413177993059967">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎"</item>
+ <item msgid="6607867415142171302">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎Forty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎"</item>
+ <item msgid="8358850748472089162">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‎‏‎‎Fifty‎‏‎‎‏‎"</item>
+ <item msgid="3551313125255080234">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‎‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎One‎‏‎‎‏‎"</item>
+ <item msgid="1559678130725716542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Two‎‏‎‎‏‎"</item>
+ <item msgid="431441994725492377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‎‏‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Three‎‏‎‎‏‎"</item>
+ <item msgid="6345774640539623024">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Four‎‏‎‎‏‎"</item>
+ <item msgid="8018192990793931120">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Five‎‏‎‎‏‎"</item>
+ <item msgid="6187650843754604534">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Six‎‏‎‎‏‎"</item>
+ <item msgid="8727240174015993259">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‏‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Seven‎‏‎‎‏‎"</item>
+ <item msgid="848339003778952950">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Eight‎‏‎‎‏‎"</item>
+ <item msgid="5798985802835423618">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎‎Fifty‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Nine‎‏‎‎‏‎"</item>
+ </string-array>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index e56fa6b65245..72fc16ad5e00 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item>
<item quantity="one">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index 8a755b414d58..232c79b0aac8 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item>
<item quantity="one">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index a19cc2325a8e..4eeebe3c731e 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_1">%d</xliff:g> katset enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item>
<item quantity="one">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_0">%d</xliff:g> katse enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index b06310754d8a..bb913d1c8dc2 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item>
<item quantity="one">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_0">%d</xliff:g> saiakera geratzen zaizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index db7923d67928..5568d94c057b 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">‏سیم‌کارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیم‌کارت برای همیشه غیرقابل‌استفاده می‌شود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item>
<item quantity="other">‏سیم‌کارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیم‌کارت برای همیشه غیرقابل‌استفاده می‌شود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index 2bd83148dcca..4f3304d6158c 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_1">%d</xliff:g> yritystä jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item>
<item quantity="one">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_0">%d</xliff:g> yritys jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 9b0e269a9e4d..348a3ff543e0 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item>
<item quantity="other">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index f0c7e92628c9..e986ceed9919 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item>
<item quantity="other">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 756fc2733ec9..631ab6a28d28 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">A SIM está desactivada. Introduce o código PUK para continuar. Quédanche <xliff:g id="_NUMBER_1">%d</xliff:g> intentos antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item>
<item quantity="one">A SIM está desactivada. Introduce o código PUK para continuar. Quédache <xliff:g id="_NUMBER_0">%d</xliff:g> intento antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index fb3a14bb7f6d..520f09876e6a 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે <xliff:g id="_NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો.</item>
<item quantity="other">સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે <xliff:g id="_NUMBER_1">%d</xliff:g> પ્રયાસો બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index 7bfc6350d292..9f189e876609 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item>
<item quantity="other">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 089c6c4dbd6a..5c84ecc55f90 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -158,4 +158,78 @@
<item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item>
<item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 49d84012b3e6..e4e9fa62cc6c 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_1">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item>
<item quantity="one">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_0">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index 5198da6fd87f..c23782899d39 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item>
<item quantity="other">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index 161287c5f159..ed412229021b 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_1">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item>
<item quantity="one">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_0">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index 9ed11887dd69..afaf6bbcb783 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það er <xliff:g id="_NUMBER_1">%d</xliff:g> tilraun eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item>
<item quantity="other">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það eru <xliff:g id="_NUMBER_1">%d</xliff:g> tilraunir eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index b5f85f6a7ad9..28a53a492fe3 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_1">%d</xliff:g> tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.</item>
<item quantity="one">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_0">%d</xliff:g> tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 09b3cfa1e9e3..dc9c7ed56359 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -166,4 +166,78 @@
<item quantity="other">‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך <xliff:g id="_NUMBER_1">%d</xliff:g> ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item>
<item quantity="one">‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך <xliff:g id="_NUMBER_0">%d</xliff:g> ניסיון נוסף לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index 08d4b9bd8b65..23e6d1540966 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_1">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item>
<item quantity="one">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_0">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index f966c33ee1df..788c77208ad8 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_1">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item>
<item quantity="one">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_0">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index 530418f4a318..66c4e1eea380 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_1">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item>
<item quantity="one">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_0">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index 7ab347d37796..dcd6ce777432 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_1">%d</xliff:g> ដងទៀត​មុនពេល​ស៊ីម​មិនអាច​ប្រើបាន​ជា​អចិន្ត្រៃយ៍។ ទាក់ទង​ទៅ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​សម្រាប់ព័ត៌មានលម្អិត។</item>
<item quantity="one">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_0">%d</xliff:g> ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទង​ទៅ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​សម្រាប់​ព័ត៌មាន​លម្អិត។</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index ef92951b50e6..39fdf5558a27 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ <xliff:g id="_NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ.</item>
<item quantity="other">ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ <xliff:g id="_NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index 8a65c9521cd1..c20a9ddcff42 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_1">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item>
<item quantity="one">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_0">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index a7d5d45ed916..941684388593 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгарына <xliff:g id="_NUMBER_1">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item>
<item quantity="one">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгаарына <xliff:g id="_NUMBER_0">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index 9f3de8b0bc5d..c00f2f0a125e 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_1">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item>
<item quantity="one">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index bdebf6738f51..71e04f2b6db7 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -166,4 +166,78 @@
<item quantity="many">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymo. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item>
<item quantity="other">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymų. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index c68761d467bc..4bdaa664e683 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -158,4 +158,78 @@
<item quantity="one">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizi. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item>
<item quantity="other">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizes. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index 0ace83ff0ff6..b963d325d6ac 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостанува уште <xliff:g id="_NUMBER_1">%d</xliff:g> обид пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item>
<item quantity="other">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостануваат уште <xliff:g id="_NUMBER_1">%d</xliff:g> обиди пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 779a532985f5..0af354f2bf42 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി <xliff:g id="_NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക.</item>
<item quantity="one">സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി <xliff:g id="_NUMBER_0">%d</xliff:g> ശ്രമം കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 189d40746354..9e16c6d92d56 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_1">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item>
<item quantity="one">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_0">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index d4122525c70b..b27b299ac3c9 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहे. तपशीलांसाठी वाहकाशी संपर्क साधा.</item>
<item quantity="other">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत. तपशीलांसाठी वाहकाशी संपर्क साधा.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index 9e10298f156f..c16f43359155 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_1">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item>
<item quantity="one">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_0">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index 87fca07a55c3..0d011af266ca 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် <xliff:g id="_NUMBER_1">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item>
<item quantity="one">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် <xliff:g id="_NUMBER_0">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index 977784ca4e6b..dc544890cbd2 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item>
<item quantity="one">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_0">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index c21faead879d..be39c3266f42 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयासहरू बाँकी छन्, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item>
<item quantity="one">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_0">%d</xliff:g> प्रयास बाँकी छ, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index f80749fbba93..5c911bea561f 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item>
<item quantity="one">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_0">%d</xliff:g> poging over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
index eff493b23c79..58242e6c9782 100644
--- a/packages/SystemUI/res-keyguard/values-or/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍‍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_1">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍‍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍‌ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
<item quantity="one">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍‍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_0">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍‍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍‌ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 08245dcf665e..a435c79cd467 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="_NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item>
<item quantity="other">ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="_NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 49792e20fe3e..51c7ac898025 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -166,4 +166,78 @@
<item quantity="other">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_1">%d</xliff:g> próby, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item>
<item quantity="one">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_0">%d</xliff:g> próbę, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 90f46cefa304..6698bf952434 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item>
<item quantity="other">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index 321b8989bbdd..118f05ff8835 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item>
<item quantity="one">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index 90f46cefa304..6698bf952434 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item>
<item quantity="other">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 083adbdcd0fb..915a47bc7915 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -158,4 +158,78 @@
<item quantity="other">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas <xliff:g id="_NUMBER_1">%d</xliff:g> de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item>
<item quantity="one">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-a mai rămas <xliff:g id="_NUMBER_0">%d</xliff:g> încercare până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index e5b1d0e75803..d036e0d14c0a 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -166,4 +166,78 @@
<item quantity="many">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попыток. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item>
<item quantity="other">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попытки. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index 1955edd4cc89..7073526aedd9 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item>
<item quantity="other">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index f9f39e5001d7..9f0501cc5f47 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -166,4 +166,78 @@
<item quantity="other">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_1">%d</xliff:g> pokusov, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item>
<item quantity="one">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index 2a4417c9306b..afc6ee1b8683 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -166,4 +166,78 @@
<item quantity="few">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskuse. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item>
<item quantity="other">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskusov. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index 4057e03a0515..d8e68d797277 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të kanë mbetur edhe <xliff:g id="_NUMBER_1">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item>
<item quantity="one">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të ka mbetur edhe <xliff:g id="_NUMBER_0">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index 16c1bde93b5d..c576493c2da3 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -158,4 +158,78 @@
<item quantity="few">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item>
<item quantity="other">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index 8e75aa2d01c6..dfa570b01e56 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_1">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item>
<item quantity="one">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_0">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index e5277b2ec1ac..00334be2ae26 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na majaribio <xliff:g id="_NUMBER_1">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item>
<item quantity="one">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na jaribio <xliff:g id="_NUMBER_0">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index f5fb35737d9d..d97864317a62 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_1">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item>
<item quantity="one">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_0">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index 1e0817752c1f..8a8df342ab60 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్‌ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_1">%d</xliff:g> ప్రయత్నాలు మిగిలి ఉన్నాయి. వివరాల కోసం కారియర్‌ను సంప్రదించండి.</item>
<item quantity="one">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్‌ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_0">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది వివరాల కోసం కారియర్‌ను సంప్రదించండి.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index bde50f3f3a46..a8577a7a44ef 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_1">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item>
<item quantity="one">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_0">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index 71a7537fe0fd..b3609d1277d5 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item>
<item quantity="other">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> na natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index fbbf63e5108c..018e271a6086 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_1">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item>
<item quantity="one">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_0">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index feab22fc6716..92ca57bb0810 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -166,4 +166,78 @@
<item quantity="many">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроб. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item>
<item quantity="other">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроби. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 928fcbdbd008..ace9f796162b 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">‏SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس <xliff:g id="_NUMBER_1">%d</xliff:g> کوششیں بچی ہیں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔</item>
<item quantity="one">‏SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس <xliff:g id="_NUMBER_0">%d</xliff:g> کوشش بچی ہے۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index faa7d504cf50..1766d1188275 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -152,4 +152,78 @@
<item quantity="other">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_1">%d</xliff:g> marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item>
<item quantity="one">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_0">%d</xliff:g> marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 6b0651397b12..eb6e536ef52a 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_1">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item>
<item quantity="one">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_0">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không thể sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index 44f06a64bf1d..5fafe2f3c290 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item>
<item quantity="one">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index 364f126b591b..0181ed3b1614 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item>
<item quantity="one">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index f687397bcf5d..126304f675ac 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -150,4 +150,78 @@
<item quantity="other">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item>
<item quantity="one">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index 66904eb0c3cc..6a62d52dd3a4 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -150,4 +150,78 @@
<item quantity="one">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item>
<item quantity="other">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item>
</plurals>
+ <!-- no translation found for type_clock_header (4786545441902447636) -->
+ <skip />
+ <!-- no translation found for type_clock_hours:0 (3543074812389379830) -->
+ <!-- no translation found for type_clock_hours:1 (7389464214252023751) -->
+ <!-- no translation found for type_clock_hours:2 (8803180377002008046) -->
+ <!-- no translation found for type_clock_hours:3 (8614897059944644719) -->
+ <!-- no translation found for type_clock_hours:4 (2293058674782619556) -->
+ <!-- no translation found for type_clock_hours:5 (4815402358455041664) -->
+ <!-- no translation found for type_clock_hours:6 (3325754778509665687) -->
+ <!-- no translation found for type_clock_hours:7 (5805551341866280575) -->
+ <!-- no translation found for type_clock_hours:8 (203334816668238610) -->
+ <!-- no translation found for type_clock_hours:9 (4828052671464488923) -->
+ <!-- no translation found for type_clock_hours:10 (2233497913571137419) -->
+ <!-- no translation found for type_clock_hours:11 (5621554266768657830) -->
+ <!-- no translation found for type_clock_minutes:0 (8322049385467207985) -->
+ <!-- no translation found for type_clock_minutes:1 (8837126587669001578) -->
+ <!-- no translation found for type_clock_minutes:2 (4294343372940455660) -->
+ <!-- no translation found for type_clock_minutes:3 (7129166637707421536) -->
+ <!-- no translation found for type_clock_minutes:4 (7579404865008788673) -->
+ <!-- no translation found for type_clock_minutes:5 (3873924689207380586) -->
+ <!-- no translation found for type_clock_minutes:6 (4849565597850069377) -->
+ <!-- no translation found for type_clock_minutes:7 (4404219424523572364) -->
+ <!-- no translation found for type_clock_minutes:8 (8740481214764087329) -->
+ <!-- no translation found for type_clock_minutes:9 (1713216865806811237) -->
+ <!-- no translation found for type_clock_minutes:10 (3508406095411245038) -->
+ <!-- no translation found for type_clock_minutes:11 (7161996337755311711) -->
+ <!-- no translation found for type_clock_minutes:12 (4044549963329624197) -->
+ <!-- no translation found for type_clock_minutes:13 (333373157917379088) -->
+ <!-- no translation found for type_clock_minutes:14 (2631202907124819385) -->
+ <!-- no translation found for type_clock_minutes:15 (6472396076858033453) -->
+ <!-- no translation found for type_clock_minutes:16 (8656981856181581643) -->
+ <!-- no translation found for type_clock_minutes:17 (7289026608562030619) -->
+ <!-- no translation found for type_clock_minutes:18 (3881477602692646573) -->
+ <!-- no translation found for type_clock_minutes:19 (3358129827772984226) -->
+ <!-- no translation found for type_clock_minutes:20 (3308575407402865807) -->
+ <!-- no translation found for type_clock_minutes:21 (5346560955382229629) -->
+ <!-- no translation found for type_clock_minutes:22 (226750304761473436) -->
+ <!-- no translation found for type_clock_minutes:23 (616811325336838734) -->
+ <!-- no translation found for type_clock_minutes:24 (616346116869053440) -->
+ <!-- no translation found for type_clock_minutes:25 (4642996410384042830) -->
+ <!-- no translation found for type_clock_minutes:26 (7506092849993571465) -->
+ <!-- no translation found for type_clock_minutes:27 (1915078191101042031) -->
+ <!-- no translation found for type_clock_minutes:28 (4292378641900520252) -->
+ <!-- no translation found for type_clock_minutes:29 (5339513901773103696) -->
+ <!-- no translation found for type_clock_minutes:30 (3574673250891657607) -->
+ <!-- no translation found for type_clock_minutes:31 (5796923836589110940) -->
+ <!-- no translation found for type_clock_minutes:32 (5859323597571702052) -->
+ <!-- no translation found for type_clock_minutes:33 (5133326723148876507) -->
+ <!-- no translation found for type_clock_minutes:34 (2693999494655663096) -->
+ <!-- no translation found for type_clock_minutes:35 (3316754944962836197) -->
+ <!-- no translation found for type_clock_minutes:36 (816891008836796723) -->
+ <!-- no translation found for type_clock_minutes:37 (9158890488666520078) -->
+ <!-- no translation found for type_clock_minutes:38 (1894769703213894011) -->
+ <!-- no translation found for type_clock_minutes:39 (5638820345598572399) -->
+ <!-- no translation found for type_clock_minutes:40 (8838304023017895439) -->
+ <!-- no translation found for type_clock_minutes:41 (1834742948932559597) -->
+ <!-- no translation found for type_clock_minutes:42 (6573707308847773944) -->
+ <!-- no translation found for type_clock_minutes:43 (2450149950652678001) -->
+ <!-- no translation found for type_clock_minutes:44 (2874667401318178036) -->
+ <!-- no translation found for type_clock_minutes:45 (3391101532763048862) -->
+ <!-- no translation found for type_clock_minutes:46 (1671489330863254362) -->
+ <!-- no translation found for type_clock_minutes:47 (5916017359554531038) -->
+ <!-- no translation found for type_clock_minutes:48 (8205413177993059967) -->
+ <!-- no translation found for type_clock_minutes:49 (6607867415142171302) -->
+ <!-- no translation found for type_clock_minutes:50 (8358850748472089162) -->
+ <!-- no translation found for type_clock_minutes:51 (3551313125255080234) -->
+ <!-- no translation found for type_clock_minutes:52 (1559678130725716542) -->
+ <!-- no translation found for type_clock_minutes:53 (431441994725492377) -->
+ <!-- no translation found for type_clock_minutes:54 (6345774640539623024) -->
+ <!-- no translation found for type_clock_minutes:55 (8018192990793931120) -->
+ <!-- no translation found for type_clock_minutes:56 (6187650843754604534) -->
+ <!-- no translation found for type_clock_minutes:57 (8727240174015993259) -->
+ <!-- no translation found for type_clock_minutes:58 (848339003778952950) -->
+ <!-- no translation found for type_clock_minutes:59 (5798985802835423618) -->
</resources>
diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml
index 7432f9cde639..41acf82a4567 100644
--- a/packages/SystemUI/res-keyguard/values/strings.xml
+++ b/packages/SystemUI/res-keyguard/values/strings.xml
@@ -405,7 +405,7 @@ number">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.
<!-- Header for typographic clock face. [CHAR LIMIT=8] -->
<string name="type_clock_header">It\u2019s</string>
- <!-- Hour displayed in words on the typographic clock face. [CHAR LIMIT=8] -->
+ <!-- Hour displayed in words on the typographic clock face. [CHAR LIMIT=12] -->
<string-array name="type_clock_hours">
<item>Twelve</item>
<item>One</item>
@@ -421,7 +421,7 @@ number">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.
<item>Eleven</item>
</string-array>
- <!-- Minutes displayed in words on the typographic clock face. [CHAR LIMIT=16] -->
+ <!-- Minutes displayed in words on the typographic clock face. [CHAR LIMIT=20] -->
<string-array name="type_clock_minutes">
<item>O\u2019Clock</item>
<item>O\u2019One</item>
diff --git a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
new file mode 100644
index 000000000000..11d73a93ad04
--- /dev/null
+++ b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
@@ -0,0 +1,33 @@
+precision mediump float;
+
+uniform sampler2D uTexture;
+uniform float uCenterReveal;
+uniform float uReveal;
+uniform float uAod2Opacity;
+uniform int uAodMode;
+varying vec2 vTextureCoordinates;
+
+vec3 luminosity(vec3 color) {
+ float lum = 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
+ return vec3(lum);
+}
+
+vec4 transform(vec3 diffuse) {
+ // TODO: Add well comments here, tracking on b/123615467.
+ vec3 lum = luminosity(diffuse);
+ diffuse = mix(diffuse, lum, smoothstep(0., uCenterReveal, uReveal));
+ float val = mix(uReveal, uCenterReveal, step(uCenterReveal, uReveal));
+ diffuse = smoothstep(val, 1.0, diffuse);
+ diffuse *= uAod2Opacity * (1. - smoothstep(uCenterReveal, 1., uReveal));
+ return vec4(diffuse.r, diffuse.g, diffuse.b, 1.);
+}
+
+void main() {
+ vec4 fragColor = texture2D(uTexture, vTextureCoordinates);
+ // TODO: Remove the branch logic here, tracking on b/123615467.
+ if (uAodMode != 0) {
+ gl_FragColor = transform(fragColor.rgb);
+ } else {
+ gl_FragColor = fragColor;
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl
new file mode 100644
index 000000000000..4393e2bb0ebf
--- /dev/null
+++ b/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl
@@ -0,0 +1,8 @@
+attribute vec4 aPosition;
+attribute vec2 aTextureCoordinates;
+varying vec2 vTextureCoordinates;
+
+void main() {
+ vTextureCoordinates = aTextureCoordinates;
+ gl_Position = aPosition;
+} \ No newline at end of file
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index de2a9502146a..31e450b71d11 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Laat USB-ontfouting toe?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Die rekenaar se RSA-sleutel-vingerafdruk is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Laat altyd toe van hierdie rekenaar af"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-ontfouting word nie toegelaat nie"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Die gebruiker wat tans by hierdie toestel aangemeld is, kan nie USB-ontfouting aanskakel nie. Skakel na die primêre gebruiker toe oor om hierdie kenmerk te gebruik."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoem om skerm te vul"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Strek om skerm te vul"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skermkiekie"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Kanselleer"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Hulpboodskapgebied"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestig"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Probeer weer"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak die vingerafdruksensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukikoon"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Soek tans vir jou …"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Oudio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Kopstuk"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Invoer"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Gehoortoestelle"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Skakel tans aan …"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helderheid"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Outo-draai"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Jy maak hierdie kennisgewings gewoonlik toe. \nMoet ons aanhou om hulle te wys?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Hou aan om hierdie kennisgewings te wys?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stop kennisgewings"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokkeer"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Hou aan wys"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimeer"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Wys sonder klank"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Bly stil"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Waarsku my"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Hou aan waarsku"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Hou aan om kennisgewings van hierdie program af te wys?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Hierdie kennisgewings kan nie afgeskakel word nie"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Instellings"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Het dit"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Stort SysUI-hoop"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> programme</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> program</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> gebruik tans jou <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Programme gebruik tans jou <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Kanselleer"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programme gebruik jou <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> program gebruik jou <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Bekyk details"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Program wat jou <xliff:g id="TYPES_LIST">%s</xliff:g> gebruik"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Programme wat jou <xliff:g id="TYPES_LIST">%s</xliff:g> gebruik"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 41546432759e..731acce851a6 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"የUSB ማረሚያ ይፈቀድ?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"የኮምፒውተሩ RSA ቁልፍ ጣት አሻራ ይሄ ነው፦\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ሁልጊዜ ከዚህ ኮምፒውተር ፍቀድ"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"የዩኤስቢ እርማት አይፈቀድም"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"አሁን ወደዚህ መሣሪያ የገባው ተጠቃሚ የዩኤስቢ እርማትን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"ማያ እንዲሞላ አጉላ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ማያ ለመሙለት ሳብ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ቅጽበታዊ ገጽ እይታ"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"ይቅር"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"የእገዛ መልዕክት አካባቢ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"አረጋግጥ"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"እንደገና ይሞክሩ"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"የጣት አሻራ ዳሳሹን ይንኩ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"የጣት አሻራ አዶ"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"እርስዎን በመፈለግ ላይ…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ኦዲዮ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ማዳመጫ"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ግቤት"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"አጋዥ መስሚያዎች"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"አብዛኛውን ጊዜ እነዚህን ማሳወቂያዎች ያሰናብቷቸዋል። \nመታየታቸው ይቀጥል??"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"እነዚህን ማሳወቂያዎች ማሳየት ይቀጥሉ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"ማሳወቂያዎችን አስቁም"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"አግድ"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"ማሳየትን ቀጥል"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"አሳንስ"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"በፀጥታ አሳይ"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ጸጥ እንዳለ ቆይ"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"አሳውቀኝ"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ማንቃቱን ቀጥል"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ከዚህ መተግበሪያ ማሳወቂያዎችን ማሳየት ይቀጥል?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"እነዚህ ማሳወቂያዎች ሊጠፉ አይችሉም"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"በ<xliff:g id="APP_NAME">%1$s</xliff:g> በኩል"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ቅንብሮች"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"ገባኝ"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI Heap አራግፍ"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> መተግበሪያዎች</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> መተግበሪያዎች</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> የእርስዎን <xliff:g id="TYPES_LIST">%2$s</xliff:g> እየተጠቀመ ነው።"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"መተግበሪያዎች የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> እየተጠቀሙ ነው።"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ይቅር"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> መተግበሪያዎች የእርስዎን <xliff:g id="TYPE_5">%2$s</xliff:g> እየተጠቀሙ ነው።</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> መተግበሪያዎች የእርስዎን <xliff:g id="TYPE_5">%2$s</xliff:g> እየተጠቀሙ ነው።</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ዝርዝሮችን አሳይ"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> የሚጠቀሙ መተግበሪያዎች"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> የሚጠቀሙ መተግበሪያዎች"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 579964d05b3a..3306388d93f6 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"‏هل تريد السماح بتصحيح أخطاء USB؟"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"‏الملف المرجعي الرئيسي لـ RSA في هذا الكمبيوتر هو:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"السماح دائمًا من هذا الكمبيوتر"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‏لا يُسمح بتصحيح أخطاء USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‏لا يمكن للمستخدم الذي يسجّل دخوله حاليًا إلى هذا الجهاز تشغيل تصحيح أخطاء USB. لاستخدام هذه الميزة، يمكنك التبديل إلى المستخدم الأساسي."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"تكبير/تصغير لملء الشاشة"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"توسيع بملء الشاشة"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"لقطة شاشة"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"إلغاء"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"منطقة رسالة المساعدة"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأكيد"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"إعادة المحاولة"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"المس جهاز استشعار بصمات الإصبع"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"رمز بصمة الإصبع"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"جارٍ البحث عن وجهك…"</string>
@@ -300,8 +305,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"صوت"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"سماعة الرأس"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"الإدخال"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"سماعات الأذن الطبية"</string>
<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>
@@ -623,17 +627,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"أنت تتجاهل عادةً هذه الإشعارات. \nهل تريد الاستمرار في عرضها؟"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"هل تريد الاستمرار في تلقي هذه الإشعارات؟"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"إيقاف الإشعارات"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"حظر"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"الاستمرار في تلقّي الإشعارات"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"تصغير"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"عرض بدون تنبيه صوتي"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"متابعة عرض الإشعارات بدون صوت"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"إرسال تنبيه إليّ"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"متابعة إرسال التنبيهات"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"هل تريد الاستمرار في تلقي إشعارات من هذا التطبيق؟"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"يتعذَّر إيقاف هذه الإشعارات."</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"عبر <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -755,7 +755,7 @@
</string-array>
<string name="menu_ime" msgid="4998010205321292416">"مفتاح تبديل لوحة المفاتيح"</string>
<string name="save" msgid="2311877285724540644">"حفظ"</string>
- <string name="reset" msgid="2448168080964209908">"إعادة تعيين"</string>
+ <string name="reset" msgid="2448168080964209908">"إعادة الضبط"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ضبط عرض الزر"</string>
<string name="clipboard" msgid="1313879395099896312">"الحافظة"</string>
<string name="accessibility_key" msgid="5701989859305675896">"زر التنقل المخصص"</string>
@@ -891,11 +891,26 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"الإعدادات"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"حسنًا"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"‏تفريغ ذاكرة SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="zero"><xliff:g id="NUM_APPS_2">%d</xliff:g> تطبيق</item>
+ <item quantity="two">تطبيقان (<xliff:g id="NUM_APPS_2">%d</xliff:g>)</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> تطبيقات</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> تطبيقًا</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> تطبيق</item>
+ <item quantity="one">تطبيق واحد (<xliff:g id="NUM_APPS_0">%d</xliff:g>)</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"التطبيق <xliff:g id="APP">%1$s</xliff:g> يستخدم <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"تستخدم التطبيقات <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"إلغاء"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="zero">هناك <xliff:g id="NUM_APPS_4">%1$d</xliff:g> تطبيق يستخدِم <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="two">هناك تطبيقان (<xliff:g id="NUM_APPS_4">%1$d</xliff:g>) يستخدِمان <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="few">هناك <xliff:g id="NUM_APPS_2">%1$d</xliff:g> تطبيقات تستخدِم <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="many">هناك <xliff:g id="NUM_APPS_4">%1$d</xliff:g> تطبيقًا يستخدِم <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other">هناك <xliff:g id="NUM_APPS_4">%1$d</xliff:g> تطبيق يستخدِم <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one">هناك تطبيق واحد (<xliff:g id="NUM_APPS_0">%1$d</xliff:g>) يستخدِم <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"عرض التفاصيل"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"التطبيق الذي يستخدِم <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"التطبيقات التي تستخدِم <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 811350492175..4a09194e6072 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"ইউএছবি ডিবাগিংৰ অনুমতি দিবনে?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"এয়া হৈছে কম্পিউটাৰটোৰ RSA কী ফিংগাৰপ্ৰিণ্ট:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"এই কম্পিউটাৰটোৰ পৰা সদায় অনুমতি দিয়ক"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ইউএছবি ডিবাগিঙৰ অনুমতি নাই"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"এই ডিভাইচটোত বর্তমান ছাইন ইন হৈ থকা ব্যৱহাৰকাৰীজনে ইউএছবি ডিবাগিং অন কৰিব নোৱাৰে। এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ\'লে মুখ্য ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰক।"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্ৰীণশ্বট"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"বাতিল কৰক"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায় বাৰ্তাৰ ক্ষেত্ৰ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"নিশ্চিত কৰক"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"আকৌ চেষ্টা কৰক"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ফিংগাৰপ্ৰিণ্ট আইকন"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপোনাৰ মুখমণ্ডল বিচাৰি আছে…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"অডিঅ’"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"হেডছেট"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ইনপুট"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"শ্ৰৱণ যন্ত্ৰ"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"আপুনি সাধাৰণতে এই জাননীসমূহ অগ্ৰাহ্য কৰে। \nসেইবোৰ দেখুওৱাই থাকিব লাগিবনে?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"এই জাননীসমূহ দেখুওৱাই থাকিব লাগিবনে?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"জাননী বন্ধ কৰক"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"অৱৰোধ কৰক"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"দেখুওৱাই থাকক"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"সৰু কৰক"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"নিৰৱে দেখুৱাওক"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"নীৰৱ হৈ থাকক"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"মোক সতৰ্ক কৰি দিব"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"সতৰ্ক কৰি থাকক"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"এই এপটোৰ জাননী দেখুওৱাই থাকিব লাগিবনে?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"এই জাননীসমূহ বন্ধ কৰিব নোৱাৰি"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জৰিয়তে"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ছেটিংবোৰ"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"বুজি পালোঁ"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI হীপ ডাম্প কৰক"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g>টা এপ্</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>টা এপ্</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"এপ্লিকেশ্বনসমূহে আপোনাৰ <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যৱহাৰ কৰি আছে।"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"বাতিল কৰক"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টা এপ্লিকেশ্বনে আপোনাৰ <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টা এপ্লিকেশ্বনে আপোনাৰ <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"সবিশেষ চাওক"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"এপটোৱে আপোনাৰ <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যৱহাৰ কৰি আছে"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"এপসমূহে আপোনাৰ <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যৱহাৰ কৰি আছে"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 907e19d787d2..b8bace9470d7 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB sazlamaya icazə verilsin?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Kompüterin RSA barmaq izi: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Bu kompüterdən həmişə icazə verilsin"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debaq prosesinə icazə verilmir"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Hazırda bu cihaza daxil olmuş istifadəçi USB sazlama prosesini aktiv edə bilməz. Bu funksiyadan istifadə etmək üçün əsas istifadəçi hesaba daxil olmalıdır."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Ekranı doldurmaq üçün yaxınlaşdır"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Ekranı doldurmaq üçün uzat"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skrinşot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Ləğv et"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı bölməsi"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Təsdiq"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Yenidən cəhd edin"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmaq izi sensoruna klikləyin"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmaq izi ikonası"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Siz axtarılırsınız…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Qulaqlıq"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Giriş"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Eşitmə Aparatı"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktiv edilir..."</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Parlaqlıq"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Avtodönüş"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Adətən bu bildirişləri rədd edirsiniz. \nBildirişlər göstərilsin?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Bu bildirişlər göstərilməyə davam edilsin?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Bildirişləri dayandırın"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blok edin"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Göstərməyə davam edin"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Kiçildin"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Səssiz göstərin"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Səssiz göstərilsin"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Məni xəbərdar edin"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Xəbərdarlıq göndərməyə davam edin"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu tətbiqin bildirişləri göstərilməyə davam edilsin?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirişlər deaktiv edilə bilməz"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> vasitəsilə"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Ayarlar"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Anladım"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> tətbiq</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> tətbiq</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="TYPES_LIST">%2$s</xliff:g> tətbiqlərindən istifadə edir."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Tətbiqlər <xliff:g id="TYPES_LIST">%s</xliff:g> istifadə edir."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Ləğv edin"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> tətbiq <xliff:g id="TYPE_5">%2$s</xliff:g> tətbiqindən istifadə edir.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> tətbiq <xliff:g id="TYPE_1">%2$s</xliff:g> tətbiqindən istifadə edir.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Detallara baxın"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> tətbiqindən istifadə edən tətbiq"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> tətbiqindən istifadə edən tətbiqlə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 8668c6baf9c8..eed9ce6883e2 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Želite li da dozvolite otklanjanje USB grešaka?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Digitalni otisak RSA ključa ovog računara je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Uvek dozvoli sa ovog računara"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje grešaka na USB-u nije dozvoljeno"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može da uključi otklanjanje grešaka na USB-u. Da biste koristili ovu funkciju, prebacite na primarnog korisnika."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zumiraj na celom ekranu"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Razvuci na ceo ekran"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast poruke za pomoć"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Probaj ponovo"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string>
@@ -297,8 +302,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalice"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Unos"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni aparati"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Uključuje se..."</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Osvetljenost"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatska rotacija"</string>
@@ -614,17 +618,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete ova obaveštenja. \nŽelite li da se i dalje prikazuju?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Želite li da se ova obaveštenja i dalje prikazuju?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Prestani da prikazuješ obaveštenja"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Nastavi da prikazuješ"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Umanji"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži bez zvuka"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Ne uključuj zvuk"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Obavesti me"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Nastavi sa obaveštenjima"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite li da se obaveštenja iz ove aplikacije i dalje prikazuju?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ne možete da isključite ova obaveštenja"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"preko aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Podešavanja"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Važi"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Izdvoji SysUI mem."</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> koristi <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije koriste <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Otkaži"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi dozvolu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije koriste dozvolu <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi dozvolu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Prikaži detalje"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacija koja koristi dozvole <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije koje koriste dozvole <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 6a27dbb85d40..8bc87cda2f72 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Дазволіць адладку USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Адбiтак ключа RSA на гэтым камп\'ютары:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Заўсёды дазваляць з гэтага камп\'ютара"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Адладка USB не дапускаецца"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Карыстальнік, які зараз увайшоў у гэту прыладу, не можа ўключыць адладку USB. Каб выкарыстоўваць гэту функцыю, пераключыцеся на асноўнага карыстальніка."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Павял. на ўвесь экран"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Расцягн. на ўвесь экран"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Здымак экрана"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Скасаваць"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Поле даведачнага паведамлення"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Пацвердзіць"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Паўтарыць спробу"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Дакраніцеся да сканера адбіткаў пальцаў"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок адбіткаў пальцаў"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ідзе пошук вашага твару…"</string>
@@ -300,8 +305,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Гук"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнітура"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Увод"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слыхавыя апараты"</string>
<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>
@@ -619,17 +623,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Звычайна вы адхіляеце гэтыя апавяшчэнні. \nПаказваць іх?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Працягваць паказваць гэтыя апавяшчэнні?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Спыніць апавяшчэнні"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Заблакіраваць"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Працягваць паказваць"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Згарнуць"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Паказваць бязгучна"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Не ўключаць гук"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Апавясціць мяне"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Апавяшчаць далей"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Працягваць паказваць апавяшчэнні гэтай праграмы?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Немагчыма адключыць гэтыя апавяшчэнні"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"праз праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
@@ -883,11 +883,22 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Налады"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Зразумела"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Дамп кучы SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> праграма</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> праграмы</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> праграм</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> праграмы</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Праграма \"<xliff:g id="APP">%1$s</xliff:g>\" выкарыстоўвае: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Праграмы выкарыстоўваюць: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Скасаваць"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one">Функцыю \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" выкарыстоўвае <xliff:g id="NUM_APPS_4">%1$d</xliff:g> праграма.</item>
+ <item quantity="few">Функцыю \"<xliff:g id="TYPE_3">%2$s</xliff:g>\" выкарыстоўваюць <xliff:g id="NUM_APPS_2">%1$d</xliff:g> праграмы.</item>
+ <item quantity="many">Функцыю \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" выкарыстоўваюць <xliff:g id="NUM_APPS_4">%1$d</xliff:g> праграм.</item>
+ <item quantity="other">Функцыю \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" выкарыстоўваюць <xliff:g id="NUM_APPS_4">%1$d</xliff:g> праграмы.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Падрабязнасці"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Праграма, якая выкарыстоўвае: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Праграмы, якія выкарыстоўваюць: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index e9effcf90c9f..6311127629a1 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Да се разреши ли отстраняването на грешки през USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Отпечатъкът на RSA ключа на компютъра е:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Винаги да се разрешава от този компютър"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отстраняването на грешки през USB не е разрешено"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Потребителят, който понастоящем е влязъл в това устройство, не може да включи функцията за отстраняване на грешки през USB. За да я използвате, превключете към основния потребител."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Мащаб – запълва екрана"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Разпъване – запълва екрана"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Екранна снимка"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Отказ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за помощно съобщение"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потвърждаване"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Нов опит"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Докоснете сензора за отпечатъци"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатък"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Търсим ви…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Слушалки"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Вход"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слухови апарати"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Обикновено отхвърляте тези известия. \nИскате ли да продължат да се показват?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Тези известия да продължат ли да се показват?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Спиране на известията"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Блокиране"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Да продължат да се показват"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Намаляване"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Показване без звук"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Показване на известията без звук"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Сигнализиране"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Продължаване на сигнализирането"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Да продължат ли да се показват известията от това приложение?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Тези известия не могат да бъдат изключени"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"чрез <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Настройки"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Разбрах"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> прилож.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> прилож.</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> използва <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Някои приложения използват <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Отказ"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложения използват <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> приложение използва <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Преглед на подробностите"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Приложение, което използва <xliff:g id="TYPES_LIST">%s</xliff:g> ви"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Приложения, които използват <xliff:g id="TYPES_LIST">%s</xliff:g> ви"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 0724e379a464..58678bafecf4 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB ডিবাগিং মঞ্জুর করবেন?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"কম্পিউটারের RSA কী আঙ্গুলের ছাপ হল:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"এই কম্পিউটার থেকে সর্বদা অনুমতি দিন"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ডিবাগিং অনুমোদিত নয়"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ব্যবহারকারী এখন এই ডিভাইসে সাইন-ইন করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, প্রাথমিক ব্যবহারকারীতে পাল্টে নিন।"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"স্ক্রীণ পূরণ করতে জুম করুন"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ফুল স্ক্রিন করুন"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্রিনশট নিন"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায়তার মেসেজ দেখানোর জায়গা"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"কনফার্ম করুন"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"আবার চেষ্টা করুন"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"আঙ্গুলের ছাপের সেন্সর স্পর্শ করুন"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"আঙ্গুলের ছাপের আইকন"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপনার জন্য খোঁজা হচ্ছে…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"অডিও"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"হেডসেট"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ইনপুট"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"হিয়ারিং এড"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"এই বিজ্ঞপ্তিগুলিকে আপনি সাধারণত বাতিল করেন। \nসেগুলি দেখতে চান?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"এই বিজ্ঞপ্তিগুলি পরেও দেখে যেতে চান?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"বিজ্ঞপ্তি বন্ধ করুন"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ব্লক করুন"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"দেখতে থাকুন"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"ছোট করে দিন"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"নিঃশব্দে দেখুন"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"বিজ্ঞপ্তি মিউট করুন"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"আমাকে জানানো হোক"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"বিজ্ঞপ্তি পান"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"এই অ্যাপের বিজ্ঞপ্তি পরেও দেখে যেতে চান?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"এই বিজ্ঞপ্তিগুলি বন্ধ করা যাবে না"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর মাধ্যমে"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"সেটিংস"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"বুঝেছি"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g>টি অ্যাপ</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>টি অ্যাপ</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> আপনার <xliff:g id="TYPES_LIST">%2$s</xliff:g> ব্যবহার করছে।"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"অ্যাপ্লিকেশনগুলি আপনার <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যবহার করছে।"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"বাতিল করুন"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টি অ্যাপ আপনার <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যবহার করছে।</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টি অ্যাপ আপনার <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যবহার করছে।</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"বিবরণ দেখুন"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"অ্যাপ আপনার <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যবহার করছে"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"অ্যাপ আপনার <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যবহার করছে"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 77429a0d074f..b2b2ee774f9e 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti otklanjanje grešaka putem uređaja spojenog na USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"RSA otisak prsta za otključavanje računara je: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dozvoli sa ovog računara"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje grešaka putem uređaja spojenog na USB nije dozvoljeno"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može uključiti opciju za otklanjanje grešaka koristeći USB. Da koristite tu funkciju, prebacite se na primarnog korisnika."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Uvećaj prikaz na ekran"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Razvuci prikaz na ekran"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Prostor za poruku za pomoć"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdite"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Pokušaj ponovo"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona za otisak prsta"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string>
@@ -297,8 +302,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalice"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ulaz"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni aparat"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Uključivanje…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Osvjetljenje"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatsko rotiranje"</string>
@@ -616,17 +620,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete ova obavještenja. \nNastaviti ih prikazivati?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Nastaviti prikazivanje ovih obavještenja?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Zaustavi obavještenja"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Nastavi prikazivanje"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimiziraj"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži bez zvuka"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Ostani u nečujnom načinu rada"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Upozori me"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Nastavi upozoravati"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Nastaviti prikazivanje obavještenja iz ove aplikacije?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ova obavještenja nije moguće isključiti"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"preko aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -878,11 +878,20 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Postavke"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Razumijem"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Izdvoji SysUI mem."</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> koristi <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije koriste <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Otkaži"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije koriste <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Prikaži detalje"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacija koristi odobrenja <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije koriste odobrenja <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 4e8e83327106..45ad5709554d 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Vols permetre la depuració per USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"L\'empremta digital de la clau RSA de l\'equip és:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Dona sempre permís des d\'aquest equip"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"No es permet la depuració per USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'usuari que té iniciada la sessió al dispositiu en aquest moment no pot activar la depuració per USB. Per utilitzar aquesta funció, cal canviar a l\'usuari principal."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom per omplir pantalla"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Estira per omplir pant."</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancel·la"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Àrea de missatge d\'ajuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirma"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Torna-ho a provar"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor d\'empremtes digitals"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona d\'empremta digital"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"S\'està cercant la teva cara…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Àudio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculars"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audiòfons"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"S\'està activant…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillantor"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Gira automàticament"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Normalment ignores aquestes notificacions. \nVols que es continuïn mostrant?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Vols continuar rebent aquestes notificacions?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Deixa d\'enviar notificacions"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloqueja"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continua rebent"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimitza"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostra de manera silenciosa"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continua silenciant"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Avisa\'m"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continua avisant-me"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vols continuar rebent notificacions d\'aquesta aplicació?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Aquestes notificacions no es poden desactivar"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"mitjançant <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Configuració"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"D\'acord"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Aboca espai de SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplicacions</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicació</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> està fent servir el següent: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Algunes aplicacions estan fent servir el següent: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel·la"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicacions estan fent servir: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicació està fent servir: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Mostra els detalls"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicació que fa servir: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicacions que fan servir: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 30bf1de14c57..3b3dc007c76a 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Povolit ladění přes USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Digitální otisk RSA počítače je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Vždy povolit z tohoto počítače"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ladění přes USB není povoleno"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Uživatel aktuálně přihlášený k tomuto zařízení nemůže zapnout ladění přes USB. Chcete-li tuto funkci použít, přepněte na primárního uživatele."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Přiblížit na celou obrazovku"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Na celou obrazovku"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Snímek obrazovky"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Zrušit"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast pro zprávu nápovědy"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdit"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Zkusit znovu"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotkněte se snímače otisků prstů"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hledáme vás…"</string>
@@ -298,8 +303,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Sluchátka"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vstup"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Naslouchátka"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Zapínání…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jas"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatické otáčení"</string>
@@ -617,17 +621,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Tato oznámení obvykle odmítáte. \nChcete je nadále zobrazovat?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Mají se tato oznámení nadále zobrazovat?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Přestat zobrazovat oznámení"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokovat"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Nadále zobrazovat"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimalizovat"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Zobrazovat tiše"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Nadále bez zvuku"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Upozornit"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Dál upozorňovat"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Mají se oznámení z této aplikace nadále zobrazovat?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Tato oznámení nelze deaktivovat"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"prostřednictvím aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavení"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Rozumím"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Výpis haldy SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikace</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikace</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikací</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikace</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikace <xliff:g id="APP">%1$s</xliff:g> využívá tato oprávnění: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikace využívají tato oprávnění: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Zrušit"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikace využívají tato oprávnění: <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikace využívá tato oprávnění: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikací využívá tato oprávnění: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikace využívá tato oprávnění: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Zobrazit podrobnosti"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikace používající vaše údaje: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikace používající vaše údaje: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index ad4afcff2b6c..118204e64fdf 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Vil du tillade USB-fejlretning?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Fingeraftrykket for computerens RSA-nøgle er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Tillad altid fra denne computer"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-fejlretning er ikke tilladt"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Den bruger, der i øjeblikket er logget ind på denne enhed, kan ikke aktivere USB-fejlretning. Skift til den primære bruger for at bruge denne funktion."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom til fuld skærm"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Stræk til fuld skærm"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Annuller"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område med hjælpemeddelelse"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekræft"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Prøv igen"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sæt fingeren på fingeraftrykslæseren"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeraftryk"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Forsøger at finde dig…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Lyd"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Høreapparater"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktiverer…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Lysstyrke"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Roter automatisk"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Du afviser som regel disse notifikationer. \nVil du blive ved med at se dem?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Vil du fortsætte med at se disse notifikationer?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stop notifikationer"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloker"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Fortsæt med at vise notifikationer"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimer"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Vis lydløst"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Fortsæt med lydløse notifikationer"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Underret mig"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsæt med at underrette"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsætte med at se notifikationer fra denne app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Disse notifikationer kan ikke deaktiveres"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Indstillinger"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Gem SysUI-heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> anvender enhedens <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps anvender enhedens <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Luk"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> app anvender din/dit <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> apps anvender din/dit <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Se info"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App, der anvender din/dit <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps, der anvender din/dit <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 0be730abcd9d..d91e678c15c5 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB-Debugging zulassen?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Der Fingerabdruck des RSA-Schlüssels für diesen Computer lautet: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Von diesem Computer immer zulassen"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-Debugging nicht zulässig"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Der momentan auf diesem Gerät angemeldete Nutzer kann das USB-Debugging nicht aktivieren. Um diese Funktion verwenden zu können, wechsle zum primären Nutzer."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom auf Bildschirmgröße"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Auf Bildschirmgröße anpassen"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Abbrechen"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bereich für die Hilfemeldung"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bestätigen"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Noch einmal versuchen"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Berühre den Fingerabdrucksensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerabdruck-Symbol"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Wir suchen nach dir…"</string>
@@ -300,8 +305,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Eingabe"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hörhilfen"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Wird aktiviert…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helligkeit"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatisch drehen"</string>
@@ -615,17 +619,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Normalerweise schließt du diese Benachrichtigungen. \nSollen sie trotzdem weiter angezeigt werden?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Diese Benachrichtigungen weiterhin anzeigen?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Benachrichtigungen nicht mehr anzeigen"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blockieren"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Weiterhin anzeigen"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimieren"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Ohne Ton anzeigen"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Weiter lautlos bleiben"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Benachrichtigung an mich"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Weiterhin Benachrichtigungen senden"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Benachrichtigungen dieser App weiterhin anzeigen?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Diese Benachrichtigungen können nicht deaktiviert werden"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"über <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -875,11 +875,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Einstellungen"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> Apps</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> App</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> verwendet gerade Folgendes: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps verwenden gerade Folgendes: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Abbrechen"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> Apps verwenden gerade: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> App verwendet gerade: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Details ansehen"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App, die <xliff:g id="TYPES_LIST">%s</xliff:g> verwendet"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps, die <xliff:g id="TYPES_LIST">%s</xliff:g> verwenden"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 7468b3a9bcce..52bcfce51482 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Να επιτρέπεται ο εντοπισμός σφαλμάτων USB;"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Το μοναδικό χαρακτηριστικό του κλειδιού RSA είναι:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Να επιτρέπεται πάντα από αυτόν τον υπολογιστή"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Δεν επιτρέπεται ο εντοπισμός σφαλμάτων USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ο χρήστης που είναι συνδεδεμένος αυτήν τη στιγμή σε αυτήν τη συσκευή δεν μπορεί να ενεργοποιήσει τον εντοπισμό σφαλμάτων USB. Για να χρησιμοποιήσετε αυτήν τη λειτουργία, κάντε εναλλαγή στον κύριο χρήστη."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Ζουμ σε πλήρη οθόνη"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Προβoλή σε πλήρη οθ."</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Στιγμιότυπο οθόνης"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Ακύρωση"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Περιοχή μηνυμάτων βοήθειας"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Επιβεβαίωση"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Δοκιμάστε ξανά"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Αγγίξτε τον αισθητήρα δακτυλικών αποτυπωμάτων"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Αναζήτηση για εσάς…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ήχος"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ακουστικά"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Είσοδος"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Βοηθήματα ακρόασης"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Συνήθως απορρίπτετε αυτές τις ειδοποιήσεις. \nΝα εξακολουθήσουν να εμφανίζονται;"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Να συνεχίσουν να εμφανίζονται αυτές οι ειδοποιήσεις;"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Διακοπή ειδοποιήσεων"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Αποκλεισμός"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Συνέχιση εμφάνισης"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Ελαχιστοποίηση"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Εμφάνιση σιωπηλά"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Διατήρηση σε σίγαση"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Να ειδοποιούμαι"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Να συνεχιστούν οι ειδοποιήσεις"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Να συνεχίσουν να εμφανίζονται ειδοποιήσεις από αυτήν την εφαρμογή;"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Αδύνατη η απενεργοποίηση αυτών των ειδοποιήσεων"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"μέσω <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Ρυθμίσεις"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Το κατάλαβα"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Στιγμ. μνήμης SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> εφαρμογές</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> εφαρμογή</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> χρησιμοποιεί τις λειτουργίες <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Οι εφαρμογές χρησιμοποιούν τις λειτουργίες <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Ακύρωση"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> εφαρμογές χρησιμοποιούν το <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> εφαρμογή χρησιμοποιεί το <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Προβολή λεπτομ."</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Εφαρμογή που χρησιμοποιεί τις λειτουργίες <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Εφαρμογές που χρησιμοποιούν τις λειτουργίες <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 703bc403c817..70208fb4a8b5 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Block"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 31fd04a32c36..308440315fe9 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Block"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 703bc403c817..70208fb4a8b5 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Block"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 703bc403c817..70208fb4a8b5 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Block"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index d53d61bbf7a4..0154c823c37c 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -57,8 +57,11 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‎‎‏‏‏‏‎‏‎Allow USB debugging?‎‏‎‎‏‎"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‎The computer\'s RSA key fingerprint is:‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="FINGERPRINT">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎Always allow from this computer‎‏‎‎‏‎"</string>
+ <string name="usb_debugging_allow" msgid="2272145052073254852">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‎Allow‎‏‎‎‏‎"</string>
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‎‎‏‎‏‎USB debugging not allowed‎‏‎‎‏‎"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‎‏‎The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user.‎‏‎‎‏‎"</string>
+ <string name="usb_contaminant_title" msgid="206854874263058490">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‎USB port disabled‎‏‎‎‏‎"</string>
+ <string name="usb_contaminant_message" msgid="2205845572186473860">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎You’ll be notified when it’s safe to use the USB port again.‎‏‎‎‏‎"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎Zoom to fill screen‎‏‎‎‏‎"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‎Stretch to fill screen‎‏‎‎‏‎"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎Screenshot‎‏‎‎‏‎"</string>
@@ -875,7 +878,7 @@
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="NUM_APPS_4">%1$d</xliff:g>‎‏‎‎‏‏‏‎ applications are using your ‎‏‎‎‏‏‎<xliff:g id="TYPE_5">%2$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎</item>
<item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="NUM_APPS_0">%1$d</xliff:g>‎‏‎‎‏‏‏‎ application is using your ‎‏‎‎‏‏‎<xliff:g id="TYPE_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎</item>
</plurals>
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎Cancel‎‏‎‎‏‎"</string>
+ <string name="ongoing_privacy_dialog_ok" msgid="3273300106348958308">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎Got it‎‏‎‎‏‎"</string>
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎View details‎‏‎‎‏‎"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎App using your ‎‏‎‎‏‏‎<xliff:g id="TYPES_LIST">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎Apps using your ‎‏‎‎‏‏‎<xliff:g id="TYPES_LIST">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 761acf6407b4..4ee40060bed1 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"¿Permitir depuración por USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"La huella digital de tu clave RSA es:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Permitir siempre desde esta computadora"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"No tienes permitida la depuración por USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"El usuario al que accediste en este dispositivo no puede activar la depuración por USB. Para usar esta función, debes cambiar al usuario principal."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom para ocupar la pantalla"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Estirar p/ ocupar la pantalla"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensajes de ayuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Volver a intentarlo"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícono de huella digital"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Autenticando tu rostro…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculares"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audífonos"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activando…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotación automática"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Sueles descartar estas notificaciones. \n¿Quieres seguir recibiéndolas?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"¿Quieres seguir viendo estas notificaciones?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Detener notificaciones"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Seguir viendo"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar sin emitir sonido"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Silenciar notificaciones"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Avisarme"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Seguir recibiendo alertas"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"¿Quieres seguir viendo las notificaciones de esta app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"No se pueden desactivar estas notificaciones"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"por medio de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Configuración"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Entendido"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Volcar pila de SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> está usando tu <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Hay aplicaciones que están usando tu <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicaciones están usando tu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicación está usando tu <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalles"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Una app está usando tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps que están usando tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 0b3ba5da32b0..446b6ac5c955 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"¿Permitir depuración por USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"La huella digital de tu clave RSA es:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Permitir siempre desde este ordenador"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuración USB no permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"El usuario con el que se ha iniciado sesión en este dispositivo no puede activar la depuración USB. Para utilizar esta función, inicia sesión con la cuenta de usuario principal."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom para ajustar"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Expandir para ajustar"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaje de ayuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Reintentar"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icono de huella digital"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscando tu cara…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculares"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audífonos"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activando…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automáticamente"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Normalmente ignoras estas notificaciones. \n¿Quieres seguir viéndolas?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"¿Quieres seguir viendo estas notificaciones?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Detener las notificaciones"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Seguir mostrando"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar en silencio"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Silenciar notificaciones"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Quiero recibir alertas"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Quiero seguir recibiendo alertas"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"¿Quieres seguir viendo las notificaciones de esta aplicación?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Estas notificaciones no se pueden desactivar"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"mediante <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Ajustes"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Entendido"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Volcar pila de SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> está usando tu <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Hay aplicaciones que usan tu <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicaciones están usando tu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicación está usando tu <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalles"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicación que usa tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicaciones que usan tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index e3182912a07f..080f206c707e 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Kas luban USB silumise?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Arvuti RSA-võtme sõrmejälg:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Luba alati sellest arvutist"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-silumine pole lubatud"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Sellesse seadmesse praegu sisse logitud kasutaja ei saa USB-silumist sisse lülitada. Selle funktsiooni kasutamiseks vahetage peamisele kasutajale."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Suumi ekraani täitmiseks"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Venita ekraani täitmiseks"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekraanipilt"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Tühista"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Abisõnumi ala"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kinnita"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Proovi uuesti"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Puudutage sõrmejäljeandurit"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sõrmejälje ikoon"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Otsitakse teid …"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Heli"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Peakomplekt"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Sisend"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Kuuldeaparaadid"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Sisselülitamine …"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Heledus"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automaatne pööramine"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Tavaliselt loobute nendest märguannetest. \nKas soovite neid jätkuvalt näidata?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Kas soovite nende märguannete kuvamist jätkata?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Peata märguanded"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokeeri"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Jätka kuvamist"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimeeri"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Kuva vaikselt"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Kuva helita"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Teavita mind"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Teavita ka edaspidi"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Kas jätkata selle rakenduse märguannete kuvamist?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Neid märguandeid ei saa välja lülitada"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> kaudu"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Seaded"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Selge"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> rakendust</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> rakendus</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> kasutab järgmisi: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Rakendused kasutavad järgmisi: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Tühista"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> rakendust kasutavad üksust <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> rakendus kasutab üksust <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Kuva üksikasjad"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Rakendus, mis kasutab üksusi <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Rakendused, mis kasutavad üksusi <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 5b9f0cfcad40..8d62bcf32cdf 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB arazketa onartu?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Ordenagailuaren RSA gakoaren erreferentzia-gako digitala hau da:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Onartu beti ordenagailu honetatik"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ez da onartzen USB arazketa"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Gailu honetan saioa hasita duen erabiltzaileak ezin du aktibatu USB arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Handiagotu pantaila betetzeko"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Luzatu pantaila betetzeko"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Pantaila-argazkia"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Utzi"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Laguntza-mezuaren eremua"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Berretsi"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Saiatu berriro"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sakatu hatz-marken sentsorea"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Hatz-markaren ikonoa"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Zure bila…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audioa"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Entzungailua"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Sarrera"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audiofonoak"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktibatzen…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Distira"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Biratze automatikoa"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Baztertu egin ohi dituzu jakinarazpen hauek. \nHaiek erakusten jarraitzea nahi duzu?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Jakinarazpenak erakusten jarraitzea nahi duzu?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Blokeatu jakinarazpenak"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokeatu"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Jarraitu erakusten"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizatu"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Erakutsi soinurik egin gabepen"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Jarraitu isilik"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Bidali jakinarazpenak"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Jarraitu jakinarazpenak bidaltzen"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Aplikazio honen jakinarazpenak erakusten jarraitzea nahi duzu?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Jakinarazpen hauek ezin dira desaktibatu"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren bidez"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Ezarpenak"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Ados"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikazio</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikazio</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="TYPES_LIST">%2$s</xliff:g> erabiltzen ari da."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikazio batzuk <xliff:g id="TYPES_LIST">%s</xliff:g> erabiltzen ari dira."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Utzi"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikazio ari dira <xliff:g id="TYPE_5">%2$s</xliff:g> erabiltzen.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikazio ari da <xliff:g id="TYPE_1">%2$s</xliff:g> erabiltzen.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ikusi datuak"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> erabiltzen ari den aplikazioa"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> erabiltzen ari diren aplikazioak"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index e89f90629988..035c6f3e080a 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"‏اشکال‌زدایی USB مجاز است؟"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"‏اثر انگشت کلید RSA رایانه: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"همیشه از این رایانه انجام شود"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‏اشکال‌زدایی USB مجاز نیست"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‏کاربری که درحال حاضر در این دستگاه وارد سیستم شده است نمی‌تواند اشکال‌زدایی USB را روشن کند. برای استفاده از این قابلیت، به کاربر اصلی تغییر وضعیت دهید."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"بزرگ‌نمایی برای پر کردن صفحه"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"گسترده کردن برای پر کردن صفحه"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"عکس صفحه‌نمایش"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"لغو"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"بخش پیام راهنما"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأیید"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"امتحان مجدد"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"حسگر اثر انگشت را لمس کنید"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"نماد اثر انگشت"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"درحال جستجوی شما…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"صوت"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"هدست"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ورودی"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"سمعک"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"معمولاً این اعلان‌ها را رد می‌کنید. \nهمچنان نشان داده شود؟"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"نمایش این اعلان‌ها ادامه یابد؟"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"توقف اعلان‌ها"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"مسدود کردن"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"همچنان نشان داده شود"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"کوچک کردن"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"نمایش به‌صورت بی‌صدا"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"بی‌صدا بماند"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"به من اطلاع داده شود"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"همچنان اطلاع داده شود"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"نمایش اعلان از این برنامه ادامه یابد؟"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"نمی‌توان این اعلان‌ها را خاموش کرد"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"ازطریق <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"تنظیمات"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"متوجه شدم"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> برنامه</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> برنامه</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> از <xliff:g id="TYPES_LIST">%2$s</xliff:g> شما استفاده می‌کند."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"برنامه‌ها از <xliff:g id="TYPES_LIST">%s</xliff:g> شما استفاده می‌‌کنند."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"لغو"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> برنامه درحال استفاده از <xliff:g id="TYPE_5">%2$s</xliff:g> شما است.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> برنامه درحال استفاده از <xliff:g id="TYPE_5">%2$s</xliff:g> شما است.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"مشاهده جزئیات"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"برنامه‌ای که از <xliff:g id="TYPES_LIST">%s</xliff:g> شما استفاده می‌کند"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"برنامه‌هایی که از <xliff:g id="TYPES_LIST">%s</xliff:g> شما استفاده می‌کنند"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 931def7ee582..c2ccd993c4c1 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Sallitaanko USB-vianetsintä?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Tietokoneen RSA-avaintunnistetiedosto on:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Salli aina tällä tietokoneella"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-vianetsintää ei sallita"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Laitteelle tällä hetkellä kirjautunut käyttäjä ei voi ottaa USB-vianetsintää käyttöön. Vaihda käyttäjäksi ensisijainen käyttäjä, jotta voit käyttää tätä ominaisuutta."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoomaa koko näyttöön"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Venytä koko näyttöön"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Kuvakaappaus"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Peruuta"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Ohjeviestialue"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Vahvista"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Yritä uudelleen"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Kosketa sormenjälkitunnistinta"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sormenjälkikuvake"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Etsitään kasvoja…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ääni"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Syöttölaite"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Kuulolaitteet"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Otetaan käyttöön…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kirkkaus"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automaattinen kääntö"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Hylkäät yleensä nämä ilmoitukset. \nHaluatko, että niitä näytetään myös jatkossa?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Jatketaanko näiden ilmoitusten näyttämistä?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Lopeta ilmoitukset"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Estä"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Jatka näyttämistä"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Pienennä"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Näytä ilman ääntä"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Jatka äänettömyyttä"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Hälytä"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Jatka ilmoituksista hälyttämistä"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Jatketaanko ilmoitusten näyttämistä tästä sovelluksesta?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Näitä ilmoituksia ei voi poistaa käytöstä"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Asetukset"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Selvä"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Luo SysUI-keon vedos"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> sovellusta</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> sovellus</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> käyttää ominaisuuksia (<xliff:g id="TYPES_LIST">%2$s</xliff:g>)."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"<xliff:g id="TYPES_LIST">%s</xliff:g> ovat sovellusten käytössä."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Peruuta"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> on <xliff:g id="NUM_APPS_4">%1$d</xliff:g> sovelluksen käytössä.</item>
+ <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> on <xliff:g id="NUM_APPS_0">%1$d</xliff:g> sovelluksen käytössä.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Näytä tiedot"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Sovellus, jolla on <xliff:g id="TYPES_LIST">%s</xliff:g> ‑käyttöoikeus"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Sovellukset, joilla on <xliff:g id="TYPES_LIST">%s</xliff:g> ‑käyttöoikeus"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index d1412aafe076..98e64894c17d 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Autoriser le débogage USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Empreinte numérique de la clé RSA de l\'ordinateur : \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Débogage USB non autorisé"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Capture d\'écran"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Annuler"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Réessayer"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touchez le capteur d\'empreintes digitales"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Écouteurs"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Prothèses auditives"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activation en cours…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Vous ignorez habituellement ces notifications. \nSouhaitez-vous continuer à les afficher?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Continuer à afficher ces notifications?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Arrêter les notifications"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloquer"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuer à afficher"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Réduire"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Afficher en silence"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuer d\'util. mode silencieux"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"M\'alerter"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuer d\'envoyer des alertes"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer à afficher les notifications de cette application?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Paramètres"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Capturer mémoire SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> application</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> applications</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> utilise votre <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Des applications utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annuler"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> application utilise votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications utilisent votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Afficher détails"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Application qui utilise votre <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Applications qui utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 8ba575bcd3ca..1233bbee15a2 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Autoriser le débogage USB ?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Empreinte numérique de la clé RSA de l\'ordinateur : \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Débogage USB non autorisé"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Capture d\'écran"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Annuler"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Réessayer"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Appuyez sur le lecteur d\'empreinte digitale"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Casque"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Appareils auditifs"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activation…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Vous ignorez généralement ces notifications. \nSouhaitez-vous continuer de les recevoir ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Continuer d\'afficher ces notifications ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Arrêter les notifications"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloquer"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuer d\'afficher les notifications"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Réduire"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Affichage silencieux"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Notifications silencieuses"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"M\'avertir"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuer de m\'avertir"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer d\'afficher les notifications de cette application ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Paramètres"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Copier mémoire SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> application</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> applications</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> utilise votre <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Des applications utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annuler"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> application utilise votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications utilisent votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Voir les détails"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Application utilisant votre/vos <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Applications utilisant votre/vos <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 2784567e3797..38554d1f1eea 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuración de erros de USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"A impresión dixital da clave de RSA do ordenador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Permitir sempre desde este ordenador"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Non se permite a depuración por USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O usuario coa sesión iniciada actualmente neste dispositivo non pode activar a depuración por USB. Para utilizar esta función, cambia ao usuario principal."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Ampliar ata ocupar todo"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Estirar ata ocupar todo"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaxes de axuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar de novo"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca o sensor de impresión dixital"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona de impresión dixital"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscándote…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculares"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audiófonos"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activando…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Xirar automaticamente"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Ignoras estas notificacións a miúdo. \nQueres seguir recibíndoas?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Queres seguir mostrando estas notificacións?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Deter notificacións"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando notificacións"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar en silencio"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Notificacións silenciosas"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Recibir notificacións"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar recibindo notificacións"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Queres seguir mostrando as notificacións desta aplicación?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Non se poden desactivar estas notificacións"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"mediante <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Configuración"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"De acordo"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Baleirar mont. SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplicacións</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicación</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> está utilizando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Hai aplicacións que están utilizando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicacións utilizan o teu dispositivo (<xliff:g id="TYPE_5">%2$s</xliff:g>).</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicación utiliza o teu dispositivo (<xliff:g id="TYPE_1">%2$s</xliff:g>).</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalles"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicación que utiliza o seguinte: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicacións que utilizan o seguinte: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index f17a7f611fd0..878d0b91967f 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB ડિબગિંગને મંજૂરી આપીએ?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"કમ્પ્યુટરની RSA મુખ્ય ફિંગરપ્રિંટ આ છે:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"હંમેશા આ કમ્પ્યુટરથી મંજૂરી આપો"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ડીબગિંગની મંજૂરી નથી"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"હાલમાં આ ઉપકરણમાં સાઇન ઇન થયેલ વપરાશકર્તા USB ડિબગીંગ ચાલુ કરી શકતા નથી. આ સુવિધાનો ઉપયોગ કરવા માટે પ્રાથમિક વપરાશકર્તા પર સ્વિચ કરો."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"સ્ક્રીન ભરવા માટે ઝૂમ કરો"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"સ્ક્રીન ભરવા માટે ખેંચો"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"સ્ક્રીનશૉટ"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"રદ કરો"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"સહાય સંદેશનું ક્ષેત્ર"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"કન્ફર્મ કરો"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ફરી પ્રયાસ કરો"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ફિંગરપ્રિન્ટનું આઇકન"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"તમારા માટે શોધી રહ્યાં છે..."</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ઑડિઓ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"હૅડસેટ"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ઇનપુટ"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"શ્રવણ યંત્રો"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"તમે સામાન્ય રીતે આ નોટીફિકેશનને છોડી દો છો. \nતેમને બતાવવાનું ચાલુ રાખીએ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"આ નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"નોટિફિકેશન બંધ કરો"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"બ્લૉક કરો"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"બતાવવાનું ચાલુ રાખો"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"નાનું કરો"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"સાઇલન્ટલી બતાવો"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"સાઇલન્ટ મોડ ચાલુ રાખો"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"મને અલર્ટ બતાવો"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"અલર્ટ કરવાનું ચાલુ રાખો"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"આ ઍપમાંથી નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"આ નોટિફિકેશન બંધ કરી શકશો નહીં"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> મારફતે"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"સેટિંગ"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"સમજાઈ ગયું"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ઍપ</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ઍપ</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ઍપ તમારા <xliff:g id="TYPES_LIST">%2$s</xliff:g>નો ઉપયોગ કરી રહી છે."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ઍપ્લિકેશન તમારા <xliff:g id="TYPES_LIST">%s</xliff:g>નો ઉપયોગ કરી રહી છે."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"રદ કરો"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ઍપ્લિકેશન તમારા <xliff:g id="TYPE_5">%2$s</xliff:g>નો ઉપયોગ કરી રહી છે.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ઍપ્લિકેશનો તમારા <xliff:g id="TYPE_5">%2$s</xliff:g>નો ઉપયોગ કરી રહી છે.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"વિગતો જુઓ"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"અ‍ૅપ તમારા <xliff:g id="TYPES_LIST">%s</xliff:g>નો ઉપયોગ કરી રહી છે"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"અ‍ૅપ તમારા <xliff:g id="TYPES_LIST">%s</xliff:g>નો ઉપયોગ કરી રહી છે"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 1c6991049b1f..96c6f6ea6d3f 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB डीबगिंग करने दें?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"कंप्यूटर का RSA कुंजी फ़िंगरप्रिंट है:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"इस कंप्यूटर से हमेशा अनुमति दें"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डीबगिंग की अनुमति नहीं है"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"अभी इस डिवाइस में जिस उपयोगकर्ता ने साइन इन किया है, वो USB डीबगिंग चालू नहीं कर सकता. इस सुविधा का इस्तेमाल करने के लिए, प्राथमिक उपयोगकर्ता में बदलें."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"स्‍क्रीन भरने के लिए ज़ूम करें"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"स्‍क्रीन भरने के लिए खींचें"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रीनशॉट"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"रद्द करें"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"सहायता का मैसेज दिखाने की जगह"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि करें"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"फिर से कोशिश करें"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फ़िंगरप्रिंट सेंसर को छुएं"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फ़िंगरप्रिंट आइकॉन"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"आपको पहचान रहा है…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ऑडियो"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"हेडसेट"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"इनपुट"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"सुनने में मददगार डिवाइस"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"अाप अक्सर इन सूचनाओं को खारिज कर देते हैं. \nआगे भी इन्हें देखना जारी रखना चाहते हैं?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"ये सूचनाएं दिखाना जारी रखें?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"सूचनाएं दिखाना बंद करें"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ब्लॉक करें"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"दिखाना जारी रखें"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"सूचनाएं छोटी करें"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"बिना आवाज़ के दिखाएं"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"साइलेंट मोड में सूचनाएं पाएं"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"मुझे सूचना दें"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सूचना देना जारी रखें"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"इस ऐप्लिकेशन से जुड़ी सूचनाएं दिखाना जारी रखें?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ये सूचनाएं दिखाया जाना बंद नहीं किया जा सकता"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> के ज़रिए"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"सेटिंग"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"ठीक है"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ऐप्लिकेशन</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ऐप्लिकेशन</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> आपकी <xliff:g id="TYPES_LIST">%2$s</xliff:g> का इस्तेमाल कर रहा है."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ऐप्लिकेशन आपकी <xliff:g id="TYPES_LIST">%s</xliff:g> का इस्तेमाल कर रहे हैं."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"रद्द करें"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ऐप्लिकेशन आपके <xliff:g id="TYPE_5">%2$s</xliff:g> का इस्तेमाल कर रहे हैं.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ऐप्लिकेशन आपके <xliff:g id="TYPE_5">%2$s</xliff:g> का इस्तेमाल कर रहे हैं.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"विवरण देखें"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> का इस्तेमाल कर रहा ऐप्लिकेशन"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"आपके <xliff:g id="TYPES_LIST">%s</xliff:g> का इस्तेमाल कर रहे ऐप्लिकेशन"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 8f3a11b63ec9..17e1cc3a1193 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti otklanjanje pogrešaka putem USB-a?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Otisak prsta RSA ključa računala je: \n <xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dopusti s ovog računala"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje pogrešaka putem USB-a nije dopušteno"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutačno prijavljen na ovaj uređaj ne može uključiti otklanjanje pogrešaka putem USB-a. Da biste upotrebljavali tu značajku, prijeđite na primarnog korisnika."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zumiraj i ispuni zaslon"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Rastegni i ispuni zaslon"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Snimka zaslona"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Odustani"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Područje poruke za pomoć"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Pokušaj ponovo"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor otiska prsta"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string>
@@ -297,8 +302,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalice"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Unos"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni aparati"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Uključivanje…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Svjetlina"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatsko izmjenjivanje"</string>
@@ -614,17 +618,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete te obavijesti. \nŽelite li da se nastave prikazivati?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Želite li da se obavijesti nastave prikazivati?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Zaustavi obavijesti"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Nastavi prikazivati"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimiziraj"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži tiho"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Nastavi tiho"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Obavijesti me"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Nastavi obavještavati"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite li da se obavijesti te aplikacije nastave prikazivati?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Te se obavijesti ne mogu isključiti"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"putem aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Postavke"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Shvaćam"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Izdvoji mem. SysUI-a"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> upotrebljava <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije upotrebljavaju <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Odustani"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija upotrebljava <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije upotrebljavaju <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija upotrebljava <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Prikaži detalje"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacije koje upotrebljavaju <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije koje upotrebljavaju <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 49d923a2247a..6e142005168f 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Engedélyezi az USB hibakeresést?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"A számítógép RSA kulcs ujjlenyomata:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Mindig engedélyezze erről a számítógépről"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Az USB hibakeresése nem engedélyezett"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Az eszközre jelenleg bejelentkezett felhasználó nem engedélyezheti az USB-hibakeresést. A funkció használatához váltson az elsődleges felhasználóra."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Nagyítás a kitöltéshez"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Nyújtás kitöltéshez"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Képernyőkép"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Mégse"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Súgószöveg területe"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Megerősítés"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Újrapróbálkozás"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Érintse meg az ujjlenyomat-érzékelőt"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ujjlenyomat ikonja"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Keresem az Ön arcát…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Hang"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Bevitel"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hallókészülékek"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Bekapcsolás…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Fényerő"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatikus elforgatás"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Általában elveti ezeket az értesítéseket.\nSzeretné, hogy továbbra is megjelenjenek?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Továbbra is megjelenjenek ezek az értesítések?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Értesítések letiltása"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Tiltás"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Megjelenítés továbbra is"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Kis méret"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Megjelenítés hang nélkül"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Néma megjelenítés"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Értesítsen"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Értesítések folytatása"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Továbbra is megjelenjenek az alkalmazás értesítései?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ezeket az értesítéseket nem lehet kikapcsolni"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás használatával"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Beállítások"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Értem"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI-memória-kiírás"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> alkalmazás</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> alkalmazás</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"A(z) <xliff:g id="APP">%1$s</xliff:g> használja a következőket: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Több alkalmazás használja a következőket: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Mégse"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> alkalmazás használja a következőt: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> alkalmazás használja a következőt: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Részletek"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"A következőket használó alkalmazás: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"A következőt használó alkalmazások: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index dc592c526597..37512e67ebd7 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Թույլատրե՞լ USB-ի կարգաբերումը:"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Համակարգչի RSA-ի բանալի մատնահետքն է`\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Միշտ թույլատրել այս համակարգչից"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB վրիպազերծումը արգելված է"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ընթացիկ հաշվի օգտատերը չի կարող միացնել USB վրիպազերծումը: Այս գործառույթը միացնելու համար մուտք գործեք հիմնական օգտատիրոջ հաշվով:"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Խոշորացնել` էկրանը լցնելու համար"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Ձգել` էկրանը լցնելու համար"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Սքրինշոթ"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Չեղարկել"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Օգնության հաղորդագրության դաշտ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Հաստատել"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Նորից փորձել"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Հպեք մատնահետքերի սկաներին"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Մատնահետքի պատկերակ"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Դեմքի ճանաչում…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Աուդիո"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ականջակալ"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Մուտքագրում"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Լսողական ապարատ"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Դուք սովորաբար փակում եք այս ծանուցումները: \nՇարունակե՞լ ցուցադրել դրանք:"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Ցուցադրե՞լ այս ծանուցումները։"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Չցուցադրել ծանուցումներ"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Արգելափակել"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Ցուցադրել"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Ծալել"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Ցույց տալ անձայն"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Չմիացնել ձայնը"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Ծանուցել ինձ"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Ծանուցել"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Ցուցադրե՞լ ծանուցումներ այս հավելվածից։"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Այս ծանուցումները հնարավոր չէ անջատել"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի միջոցով"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Կարգավորումներ"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Եղավ"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> հավելված</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> հավելված</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> հավելվածն օգտագործում է ձեր <xliff:g id="TYPES_LIST">%2$s</xliff:g>:"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Հավելվածներն օգտագործում են ձեր <xliff:g id="TYPES_LIST">%s</xliff:g>:"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Չեղարկել"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one">Ձեր սարքում <xliff:g id="NUM_APPS_4">%1$d</xliff:g> հավելված օգտագործում է <xliff:g id="TYPE_5">%2$s</xliff:g>։</item>
+ <item quantity="other">Ձեր սարքում <xliff:g id="NUM_APPS_4">%1$d</xliff:g> հավելված օգտագործում է <xliff:g id="TYPE_5">%2$s</xliff:g>:</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Մանրամասն"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Հավելված, որն օգտագործում է <xliff:g id="TYPES_LIST">%s</xliff:g> ձեր սարքում"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Հավելվածներ, որոնք օգտագործում են <xliff:g id="TYPES_LIST">%s</xliff:g> ձեր սարքում"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 1b43e658b418..9d49bdca1819 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Izinkan debugging USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Sidik jari kunci RSA komputer adalah:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Selalu izinkan dari komputer ini"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debug USB tidak diizinkan"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Pengguna yang sedang login ke perangkat ini tidak dapat mengaktifkan proses debug USB. Beralihlah ke pengguna utama untuk menggunakan fitur ini."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Perbesar utk mengisi layar"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Rentangkn utk mngisi layar"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Batal"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area pesan bantuan"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmasi"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Coba lagi"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh sensor sidik jari"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon sidik jari"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari wajah Anda…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Masukan"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Alat Bantu Dengar"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Mengaktifkan…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kecerahan"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotasi otomatis"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Anda biasanya menutup notifikasi ini. \nTerus tampilkan?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Terus tampilkan notifikasi ini?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Hentikan notifikasi"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokir"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Terus tampilkan"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Perkecil"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Tampilkan tanpa suara"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Tetap nonaktif"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Beri tahu saya"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Terus beri tahu"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Terus tampilkan notifikasi dari aplikasi ini?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Notifikasi ini tidak dapat dinonaktifkan"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"melalui <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Setelan"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Hapus Heap SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikasi</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikasi</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> menggunakan <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikasi menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Batal"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikasi menggunakan <xliff:g id="TYPE_5">%2$s</xliff:g> Anda.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikasi menggunakan <xliff:g id="TYPE_1">%2$s</xliff:g> Anda.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Lihat detail"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikasi yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> Anda"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikasi yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> Anda"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 36b557d83994..0cc367b5a814 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Leyfa USB-villuleit?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Fingrafar RSA-lykils tölvunnar er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Leyfa alltaf úr þessari tölvu"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-villuleit ekki leyfð"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Notandinn sem er skráður inn í þetta tæki núna getur ekki kveikt á USB-villuleit. Til þess að nota þennan eiginleika skaltu skipta yfir í aðalnotandann."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Fylla skjá með aðdrætti"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Teygja yfir allan skjáinn"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skjámynd"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Hætta við"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Svæði hjálparskilaboða"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Staðfesta"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Reyna aftur"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Snertu fingrafaralesarann"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingrafaratákn"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Leitar að þér ..."</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Hljóð"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Höfuðtól"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Inntak"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Heyrnartæki"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Kveikir…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Birtustig"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Sjálfvirkur snúningur"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Þú hunsar yfirleitt þessar tilkynningar. \nViltu halda áfram að fá þær?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Sýna áfram þessar tilkynningar?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stöðva tilkynningar"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Loka á"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Sýna áfram"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minnka"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Sýna án hljóðs"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Áfram hljóðlaust"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Láta mig vita"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Halda áfram að gera viðvart"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Sýna áfram tilkynningar frá þessu forriti?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ekki er hægt að slökkva á þessum tilkynningum"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"með <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Stillingar"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Ég skil"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Vista SysUI-gögn"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> forrit</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> forrit</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> er að nota <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Forrit eru að nota <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Hætta við"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> forrit er að nota <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> forrit eru að nota <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Sjá nánar"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Forrit sem nota <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Forrit sem nota <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 21c259a7588e..27998bf92fde 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Consentire debug USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Fingerprint della chiave RSA del computer: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Consenti sempre da questo computer"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debug USB non consentito"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utente che ha eseguito l\'accesso a questo dispositivo non può attivare il debug USB. Per utilizzare questa funzione, passa all\'utente principale."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom per riempire schermo"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Estendi per riemp. schermo"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Annulla"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area dei messaggi di assistenza"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confermo"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Riprova"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tocca il sensore di impronte digitali"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona dell\'impronta digitale"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"In attesa del volto…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auricolare"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ingresso"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Apparecchi acustici"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Attivazione…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosità"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotazione automatica"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"In genere ignori queste notifiche. \nVuoi continuare a riceverle?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Continuare a ricevere queste notifiche?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Interrompi la ricezione di notifiche"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blocca"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continua a mostrare"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Riduci a icona"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostra silenziosamente"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continua con notifiche silenziose"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Avvisami"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continua ad avvisare"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuare a ricevere notifiche da questa app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Queste notifiche non possono essere disattivate"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"tramite <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Impostazioni"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Esegui dump heap SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"L\'app <xliff:g id="APP">%1$s</xliff:g> sta usando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Le app stanno usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annulla"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applicazioni stanno utilizzando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> applicazione sta utilizzando <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Vedi dettagli"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App che usa <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"App che utilizzano <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index d43551d214a8..71cf575718e5 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"‏האם לאפשר ניפוי באגים ב-USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"‏טביעת האצבע של מפתח ה-RSA של המחשב היא:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"אפשר תמיד ממחשב זה"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‏לא ניתן לבצע ניפוי באגים ב-USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‏למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"הגדל תצוגה כדי למלא את המסך"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"מתח כדי למלא את המסך"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"צילום מסך"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"ביטול"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"אזור הודעת עזרה"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"אישור"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ניסיון נוסף"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"יש לגעת בחיישן טביעות האצבע"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"סמל טביעת אצבע"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"מחפש אותך…"</string>
@@ -298,8 +303,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"אודיו"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"אוזניות"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"קלט"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"מכשירי שמיעה"</string>
<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>
@@ -617,17 +621,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"הודעות אלה בדרך כלל נדחות על ידיך. \nלהמשיך להציג אותן?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"שנמשיך להציג לך את ההודעות האלה?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"לא, אל תמשיכו"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"חסימה"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"כן, המשיכו"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"מזעור"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"הצגה ללא צליל"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"בשקט"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"אבקש התראה"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"המשך שליחת התראות"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"שנמשיך להציג לך הודעות מהאפליקציה הזאת?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"לא ניתן לכבות את ההודעות האלה"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"באמצעות <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"הגדרות"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"הבנתי"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"‏ערימת Dump SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="two"><xliff:g id="NUM_APPS_2">%d</xliff:g> אפליקציות</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> אפליקציות</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> אפליקציות</item>
+ <item quantity="one">אפליקציה אחת (<xliff:g id="NUM_APPS_0">%d</xliff:g>)</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> משתמשת ב<xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"אפליקציות משתמשות ב<xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ביטול"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="two"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> אפליקציות משתמשות ב<xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> אפליקציות משתמשות ב<xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> אפליקציות משתמשות ב<xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one">אפליקציה אחת (<xliff:g id="NUM_APPS_0">%1$d</xliff:g>) משתמשת ב<xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"הצגת פרטים"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"האפליקציה משתמשת ב<xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"אפליקציות משתמשות ב<xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index ff88a0db6555..2430500e2a0a 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USBデバッグを許可しますか?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"このパソコンのRSAキーのフィンガープリント:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"このパソコンからのUSBデバッグを常に許可する"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBデバッグは許可されていません"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"この端末に現在ログインしているユーザーでは、USB デバッグを ON にすることはできません。この機能を使用するには、メインユーザーに切り替えてください。"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"画面サイズに合わせて拡大"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"画面サイズに合わせて拡大"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"スクリーンショット"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"キャンセル"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ヘルプ メッセージ領域"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"再試行"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"指紋認証センサーをタップしてください"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋アイコン"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"顔を認証しています…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"オーディオ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ヘッドセット"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"入力"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"補聴器"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ON にしています…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"画面の明るさ"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自動回転"</string>
@@ -595,7 +599,7 @@
<string name="enable_bluetooth_title" msgid="5027037706500635269">"BluetoothをONにしますか?"</string>
<string name="enable_bluetooth_message" msgid="9106595990708985385">"タブレットでキーボードに接続するには、最初にBluetoothをONにする必要があります。"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ONにする"</string>
- <string name="show_silently" msgid="6841966539811264192">"通知をマナーモードで表示する"</string>
+ <string name="show_silently" msgid="6841966539811264192">"通知をポップアップで知らせる"</string>
<string name="block" msgid="2734508760962682611">"通知をすべてブロックする"</string>
<string name="do_not_silence" msgid="6878060322594892441">"音声で知らせる"</string>
<string name="do_not_silence_block" msgid="4070647971382232311">"音声で知らせる / ブロックしない"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"通常、この通知はスワイプして非表示にしています。\n今後も表示しますか?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"この通知を今後も表示しますか?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"通知を表示しない"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ブロック"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"今後も表示する"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
- <string name="inline_silent_button_silent" msgid="4411510650503783646">"サイレント モードで表示"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_silent" msgid="4411510650503783646">"ポップアップで知らせる"</string>
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"音なしで通知"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"アラートを設定"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"今後もアラートを受け取る"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"このアプリからの通知を今後も表示しますか?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"この通知を OFF にすることはできません"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> 経由"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ヒープのダンプ"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>個のアプリ</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g>個のアプリ</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>は<xliff:g id="TYPES_LIST">%2$s</xliff:g>を使用しています。"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"アプリは<xliff:g id="TYPES_LIST">%s</xliff:g>を使用しています。"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"キャンセル"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> 個のアプリが <xliff:g id="TYPE_5">%2$s</xliff:g> を使用しています。</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> 個のアプリが <xliff:g id="TYPE_1">%2$s</xliff:g> を使用しています。</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"詳細を表示"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g>を使用しているアプリ"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g>を使用しているアプリ"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index e1ee20eb12ba..40f13039f4c5 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"გააქტიურდეს USB გამართვა?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"კომპიუტერის RSA გასაღების თითის ანაბეჭდია:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ყოველთვის დართე ნება ამ კომპიუტერიდან."</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ხარვეზების გამართვა ნებადართული არაა"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ამ მოწყობილობაზე ამჟამად შესულ მომხმარებელს არ შეუძლია USB ხარვეზების გამართვის ფუნქციის ჩართვა. ამ ფუნქციის გამოსაყენებლად, მიუერთდით მთავარ მომხმარებელს."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"მასშტაბი შეცვალეთ ეკრანის შესავსებად."</string>
<string name="compat_mode_off" msgid="4434467572461327898">"გაწიეთ ეკრანის შესავსებად."</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ეკრანის ანაბეჭდი"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"გაუქმება"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"დამხმარე შეტყობინების არე"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"დადასტურება"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ხელახლა ცდა"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"შეეხეთ თითის ანაბეჭდის სენსორს"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"თითის ანაბეჭდის ხატულა"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"მიმდინარეობს თქვენი ძიება…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"აუდიო"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ყურსაცვამი"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"შეყვანა"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"სმენის მოწყობილობები"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"როგორც წესი, თქვენ ასეთ შეტყობინებებს ხურავთ. \nგსურთ მათი ჩვენების გაგრძელება?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"გაგრძელდეს ამ შეტყობინებათა ჩვენება?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"შეტყობინებების შეწყვეტა"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"დაბლოკვა"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"ჩვენების გაგრძელება"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"ჩაკეცვა"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"უხმოდ ჩვენება"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"კვლავ ჩუმად ჩვენება"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"გაფრთხილების მიღება"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"გაფრთხილების გაგრძელება"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"გაგრძელდეს შეტყობინებათა ჩვენება ამ აპიდან?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ამ შეტყობინებათა გამორთვა ვერ მოხერხდება"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-დან"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"პარამეტრები"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"გასაგებია"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI გროვის გამოტანა"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> აპი</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> აპი</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>-ის მიერ გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"აპლიკაციების მიერ გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"გაუქმება"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other">თქვენი <xliff:g id="TYPE_5">%2$s</xliff:g> გამოიყენება <xliff:g id="NUM_APPS_4">%1$d</xliff:g> აპლიკაციის მიერ.</item>
+ <item quantity="one">თქვენი <xliff:g id="TYPE_1">%2$s</xliff:g> გამოიყენება <xliff:g id="NUM_APPS_0">%1$d</xliff:g> აპლიკაციის მიერ.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"დეტალების ნახვა"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"აპი, რომლის მიერაც გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"აპები, რომელთა მიერაც გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 41ef3e29888b..b00c560688ba 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB жөндеуге рұқсат берілсін бе?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Бұл компьютердің RSA перне саусақ таңбасы:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Осы компьютерден әрқашан рұқсат беру"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB жөндеу рұқсат етілмеген"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Бұл құрылғыға жаңа кірген пайдаланушы USB түзетуін іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Экранды толтыру үшін ұлғайту"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Экранды толтыру үшін созу"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Бас тарту"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Анықтама хабары аумағы"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Растау"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Қайталап көріңіз"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Саусақ ізін оқу сканерін түртіңіз"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Саусақ ізі белгішесі"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Бет ізделуде…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Aудио"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнитура"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Кіріс"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Есту аппараттары"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Әдетте хабарландыруларды көрмейсіз. \nОлар көрсетілсін бе?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Хабарландырулар көрсетілсін бе?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Хабарландыруларға тыйым салу"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Бөгеу"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Көрсету"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Жасыру"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Дыбыссыз көрсету"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Хабарландырулар алғым келмейді"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Хабарландырулар алғым келеді"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Хабарландырулар келе берсін"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Осы қолданбаның хабарландырулары көрсетілсін бе?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Хабарландыруларды өшіру мүмкін емес"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> арқылы"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Параметрлер"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Түсінікті"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> қолданба</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> қолданба</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> қолданбасында <xliff:g id="TYPES_LIST">%2$s</xliff:g> пайдалануда."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Қолданбаларда <xliff:g id="TYPES_LIST">%s</xliff:g> пайдаланылуда."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Бас тарту"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> опциясын <xliff:g id="NUM_APPS_4">%1$d</xliff:g> қолданба пайдаланып жатыр.</item>
+ <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> опциясын <xliff:g id="NUM_APPS_0">%1$d</xliff:g> қолданба пайдаланып жатыр.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Мәліметті көру"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> пайдаланып жатқан қолданба"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> пайдаланып жатқан қолданбалар"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 5520cb001a23..a3c37a6282d0 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"អនុញ្ញាត​ការ​កែ​កំហុសតាម USB ឬ?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ស្នាម​ម្រាម​ដៃ​ RSA របស់​កុំព្យូទ័រ​គឺ៖ \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"អនុញ្ញាត​ជា​និច្ច​សម្រាប់​កុំព្យូទ័រ​នេះ"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"មិនអនុញ្ញាតការកែកំហុសតាម USB ទេ"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"អ្នកប្រើ​ដែលបច្ចុប្បន្ន​បានចូលគណនី​នៅលើឧបករណ៍នេះ​មិនអាចបើកការកែកំហុស USB បានទេ។ ដើម្បីប្រើមុខងារនេះ សូមប្តូរទៅអ្នកប្រើចម្បង។"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"ពង្រីក​​ដើម្បី​ឲ្យ​ពេញ​អេក្រង់"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ទាញ​ដើម្បី​ឲ្យ​ពេញ​អេក្រង់"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"រូបថតអេក្រង់"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"បោះ​បង់​"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"តំបន់សារ​ជំនួយ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"បញ្ជាក់"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ព្យាយាម​ម្ដង​ទៀត"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ប៉ះ​ឧបករណ៍​ចាប់ស្នាម​ម្រាមដៃ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"រូបតំណាង​ស្នាម​ម្រាមដៃ"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"កំពុងស្វែងរកអ្នក…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"សំឡេង"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"កាស"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"បញ្ចូល"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ឧបករណ៍​ជំនួយការ​ស្ដាប់"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"ជាធម្មតា​អ្នក​ច្រានចោល​ការ​ជូន​ដំណឹង​ទាំង​នេះ។ \nបន្ត​បង្ហាញ​ពួកវា​ទៀត​ដែរ​ទេ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"បន្ត​បង្ហាញ​ការជូនដំណឹង​ទាំងនេះ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"បញ្ឈប់​ការជូនដំណឹង"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ទប់ស្កាត់"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"បន្ត​បង្ហាញ"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"បង្រួម"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"បង្ហាញ​ស្ងាត់ៗ"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"បន្ត​បិទសំឡេង"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"ជូន​ដំណឹង​ដល់ខ្ញុំ"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"បន្ត​ជូនដំណឹង"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"បន្ត​បង្ហាញ​ការជូនដំណឹង​ពីកម្មវិធីនេះ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"​មិនអាច​បិទការជូនដំណឹង​ទាំងនេះបានទេ"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"តាមរយៈ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ការកំណត់"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"យល់ហើយ"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"ចម្លង SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other">កម្មវិធី <xliff:g id="NUM_APPS_2">%d</xliff:g></item>
+ <item quantity="one">កម្មវិធី <xliff:g id="NUM_APPS_0">%d</xliff:g></item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> កំពុងប្រើ <xliff:g id="TYPES_LIST">%2$s</xliff:g> របស់អ្នក។"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"កម្មវិធី​កំពុងប្រើ <xliff:g id="TYPES_LIST">%s</xliff:g> របស់អ្នក។"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"បោះបង់"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other">កម្មវិធី <xliff:g id="NUM_APPS_4">%1$d</xliff:g> កំពុងប្រើប្រាស់ <xliff:g id="TYPE_5">%2$s</xliff:g> របស់អ្នក។</item>
+ <item quantity="one">កម្មវិធី <xliff:g id="NUM_APPS_0">%1$d</xliff:g> កំពុងប្រើប្រាស់ <xliff:g id="TYPE_1">%2$s</xliff:g> របស់អ្នក។</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"មើល​ព័ត៌មាន​លម្អិត"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"កម្មវិធី​កំពុង​ប្រើប្រាស់ <xliff:g id="TYPES_LIST">%s</xliff:g> របស់អ្នក"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"កម្មវិធី​កំពុង​ប្រើប្រាស់ <xliff:g id="TYPES_LIST">%s</xliff:g> របស់អ្នក"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index f829c12771a0..8c553f505ca5 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ಕಂಪ್ಯೂಟರ್‌ನ RSA ಕೀ ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಹೀಗಿದೆ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ಈ ಕಂಪ್ಯೂಟರ್‌ನಿಂದ ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ಬಳಕೆದಾರರು ಪ್ರಸ್ತುತ ಈ ಸಾಧನಕ್ಕೆ ಸೈನ್ ಇನ್ ಮಾಡಿದ್ದಾರೆ USB ಡೀಬಗ್ ಮಾಡುವುದನ್ನು ಆನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು, ಪ್ರಾಥಮಿಕ ಬಳಕೆದಾರರಿಗೆ ಬದಲಾಯಿಸಿ."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"ಪರದೆ ತುಂಬಿಸಲು ಝೂಮ್ ಮಾಡು"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ಪರದೆ ತುಂಬಿಸಲು ವಿಸ್ತಾರಗೊಳಿಸು"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"ರದ್ದುಮಾಡಿ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ಸಹಾಯ ಸಂದೇಶ ಪ್ರದೇಶ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ದೃಢೀಕರಿಸಿ"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್‌‌ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಐಕಾನ್"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ಆಡಿಯೋ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ಹೆಡ್‌ಸೆಟ್"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ಇನ್‌ಪುಟ್"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ಶ್ರವಣ ಸಾಧನಗಳು"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"ನೀವು ಸಾಮಾನ್ಯವಾಗಿ ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಜಾಗೊಳಿಸಿದ್ದೀರಿ. \nಅವುಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿಲ್ಲಿಸಿ"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ನಿರ್ಬಂಧಿಸಿ"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"ತೋರಿಸುತ್ತಲಿರಿ"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"ಕಿರಿದುಗೊಳಿಸಿ"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"ಮೌನವಾಗಿ ತೋರಿಸಿ"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ಮೌನವಾಗಿರಿ"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"ನನ್ನನ್ನು ಎಚ್ಚರಿಸಿ"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ಎಚ್ಚರಿಸುತ್ತಿರಿ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ಈ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಮೂಲಕ"</string>
@@ -734,7 +734,7 @@
<item msgid="586019486955594690">"ಬಲ-ಬಾಗುವಿಕೆ"</item>
</string-array>
<string name="menu_ime" msgid="4998010205321292416">"ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</string>
- <string name="save" msgid="2311877285724540644">"ಉಳಿಸು"</string>
+ <string name="save" msgid="2311877285724540644">"ಉಳಿಸಿ"</string>
<string name="reset" msgid="2448168080964209908">"ಮರುಹೊಂದಿಸು"</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ಬಟನ್ ಅಳತೆ ಹೊಂದಿಸು"</string>
<string name="clipboard" msgid="1313879395099896312">"ಕ್ಲಿಪ್‌ಬೋರ್ಡ್"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"ಅರ್ಥವಾಯಿತು"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ಹೀಪ್ ಡಂಪ್ ಮಾಡಿ"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ಆ್ಯಪ್‌ಗಳು</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ಆ್ಯಪ್‌ಗಳು</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ಅನ್ನು <xliff:g id="APP">%1$s</xliff:g> ಬಳಸುತ್ತಿದೆ."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%s</xliff:g> ಅನ್ನು ಆ್ಯಪ್‌ಗಳು ಬಳಸುತ್ತಿವೆ."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ರದ್ದುಮಾಡಿ"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ <xliff:g id="TYPE_5">%2$s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿವೆ.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ <xliff:g id="TYPE_5">%2$s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿವೆ.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ವಿವರಗಳನ್ನು ನೋಡಿ"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ಆ್ಯಪ್ ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿದೆ"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿವೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index f5168fba251a..559357f3ddd8 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB 디버깅을 허용하시겠습니까?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"컴퓨터 RSA 키 지문:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"이 컴퓨터에서 항상 허용"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB 디버깅이 허용되지 않음"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"현재 이 기기에 로그인한 사용자는 USB 디버깅을 사용 설정할 수 없습니다. 이 기능을 사용하려면 기본 사용자로 전환하세요."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"전체화면 모드로 확대"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"전체화면 모드로 확대"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"스크린샷"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"취소"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"도움말 메시지 영역"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"확인"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"다시 시도하세요."</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"지문 센서를 터치하세요."</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"지문 아이콘"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"찾는 중..."</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"오디오"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"헤드셋"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"입력"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"보청기"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"보통 이 알림을 닫았습니다. \n알림을 계속 표시하시겠습니까?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"이 알림을 계속 표시하시겠습니까?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"알림 중지"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"차단"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"계속 표시하기"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"최소화"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"소리 없이 표시"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"계속 무음으로 알림"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"내게 알림"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"계속 알림"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"이 앱의 알림을 계속 표시하시겠습니까?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"이 알림은 끌 수 없습니다"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"제공: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"설정"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"확인"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other">앱 <xliff:g id="NUM_APPS_2">%d</xliff:g>개</item>
+ <item quantity="one">앱 <xliff:g id="NUM_APPS_0">%d</xliff:g>개</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>이(가) <xliff:g id="TYPES_LIST">%2$s</xliff:g>을(를) 사용 중입니다."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"애플리케이션이 <xliff:g id="TYPES_LIST">%s</xliff:g>을(를) 사용 중입니다."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"취소"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other">애플리케이션 <xliff:g id="NUM_APPS_4">%1$d</xliff:g>개가 <xliff:g id="TYPE_5">%2$s</xliff:g>을(를) 사용하고 있습니다.</item>
+ <item quantity="one">애플리케이션 <xliff:g id="NUM_APPS_0">%1$d</xliff:g>개가 <xliff:g id="TYPE_1">%2$s</xliff:g>을(를) 사용하고 있습니다.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"세부정보 보기"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g>을(를) 사용 중인 앱"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g>을(를) 사용 중인 앱"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 9558c3a52d14..5725d161c4f0 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB аркылуу жөндөөгө уруксат берилсинби?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Компүтердин RSA ачкычынын контролдук суммасы:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Бул компүтерден дайыма уруксат берилсин"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB мүчүлүштүктөрүн оңдоого уруксат жок"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Учурда бул аккаунтта USB аркылуу мүчүлүштүктөрдү оңдоо функциясын иштетүүгө болбойт. Негизги колдонуучунун аккаунтуна кириңиз."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Экрнд тлтр ү. чен өлч өзг"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Экранды толтуруу ү-н чоюу"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Жокко чыгаруу"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Жардам билдирүүсү"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Ырастоо"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Кайталоо"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Манжа изинин сенсорун басыңыз"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Манжа изинин сүрөтчөсү"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Жүзүңүз изделүүдө…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнитура"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Киргизүү"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Угуу аппараттары"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Адатта мындай эскертмелерди өткөрүп жибересиз. \nАлар көрсөтүлө берсинби?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Бул эскертмелер көрсөтүлө берсинби?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Эскертмелерди токтотуу"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Бөгөттөө"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Көрсөтүлө берсин"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Кичирейтүү"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Үнсүз көрсөтүү"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Үнү чыкпасын"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Мага кабар берилсин"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Кабар бериле берсин"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Бул колдонмонун эскертмелери көрсөтүлө берсинби?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Бул эскертмелерди өчүрүүгө болбойт"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> аркылуу"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Жөндөөлөр"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Түшүндүм"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> колдонмо</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> колдонмо</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> төмөнкүлөрдү колдонуп жатат: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Колдонмолор төмөнкүлөрдү пайдаланып жатышат: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Жок"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> <xliff:g id="NUM_APPS_4">%1$d</xliff:g> колдонмо аркылуу пайдаланылууда.</item>
+ <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> <xliff:g id="NUM_APPS_0">%1$d</xliff:g> колдонмо аркылуу пайдаланылууда.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Кеңири маалымат"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> программаларын пайдаланып жаткан колдонмо"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> программаларын пайдаланып жаткан колдонмолор"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index a4ffffb4ea30..4472fc5d8f72 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"ອະນຸຍາດການດີບັ໊ກຜ່ານ USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ລາຍນິ້ມື RSA ຂອງຄອມພິວເຕີແມ່ນ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ອະນຸຍາດຈາກຄອມພິວເຕີນີ້ຕະຫຼອດ"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ບໍ່​ອະ​ນຸ​ຍາດ​ໃຫ້​ມີ​ການ​ແກ້​ໄຂ​ບັນ​ຫາ USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ຜູ້ໃຊ້ທີ່ກຳລັງເຂົ້າສູ່ລະບົບອຸປະກອນຢູ່ໃນຕອນນີ້ບໍ່ສາມາດເປີດໃຊ້ການດີບັກ USB ໄດ້. ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ສະຫຼັບໄປໃຊ້ຜູ້ໃຊ້ຫຼັກ."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"ຊູມໃຫ້ເຕັມໜ້າຈໍ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ປັບໃຫ້ເຕັມໜ້າຈໍ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ພາບໜ້າຈໍ"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"ຍົກເລີກ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ຊ່ວຍພື້ນທີ່ຂໍ້ຄວາມ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ຢືນຢັນ"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ລອງໃໝ່"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ໄອຄອນລາຍນິ້ວມື"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ກຳລັງຊອກຫາທ່ານ…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ສຽງ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ຊຸດຫູຟັງ"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ການປ້ອນຂໍ້ມູນ"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ເຄື່ອງຊ່ວຍຟັງ"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"ໂດຍປົກກະຕິທ່ານປິດການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄວ້. \nສືບຕໍ່ສະແດງພວກມັນບໍ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"ສະແດງການແຈ້ງເຕືອນເຫຼົ່ານີ້ຕໍ່ໄປບໍ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"ຢຸດການແຈ້ງເຕືອນ"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ບລັອກ"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"ສະແດງຕໍ່ໄປ"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"ຫຍໍ້"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"ສະແດງແບບງຽບໆ"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ສືບຕໍ່ມິດງຽບ"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"ແຈ້ງເຕືອນຂ້ອຍ"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ສືບຕໍ່ແຈ້ງເຕືອນ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ສະແດງການແຈ້ງເຕືອນຈາກແອັບນີ້ຕໍ່ໄປບໍ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ບໍ່ສາມາດປິດການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"ຜ່ານ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ການຕັ້ງຄ່າ"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"ເຂົ້າໃຈແລ້ວ"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ແອັບ</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ແອັບ</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ຂອງທ່ານ."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ແອັບພລິເຄຊັນກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%s</xliff:g> ຂອງທ່ານ."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ຍົກເລີກ"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ແອັບພລິເຄຊັນກຳລັງໃຊ້ <xliff:g id="TYPE_5">%2$s</xliff:g> ຂອງທ່ານຢູ່.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ແອັບພລິເຄຊັນກຳລັງໃຊ້ <xliff:g id="TYPE_1">%2$s</xliff:g> ຂອງທ່ານຢູ່.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ເບິ່ງລາຍລະອຽດ"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ແອັບກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%s</xliff:g> ຂອງທ່ານ"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ແອັບກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%s</xliff:g> ຂອງທ່ານ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 5786fb0dda94..a99df693b3c9 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Leisti USB derinimą?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Šio kompiuterio RSA rakto piršto antspaudas yra:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Visada leisti iš šio kompiuterio"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB derinimas neleidžiamas"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Šiuo metu prie įrenginio prisijungęs naudotojas negali įjungti USB derinimo. Kad galėtumėte naudoti šią funkciją, perjunkite į pagrindinį naudotoją."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Keisti mast., kad atit. ekr."</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Ištempti, kad atit. ekr."</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekrano kopija"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Atšaukti"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Pagalbos pranešimo sritis"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Patvirtinkite"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Bandyti dar kartą"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Palieskite piršto antspaudo jutiklį"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Piršto antspaudo piktograma"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ieškoma jūsų…"</string>
@@ -298,8 +303,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Garsas"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Virtualiosios realybės įrenginys"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Įvestis"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Klausos aparatai"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Įjungiama…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Šviesumas"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatinis pasukimas"</string>
@@ -617,17 +621,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Paprastai šių pranešimų atsisakote. \nToliau juos rodyti?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Toliau rodyti šiuos pranešimus?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Sustabdyti pranešimus"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokuoti"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Toliau rodyti"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Sumažinti"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Rodyti tyliai"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Neskambėti"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Įspėti mane"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Toliau įspėti"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Toliau rodyti iš šios programos gautus pranešimus?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Šių pranešimų negalima išjungti"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"naudojant „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
@@ -881,11 +881,22 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Nustatymai"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Supratau"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Pat. „SysUI“ krūvą"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> programa</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> programos</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> programos</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> programų</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Programa „<xliff:g id="APP">%1$s</xliff:g>“ naudoja: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Programos naudoja: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Atšaukti"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programa naudoja jūsų <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> programos naudoja jūsų <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programos naudoja jūsų <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programų naudoja jūsų <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Žr. išsam. inf."</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Programa, kuri naudoja: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Programos, kurios naudoja: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index cebd91cb49fc..250920d10e30 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Vai atļaut USB atkļūdošanu?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Datora RSA atslēgas ciparfails: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Vienmēr atļaut no šī datora"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB atkļūdošana nav atļauta"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Lietotājs, kurš pašlaik ir pierakstījies šajā ierīcē, nevar iespējot USB atkļūdošanu. Lai izmantotu šo funkciju, pārslēdzieties uz galveno lietotāju."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Tālumm., lai aizp. ekr."</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Stiepiet, lai aizp. ekr."</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekrānuzņēmums"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Atcelt"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Palīdzības ziņojuma apgabals"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Apstiprināt"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Mēģināt vēlreiz"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pieskarieties pirksta nospieduma sensoram"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pirksta nospieduma ikona"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Notiek jūsu sejas meklēšana…"</string>
@@ -297,8 +302,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Austiņas"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ievade"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Dzirdes aparāti"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Notiek ieslēgšana…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Spilgtums"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automātiska pagriešana"</string>
@@ -614,17 +618,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Parasti jūs noraidāt šādus paziņojumus. \nVai turpināt tos rādīt?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Vai turpināt rādīt šos paziņojumus?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Apturēt paziņojumu rādīšanu"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloķēt"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Turpināt rādīt"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizēt"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Rādīt bez skaņas signāla"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Neslēgt skaļumu"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Brīdināt mani"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Turpināt paziņošanu"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vai turpināt rādīt paziņojumus no šīs lietotnes?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Šos paziņojumus nevar izslēgt."</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Iestatījumi"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Labi"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="zero"><xliff:g id="NUM_APPS_2">%d</xliff:g> lietotņu</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> lietotne</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> lietotnes</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Lietotne <xliff:g id="APP">%1$s</xliff:g> izmanto funkcijas <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Lietojumprogrammas izmanto šādas funkcijas: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Atcelt"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="zero"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> lietojumprogrammās tiek izmantots: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> lietojumprogrammā tiek izmantots: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> lietojumprogrammās tiek izmantots: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Skatīt detalizētu informāciju"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Lietotne, kurā tiek izmantots: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Lietotnes, kurās tiek izmantots: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index df1bdbb664f2..49a7655c6085 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Овозможи отстранување грешки на USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Клучниот отпечаток на RSA на компјутерот е:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Секогаш дозволувај од овој компјутер"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отстранувањето грешки на USB не е дозволено"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Корисникот што моментално е најавен на уредов не може да вклучи отстранување грешки на USB. За да ја користите функцијава, префрлете се на примарниот корисник."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Зумирај да се исполни екранот"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Растегни да се исполни екранот"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Слика од екранот"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Откажи"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за пораки за помош"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Обиди се повторно"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Допрете го сензорот за отпечатоци"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатоци"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ве бараме вас…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Слушалки"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Влез"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слушни помагала"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Обично ги отфрлате известувањава. \nДа продолжат да се прикажуваат?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Дали да продолжат да се прикажуваат известувањава?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Запри ги известувањата"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Блокирај"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Продолжи да ги прикажуваш"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Минимизирај"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Прикажи тивко"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Продолжи со безгласно прикажување"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Предупреди ме"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Продолжи да ме предупредуваш"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Дали да продолжат да се прикажуваат известувања од апликацијава?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Известувањава не може да се исклучат"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"преку <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Поставки"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Сфатив"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Извади SysUI-слика"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликација</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликации</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> користи <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Апликациите користат <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Откажи"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="TYPE_5">%2$s</xliff:g> се користи од <xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликација.</item>
+ <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> се користи од <xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликации.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Прикажи ги деталите"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Апликации што ја користат вашата <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Апликации што ја користат вашата <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 5800e0ee1eae..ba939747f361 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB ഡീബഗ്ഗിംഗ് അനുവദിക്കണോ?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ഈ കമ്പ്യൂട്ടറിന്റെ RSA കീ ഫിംഗർപ്രിന്റ് ഇതാണ്:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ഈ കമ്പ്യൂട്ടറിൽ നിന്ന് എല്ലായ്പ്പോഴും അനുവദിക്കുക"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ഡീബഗ്ഗിംഗ് അനുവദനീയമല്ല"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ഉപകരണത്തിൽ ഇപ്പോൾ സൈൻ ഇൻ ചെയ്‌തിരിക്കുന്ന ഉപയോക്താവിന് USB ഡീബഗ്ഗിംഗ് ഓണാക്കാനാകില്ല. ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ പ്രാഥമിക ഉപയോക്താവിലേക്ക് മാറുക."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"സ്‌ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ സൂം ചെയ്യുക"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"സ്‌ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ വലിച്ചുനീട്ടുക"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"സ്‌ക്രീൻഷോട്ട്"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"റദ്ദാക്കുക"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"സഹായ സന്ദേശ ഏരിയ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"സ്ഥിരീകരിക്കുക"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"വീണ്ടും ശ്രമിക്കുക"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"വിരലടയാള സെൻസർ സ്‌പർശിക്കുക"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"വിരലടയാള ഐക്കൺ"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"നിങ്ങൾക്കായി തിരയുന്നു…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ഓഡിയോ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ഹെഡ്‌സെറ്റ്"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ഇൻപുട്ട്"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ശ്രവണ സഹായികൾ"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"സാധാരണയായി നിങ്ങൾ ഈ അറിയിപ്പുകൾ നിരാകരിക്കുന്നു. \nഅവ തുടർന്നും കാണിക്കണോ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"ഈ അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"അറിയിപ്പുകൾ നിർത്തുക"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ബ്ലോക്ക് ചെയ്യുക"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"തുടർന്നും കാണിക്കുക"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"ചെറുതാക്കുക‍"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"നിശബ്‌ദമായി കാണിക്കുക"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"നിശബ്‌ദമായ നിലയിൽ തുടരുക"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"എനിക്ക് അലേർട്ട് നൽകുക"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"മുന്നറിയിപ്പ് നൽകുന്നത് തുടരുക"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ഈ ആപ്പിൽ നിന്നുള്ള അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ഈ അറിയിപ്പുകൾ ഓഫാക്കാനാവില്ല"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> വഴി"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ക്രമീകരണം"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"മനസ്സിലായി"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ഹീപ്പ് ഡമ്പ് ചെയ്യുക"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ആപ്പുകൾ</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ആപ്പ്</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ഉപയോഗിക്കുന്നു."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ആപ്പുകൾ നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%s</xliff:g> ഉപയോഗിക്കുന്നു."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"റദ്ദാക്കുക"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ആപ്പുകൾ നിങ്ങളുടെ <xliff:g id="TYPE_5">%2$s</xliff:g> ഉപയോഗിക്കുന്നു.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ആപ്പ് നിങ്ങളുടെ <xliff:g id="TYPE_1">%2$s</xliff:g> ഉപയോഗിക്കുന്നു.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"വിശദാംശങ്ങൾ കാണുക"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%s</xliff:g> ഉപയോഗിക്കുന്ന ആപ്പ്"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%s</xliff:g> ഉപയോഗിക്കുന്ന ആപ്പുകൾ"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index e96865ee24f2..e19cb2b881b2 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB дебаг хийхийг зөвшөөрөх үү?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Компьютерийн RSA түлхүүрийн хурууны хээ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Энэ компьютерээс орохыг байнга зөвшөөрөх"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB алдаа засалт хийх боломжгүй"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Энэ төхөөрөмжид нэвтэрсэн хэрэглэгч USB дебаг хийх онцлогийг асаах боломжгүй байна. Энэ онцлогийг ашиглахын тулд үндсэн хэрэглэгч рүү сэлгэнэ үү."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Дэлгэц дүүргэх бол өсгөнө үү"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Дэлгэц дүүргэх бол татна уу"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Дэлгэцийн зураг дарах"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Цуцлах"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Тусламжийн зурвасын хэсэг"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Баталгаажуулах"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Дахин оролдох"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Хурууны хээ мэдрэгчид хүрэх"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Хурууны хээний дүрс тэмдэг"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Таныг хайж байна…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Чихэвч"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Оролт"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Сонсголын төхөөрөмж"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Та эдгээр мэдэгдлийг ихэвчлэн хаадаг. \nЭдгээрийг харуулсан хэвээр байх уу?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Эдгээр мэдэгдлийг харуулсан хэвээр байх уу?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Мэдэгдлийг зогсоох"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Блоклох"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Харуулсан хэвээр байх"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Багасгах"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Дуугүй харуулах"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Чимээгүй хэвээр харуулах"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Надад сануулах"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Үргэлжлүүлэн сануулах"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Энэ аппаас мэдэгдэл харуулсан хэвээр байх уу?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Эдгээр мэдэгдлийг унтраах боломжгүй"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-р"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Тохиргоо"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Ойлголоо"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> апп</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> апп</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> таны <xliff:g id="TYPES_LIST">%2$s</xliff:g>-г ашиглаж байна."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Аппууд таны <xliff:g id="TYPES_LIST">%s</xliff:g>-г ашиглаж байна."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Болих"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other">Таны <xliff:g id="TYPE_5">%2$s</xliff:g>-г <xliff:g id="NUM_APPS_4">%1$d</xliff:g> апп ашиглаж байна.</item>
+ <item quantity="one">Таны <xliff:g id="TYPE_1">%2$s</xliff:g>-г <xliff:g id="NUM_APPS_0">%1$d</xliff:g> апп ашиглаж байна.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Дэлгэрэнгүй үзэх"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Апп таны <xliff:g id="TYPES_LIST">%s</xliff:g>-г ашиглаж байна"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Аппууд таны <xliff:g id="TYPES_LIST">%s</xliff:g>-г ашиглаж байна"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 6022a9c2546b..71e0e3c22d68 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB डीबग करण्यास अनुमती द्यायची?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"संगणकाची RSA की फिंगरप्रिंट ही आहे:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"या संगणकावरून नेहमी अनुमती द्या"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डीबग करण्‍यास अनुमती नाही"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"सध्‍या या डीव्हाइसमध्‍ये साइन इन केलेला वापरकर्ता USB डीबग करणे चालू करू शकत नाही. हे वैशिष्‍ट्य वापरण्‍यासाठी, प्राथमिक वापरकर्त्‍यावर स्विच करा."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"स्क्रीन भरण्यासाठी झूम करा"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"स्क्रीन भरण्यासाठी ताणा"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रीनशॉट"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"रद्द करा"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मदत मेसेज परिसर"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"खात्री करा"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"पुन्हा प्रयत्न करा"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिंट सेन्सरला स्पर्श करा"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिंट आयकन"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तुमच्यासाठी शोधत आहे…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ऑडिओ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"हेडसेट"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"इनपुट"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"श्रवण यंत्रे"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"तुम्ही या सूचना सामान्यतः डिसमिस करता. \nते दाखवत राहायचे?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"या सूचना दाखवणे सुरू ठेवायचे?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"सूचना थांबवा"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ब्लॉक करा"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"दाखवणे सुरू ठेवा"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"लहान करा"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"शांतपणे दर्शवा"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"सायलंट रहा"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"मला अ‍ॅलर्ट करा"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सूचना देत रहा"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"या अ‍ॅपकडील सूचना दाखवणे सुरू ठेवायचे?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"या सूचना बंद करता येत नाहीत"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> मार्गे"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"सेटिंग्ज"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"समजले"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI हीप डंप करा"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> अ‍ॅप</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> अ‍ॅप्स</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> तुमचे <xliff:g id="TYPES_LIST">%2$s</xliff:g> वापरत आहे."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"अॅप्लिकेशन्स तुमचे <xliff:g id="TYPES_LIST">%s</xliff:g> वापरत आहे."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"रद्द करा"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> अॅप्लिकेशन तुमचे <xliff:g id="TYPE_5">%2$s</xliff:g> वापरत आहे.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> अॅप्लिकेशन तुमचे <xliff:g id="TYPE_5">%2$s</xliff:g> वापरत आहेत.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"तपशील पाहा"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"अ‍ॅप तुमचे <xliff:g id="TYPES_LIST">%s</xliff:g> वापरत आहे"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"अॅप्स तुमचे <xliff:g id="TYPES_LIST">%s</xliff:g> वापरत आहेत"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 1a9eb1c3a849..1b7cc7cf5f2f 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Benarkan penyahpepijatan USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Cap jari kekunci RSA komputer ialah:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Sentiasa benarkan komputer ini"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Penyahpepijatan USB tidak dibenarkan"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Pengguna yang log masuk ke peranti ini pada masa ini tidak boleh menghidupkan penyahpepijatan USB. Untuk menggunakan ciri ini, tukar kepada pengguna utama."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zum untuk memenuhi skrin"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Regang utk memenuhi skrin"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Tangkapan skrin"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Batal"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bahagian mesej bantuan"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Sahkan"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Cuba lagi"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh penderia cap jari"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon cap jari"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari anda…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Set Kepala"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Alat Bantu Dengar"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Menghidupkan…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kecerahan"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Autoputar"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Biasanya anda mengetepikan pemberitahuan ini. \nTerus tunjukkan pemberitahuan?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Terus tunjukkan pemberitahuan ini?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Hentikan pemberitahuan"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Sekat"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Terus tunjukkan"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimumkan"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Tunjukkan secara senyap"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Kekal senyap"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Maklumi saya"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Teruskan memberikan makluman"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Terus tunjukkan pemberitahuan daripada apl ini?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Pemberitahuan ini tidak boleh dimatikan"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"melalui <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Tetapan"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Longgok Tmbunn SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apl</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> apl</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> sedang menggunakan <xliff:g id="TYPES_LIST">%2$s</xliff:g> anda."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikasi sedang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> anda."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Batal"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikasi sedang menggunakan <xliff:g id="TYPE_5">%2$s</xliff:g> anda.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikasi sedang menggunakan <xliff:g id="TYPE_1">%2$s</xliff:g> anda.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Lihat butiran"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Apl yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> anda"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apl yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> anda"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index dbfa01ecce38..b5cd82e43054 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB အမှားရှာဖွေပြင်ဆင်ခြင်း ခွင့်ပြုပါမည်လား?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ဒီကွန်ပျူတာရဲ့ RSA key fingerprint ကတော့:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g> ဖြစ်ပါသည်"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ဒီကွန်ပျူတာမှ အမြဲခွင့်ပြုရန်"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB အမှားပြင်ဆင်ခြင်း ခွင့်မပြုပါ"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ဤစက်ပစ္စည်းသို့ လက်ရှိဝင်ရောက်ထားသည့် အသုံးပြုသူသည် USB အမှားပြင်ဆင်ခြင်းကို ဖွင့်၍မရပါ။ ဤဝန်ဆောင်မှုကို အသုံးပြုရန် အဓိကအသုံးပြုသူအဖြစ်သို့ ပြောင်းပါ။"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"ဇူးမ်အပြည့်ဆွဲခြင်း"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ဖန်သားပြင်အပြည့်ဆန့်ခြင်း"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"မလုပ်တော့"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"အကူအညီမက်ဆေ့ဂျ် နေရာ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"အတည်ပြုပါ"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ထပ်စမ်းကြည့်ရန်"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"လက်ဗွေ သင်္ကေတ"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"သင့်ကို ရှာဖွေနေသည်…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"အသံ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"မိုက်ခွက်ပါနားကြပ်"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"အဝင်"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"နားကြားကိရိယာ"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"သင်သည် အများအားဖြင့် ဤအကြောင်းကြားချက်များကို ပယ်လေ့ရှိပါသည်။ \n၎င်းတို့ကို ဆက်လက်ပြသလိုပါသလား။"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"ဤအကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"အကြောင်းကြားချက်များကို ရပ်ရန်"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ပိတ်ထားရန်"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"ဆက်ပြရန်"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"ချုံ့ရန်"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"တိတ်တဆိတ် ပြရန်"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ဆက်လက် အသံတိတ်ရန်"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"ကျွန်ုပ်ကို သတိပေးရန်"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ဆက်လက် သတိပေးရန်"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ဤအက်ပ်ထံမှ အကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ဤအကြောင်းကြားချက်များကို ပိတ်၍မရပါ"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> မှတစ်ဆင့်"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ဆက်တင်များ"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"ရပါပြီ"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other">အက်ပ် <xliff:g id="NUM_APPS_2">%d</xliff:g> ခု</item>
+ <item quantity="one">အက်ပ် <xliff:g id="NUM_APPS_0">%d</xliff:g> ခု</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> က သင်၏ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ကို အသုံးပြုနေသည်။"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"အပလီကေးရှင်းများက သင်၏ <xliff:g id="TYPES_LIST">%s</xliff:g> ကို အသုံးပြုနေသည်။"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"မလုပ်တော့"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other">အပလီကေးရှင်း <xliff:g id="NUM_APPS_4">%1$d</xliff:g> ခုက သင်၏ <xliff:g id="TYPE_5">%2$s</xliff:g> ကို အသုံးပြုနေသည်။</item>
+ <item quantity="one">အပလီကေးရှင်း <xliff:g id="NUM_APPS_0">%1$d</xliff:g> ခုက သင်၏ <xliff:g id="TYPE_1">%2$s</xliff:g> ကို အသုံးပြုနေသည်။</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"အသေးစိတ်ကြည့်ပါ"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"သင့် <xliff:g id="TYPES_LIST">%s</xliff:g> ကို အသုံးပြုနေသော အက်ပ်"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"သင့် <xliff:g id="TYPES_LIST">%s</xliff:g> ကို အသုံးပြုနေသော အက်ပ်များ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index e79068436839..83a1ad940ef9 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Vil du tillate USB-feilsøking?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Datamaskinens nøkkelfingeravtrykk for RSA er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Tillat alltid fra denne datamaskinen"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-feilsøking er ikke tillatt"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Brukeren som for øyeblikket er logget på denne enheten, kan ikke slå på USB-feilsøking. For å bruke denne funksjonen, bytt til hovedbrukeren."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom for å fylle skjermen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Strekk for å fylle skjerm"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skjermdump"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Avbryt"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område for hjelpemelding"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekreft"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Prøv på nytt"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Trykk på fingeravtrykkssensoren"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeravtrykk"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ser etter deg …"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Lyd"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Hodetelefoner"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Innenhet"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Høreapparater"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Slår på …"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Lysstyrke"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotér automatisk"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Du avviser vanligvis disse varslene. \nVil du fortsette å vise dem?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Vil du fortsette å vise disse varslene?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stopp varsler"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokkér"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Fortsett å vise"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimer"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Vis uten lyd"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Forbli lydløs"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Varsle meg"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsett å varsle"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsette å vise varsler fra denne appen?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Du kan ikke slå av disse varslene"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Innstillinger"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Greit"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI-heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apper</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> bruker <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apper bruker <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Avbryt"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> apper bruker <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> app bruker <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Se detaljer"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App som bruker <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apper som bruker <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 9b4441fa27b1..8ebb22ea5dcd 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB डिबग गर्नको लागि अनुमति दिने हो?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"कम्प्युटरको RSA कुञ्जी औंलाछाप:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"यो कम्प्युटरबाट सधैँ अनुमति दिनुहोस्"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डिबग गर्न अनुमति छैन"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"हाल यस यन्त्रमा साइन इन हुनुभएको प्रयोगकर्ताले USB डिबग सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्तामा बदल्नुहोस्‌।"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"स्क्रिन भर्न जुम गर्नुहोस्"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"स्क्रिन भर्न तन्काउनुहोस्"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रिनसट"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"रद्द गर्नुहोस्"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मद्दतसम्बन्धी सन्देशको क्षेत्र"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि गर्नुहोस्"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"फेरि प्रयास गर्नुहोस्"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिन्ट सेन्सरमा छुनुहोस्‌"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिन्ट जनाउने आइकन"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तपाईंलाई खोज्दै…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"अडियो"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"हेडसेट"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"इनपुट"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"श्रवण यन्त्रहरू"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"तपाईं सामान्यतया यी सूचनाहरूलाई खारेज गर्ने गर्नुहुन्छ। \nतिनलाई देखाइरहने हो?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"यी सूचनाहरू देखाउने क्रम जारी राख्ने हो?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"सूचनाहरू देखाउन छाड्नुहोस्"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"रोक लगाउनुहोस्"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"देखाउने क्रम जारी राख्नुहोस्"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"सानो बनाउनुहोस्"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"मौन रूपमा देखाउने"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"मौन रहनुहोस्"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"मलाई सतर्क गराउनुहोस्"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सर्तक गराइरहनुहोस्"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"यो अनुप्रयोगका सूचनाहरू देखाउने क्रम जारी राख्ने हो?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"यी सूचनाहरूलाई निष्क्रिय पार्न सकिँदैन"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> मार्फत"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"सेटिङहरू"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"बुझेँ"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> अनुप्रयोगहरू</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> अनुप्रयोग</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ले तपाईंको <xliff:g id="TYPES_LIST">%2$s</xliff:g> प्रयोग गर्दै छ।"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"अनुप्रयोगहरूले तपाईंको <xliff:g id="TYPES_LIST">%s</xliff:g> प्रयोग गर्दै छन्‌।"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"रद्द गर्नु…"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> अनुप्रयोगहरूले तपाईंको <xliff:g id="TYPE_5">%2$s</xliff:g> प्रयोग गरिरहेका छन्।</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> अनुप्रयोगले तपाईंको <xliff:g id="TYPE_1">%2$s</xliff:g> प्रयोग गरिरहेको छ।</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"विवरणहरू हेर्नुहोस्"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"तपाईंको <xliff:g id="TYPES_LIST">%s</xliff:g> प्रयोग गरिरहेका अनुप्रयोग"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"तपाईंको <xliff:g id="TYPES_LIST">%s</xliff:g> प्रयोग गरिरहेका अनुप्रयोगहरू"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index e570789da554..f28e20659633 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB-foutopsporing toestaan?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"De vingerafdruk voor de RSA-sleutel van de computer is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Altijd toestaan vanaf deze computer"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-foutopsporing niet toegestaan"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom om scherm te vullen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Rek uit v. schermvulling"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Annuleren"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Gebied voor Help-berichten"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestigen"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Opnieuw proberen"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak de vingerafdruksensor aan"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukpictogram"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Jouw gezicht zoeken…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Invoer"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Gehoorapparaten"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Inschakelen..."</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helderheid"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatisch draaien"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Meestal sluit je deze meldingen. \nWil je ze blijven weergeven?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Deze meldingen blijven weergeven?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Meldingen stoppen"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokkeren"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Blijven weergeven"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimaliseren"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Zonder geluid weergeven"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stil blijven"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Mij waarschuwen"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Blijven waarschuwen"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Meldingen van deze app blijven weergeven?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Deze meldingen kunnen niet worden uitgeschakeld"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Instellingen"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> gebruikt je <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps gebruiken je <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annuleren"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> apps gebruiken je <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> app gebruikt je <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Details weergeven"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App die je <xliff:g id="TYPES_LIST">%s</xliff:g> gebruikt"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps die je <xliff:g id="TYPES_LIST">%s</xliff:g> gebruiken"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index dd260b1fedbb..07cd18fe1c18 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB ଡିବଗିଙ୍ଗ କରିବେ?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"କମ୍ପ୍ୟୁଟର୍‌ର RSA କୀ\' ଆଙ୍ଗୁଠି ଚିହ୍ନ ହେଉଛି:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ସବୁବେଳେ ଏହି କମ୍ପ୍ୟୁଟର୍‌ରୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBରେ ଡିବଗ୍‍ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ସମ୍ପ୍ରତି ସାଇନ୍‍-ଇନ୍‍ କରିଥିବା ୟୁଜର୍‍ ଜଣକ ଏହି ଡିଭାଇସରେ USB ଡିବଗିଙ୍ଗ ଅନ୍‍ କରିପାରିବେ ନାହିଁ। ଏହି ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ, ପ୍ରାଥମିକ ୟୁଜର୍‍ରେ ସାଇନ୍‍-ଇନ୍‍ କରନ୍ତୁ।"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"ସ୍କ୍ରୀନ ଭରିବା ପାଇଁ ଜୁମ୍ କରନ୍ତୁ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ସ୍କ୍ରୀନ୍‌କୁ ଭରିବା ପାଇଁ ଟାଣନ୍ତୁ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ସ୍କ୍ରୀନଶଟ୍‌"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ସାହାଯ୍ୟ ମେସେଜ୍ କ୍ଷେତ୍ର"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ନିଶ୍ଚିତ କରନ୍ତୁ"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନସର୍‌କୁ ଛୁଅଁନ୍ତୁ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ଅଡିଓ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ହେଡସେଟ୍‍"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ଇନପୁଟ୍"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ଶ୍ରବଣ ଯନ୍ତ୍ର"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"ସାଧାରଣତଃ ଆପଣ ଏହି ବିଜ୍ଞପ୍ତିକୁ ଖାରଜ କରିଦିଅନ୍ତି। \n ସେଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"ବିଜ୍ଞପ୍ତିକୁ ଦେଖାଇବା ବନ୍ଦ କରନ୍ତୁ"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ବ୍ଲକ୍ କରନ୍ତୁ"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"ଦେଖାଇବା ଜାରି ରଖନ୍ତୁ"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"ଛୋଟ କରନ୍ତୁ"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"ନିରବରେ ଦେଖାନ୍ତୁ"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ନୀରବ ରହନ୍ତୁ"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"ମୋତେ ଆଲର୍ଟ କରନ୍ତୁ"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ଆଲର୍ଟ କରିବା ଜାରି ରଖନ୍ତୁ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ଏହି ଆପ୍‌ରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ବନ୍ଦ କରିହେବ ନାହିଁ"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ମାଧ୍ୟମରେ"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ସେଟିଙ୍ଗ"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"ବୁଝିଲି"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ହିପ୍ ଡମ୍ପ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>ଟି ଆପ୍ସ</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ଆପ୍</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି।"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ଆପ୍ଲିକେସନ୍‍ଗୁଡିକ ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି।"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ବାତିଲ୍‌"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>ଟି ଆପ୍ଲିକେସନ୍ ଆପଣଙ୍କର <xliff:g id="TYPE_5">%2$s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି।</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g>ଟି ଆପ୍ଲିକେସନ୍ ଆପଣଙ୍କର <xliff:g id="TYPE_1">%2$s</xliff:g>ବ୍ୟବହାର କରୁଛନ୍ତି।</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ବିବରଣୀ ଦେଖନ୍ତୁ"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ଆପ୍‍ ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%s</xliff:g> ବ୍ୟବହାର କରୁଛି"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ଆପ୍ସ ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index e36fea21f937..2b2a124a857e 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"ਕੀ USB ਡੀਬਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ਕੰਪਿਊਟਰ ਦਾ RSA ਕੁੰਜੀ ਫਿੰਗਰਪ੍ਰਿੰਟ \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ਹਮੇਸ਼ਾਂ ਇਸ ਕੰਪਿਊਟਰ ਤੋਂ ਆਗਿਆ ਦਿਓ"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ਡਿਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਨਹੀਂ"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਜ਼ੂਮ ਕਰੋ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਸਟ੍ਰੈਚ ਕਰੋ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ਮਦਦ ਸੁਨੇਹਾ ਖੇਤਰ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ਪੁਸ਼ਟੀ ਕਰੋ"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ਤੁਹਾਡੀ ਪਛਾਣ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ਆਡੀਓ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ਹੈੱਡਸੈੱਟ"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ਇਨਪੁੱਟ"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ਸੁਣਨ ਦੇ ਸਾਧਨ"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"ਤੁਸੀਂ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਆਮ ਤੌਰ \'ਤੇ ਖਾਰਜ ਕਰਦੇ ਹੋ। \nਕੀ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"ਕੀ ਇਨ੍ਹਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"ਬਲਾਕ ਕਰੋ"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖੋ"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"ਛੋਟਾ ਕਰੋ"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"ਚੁੱਪ-ਚਪੀਤੇ ਦਿਖਾਓ"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ਚੁੱਪ ਰਹੋ"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"ਮੈਨੂੰ ਸੁਚੇਤ ਕਰੋ"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ਸੁਚੇਤ ਰਖੋ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ਇਨ੍ਹਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਰਾਹੀਂ"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ਸੈਟਿੰਗਾਂ"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"ਸਮਝ ਲਿਆ"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ਹੀਪ ਡੰਪ ਕਰੋ"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ਐਪ</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ਐਪਾਂ</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ਐਪਲੀਕੇਸ਼ਨਾਂ ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀਆਂ ਹਨ।"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ਰੱਦ ਕਰੋ"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ਐਪਲੀਕੇਸ਼ਨ ਤੁਹਾਡੇ <xliff:g id="TYPE_5">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ਐਪਲੀਕੇਸ਼ਨਾਂ ਤੁਹਾਡੇ <xliff:g id="TYPE_5">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀਆਂ ਹਨ।</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ਵੇਰਵੇ ਦੇਖੋ"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਐਪ"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀਆਂ ਐਪਾਂ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index ed2902fa848e..b5b6da462103 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Zezwalać na debugowanie USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Odcisk cyfrowy klucza RSA komputera to:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Zawsze zezwalaj z tego komputera"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debugowanie USB jest niedozwolone"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Użytkownik obecnie zalogowany na tym urządzeniu nie może włączyć debugowania USB. Aby użyć tej funkcji, przełącz się na użytkownika głównego."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Powiększ, aby wypełnić ekran"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Rozciągnij, aby wypełnić ekran"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Zrzut ekranu"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Anuluj"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Obszar komunikatu pomocy"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potwierdź"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Spróbuj jeszcze raz"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotknij czytnika linii papilarnych"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odcisku palca"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Szukam Cię…"</string>
@@ -298,8 +303,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Dźwięk"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Zestaw słuchawkowy"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Wejście"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparaty słuchowe"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Włączam…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jasność"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Autoobracanie"</string>
@@ -617,17 +621,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Zwykle odrzucasz te powiadomienia. \nNadal je pokazywać?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Nadal pokazywać te powiadomienia?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Zablokuj powiadomienia"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Zablokuj"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Pokazuj nadal"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimalizuj"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Pokazuj dyskretnie"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Zachowaj wyciszenie"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Powiadom mnie"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Powiadamiaj dalej"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Nadal pokazywać powiadomienia z tej aplikacji?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Tych powiadomień nie można wyłączyć"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"przez aplikację <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Ustawienia"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Zrzut stosu SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacje</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacji</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacji</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikacja</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikacja <xliff:g id="APP">%1$s</xliff:g> używa: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacje używają: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Anuluj"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacje używają: <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacji używa: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacji używa: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikacja używa: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Wyświetl szczegóły"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacje, które używają: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacje, które używają: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index ac6991774daa..bc734035513a 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuração USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA deste computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Sempre permitir a partir deste computador"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom p/ preencher a tela"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Ampliar p/ preencher tela"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar novamente"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Fone de ouvido"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparelhos auditivos"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ativando…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automaticamente"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Geralmente você dispensa essas notificações. \nQuer que elas continuem a ser exibidas?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Continuar mostrando essas notificações?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Bloquear notificações"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar silenciosamente"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuar sem som"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Receber alerta"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar alertando"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuar mostrando notificações desse app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar essas notificações"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Configurações"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Ok"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Despejar pilha SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"O app <xliff:g id="APP">%1$s</xliff:g> está usando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplicativos estão usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativo está usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativos estão usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalhes"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index c1858fc938e6..d7ae1615e702 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Permitir depuração USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA do computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Permitir sempre a partir deste computador"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O utilizador com sessão iniciada atualmente neste dispositivo não pode ativar a depuração USB. Para utilizar esta funcionalidade, mude para o utilizador principal."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom para preencher o ecrã"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Esticar p. caber em ec. int."</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de ecrã"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar novamente"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressões digitais."</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"À sua procura…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ausc. c/ mic. integ."</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparelhos auditivos"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"A ativar..."</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotação automática"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Normalmente, ignora estas notificações. \nPretende continuar a mostrá-las?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Pretende continuar a ver estas notificações?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Parar notificações"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuar a mostrar"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar silenciosamente"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuar sem som"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alertar-me"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar a alertar"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Pretende continuar a ver notificações desta aplicação?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar estas notificações."</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"através da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Definições"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Compreendi"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Cp ár. di. da. SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplic.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicação</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"A aplicação <xliff:g id="APP">%1$s</xliff:g> está a utilizar o(a) <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"As aplicações estão a utilizar o(a) <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicações estão a utilizar o(a) <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicação está a utilizar o(a) <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalhes"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicações que utilizam o(a) <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicações que utilizam o(a) <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index ac6991774daa..bc734035513a 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuração USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA deste computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Sempre permitir a partir deste computador"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom p/ preencher a tela"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Ampliar p/ preencher tela"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar novamente"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Fone de ouvido"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparelhos auditivos"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ativando…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automaticamente"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Geralmente você dispensa essas notificações. \nQuer que elas continuem a ser exibidas?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Continuar mostrando essas notificações?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Bloquear notificações"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar silenciosamente"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuar sem som"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Receber alerta"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar alertando"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuar mostrando notificações desse app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar essas notificações"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Configurações"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Ok"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Despejar pilha SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"O app <xliff:g id="APP">%1$s</xliff:g> está usando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplicativos estão usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativo está usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativos estão usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalhes"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index c393bdeb9d23..268a40650d27 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Permiteți remedierea erorilor prin USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Amprenta digitală din cheia RSA a computerului este:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Permiteți întotdeauna de pe acest computer"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Remedierea erorilor prin USB nu este permisă"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom pt. a umple ecranul"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Înt. pt. a umple ecranul"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Captură de ecran"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Anulați"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona mesajelor de ajutor"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmați"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Încercați din nou"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Atingeți senzorul de amprente"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pictograma amprentă"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Vă căutăm…"</string>
@@ -297,8 +302,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Căști"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Intrare"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparate auditive"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Se activează..."</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminozitate"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotire automată"</string>
@@ -614,17 +618,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"De regulă respingeți aceste notificări. \nDoriți să fie afișate în continuare?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Doriți să continuați afișarea acestor notificări?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Opriți notificările"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blocați"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuați afișarea"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizați"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Afișați fără sunet"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Păstrați modul silențios"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alertează-mă"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Păstrați alerta"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Doriți să continuați afișarea notificărilor de la această aplicație?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Aceste notificări nu pot fi dezactivate"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"prin <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Setări"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Date SysUI memorie"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplicații</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> de aplicații</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicație</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> folosește <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplicațiile folosesc <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Anulați"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplicații folosesc <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> de aplicații folosesc <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicație folosește <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Afișați detaliile"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicație care folosește <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicații care folosesc <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index e643c8f026f8..bbea69433300 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Отладка по USB"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Цифровой отпечаток ключа RSA:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Всегда разрешать отладку с этого компьютера"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отладка по USB запрещена"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"В этом аккаунте нельзя включить отладку по USB. Перейдите в аккаунт основного пользователя."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Подогнать по размерам экрана"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Растянуть на весь экран"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Отмена"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Справочное сообщение"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Подтвердить"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Повторить попытку"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Прикоснитесь к сканеру отпечатков пальцев."</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок отпечатка пальца"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Поиск лица…"</string>
@@ -298,8 +303,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудиоустройство"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнитура"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Устройство ввода"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слуховые аппараты"</string>
<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>
@@ -617,17 +621,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Обычно вы скрываете эти уведомления.\nПоказывать их?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Показывать эти уведомления?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Отключить уведомления"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Заблокировать"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Показывать"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Свернуть"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Без звука"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Не включать звук"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Оповещать меня"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Присылать уведомления"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Показывать уведомления от этого приложения?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Эти уведомления нельзя отключить."</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"через приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
@@ -881,11 +881,22 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Открыть настройки"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"ОК"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Передача SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> прил.</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> прил.</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> прил.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> прил.</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"В приложении \"<xliff:g id="APP">%1$s</xliff:g>\" используется <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"В приложениях используется <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Отмена"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one">Функцию \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" использует <xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложение.</item>
+ <item quantity="few">Функцию \"<xliff:g id="TYPE_3">%2$s</xliff:g>\" используют <xliff:g id="NUM_APPS_2">%1$d</xliff:g> приложения.</item>
+ <item quantity="many">Функцию \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" используют <xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложений.</item>
+ <item quantity="other">Функцию \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" используют <xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложения.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Подробнее"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Приложение, в котором используются операции <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Приложения, в которых используются операции <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index cb22f3d431a2..aaaa7038abf2 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB නිදොස්කරණයට අවසර දෙනවද?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"මෙම පරිගණකයේ RSA යතුරු ඇඟිලි සටහන වන්නේ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"සැම විටම මෙම පරිගණකයෙන් ඉඩ ලබා දෙන්න"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB නිදොස්කරණය වෙත අවසර නැහැ"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"දැනට මෙම උපාංගයට පුරා ඇති පරිශීලකයාට USB නිදොස්කරණය ක්‍රියාත්මක කළ නොහැක. මෙම විශේෂාංගය භාවිතා කිරීම සඳහා, මූලික පරිශීලකයා වෙත මාරු වෙන්න."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"තිරය පිරවීමට විශාලනය කරන්න"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"තිරය පිරවීමට අදින්න"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"තිර රුව"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"උදවු පණිවිඩ ප්‍රදේශය"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"තහවුරු කරන්න"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"නැවත උත්සාහ කරන්න"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ඇඟිලි සලකුණු නිරූපකය"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ඔබව සොයමින්…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ශ්‍රව්‍ය"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"හෙඩ්සෙටය"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ආදානය"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ශ්‍රවණාධාරක"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"ඔබ සාමාන්‍යයෙන් මෙවැනි දැනුම්දීම් ඉවත දමයි. \nඒවා දිගටම පෙන්වන්නද?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"මෙම දැනුම්දීම් පෙන්වමින් තබන්නද?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"දැනුම්දීම් නවත්වන්න"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"අවහිර කරන්න"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"පෙන්වමින් තබන්න"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"කුඩා කරන්න"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"නිහඬව පෙන්වන්න"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"නිහඬව සිටින්න"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"මට අඟවන්න"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"අඟවමින් සිටින්න"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"මෙම යෙදුම වෙතින් දැනුම්දීම් පෙන්වමින් තබන්නද?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"මෙම දැනුම්දීම් ක්‍රියාවිරහිත කළ නොහැකිය"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> හරහා"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"සැකසීම්"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"තේරුණා"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one">යෙදුම් <xliff:g id="NUM_APPS_2">%d</xliff:g>ක්</item>
+ <item quantity="other">යෙදුම් <xliff:g id="NUM_APPS_2">%d</xliff:g>ක්</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ඔබේ <xliff:g id="TYPES_LIST">%2$s</xliff:g> භාවිත කරමින් සිටී."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"යෙදුම් ඔබේ <xliff:g id="TYPES_LIST">%s</xliff:g> භාවිත කරමින් සිටී."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"අවලංගු කරන්න"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one">යෙදුම් <xliff:g id="NUM_APPS_4">%1$d</xliff:g>ක් ඔබේ <xliff:g id="TYPE_5">%2$s</xliff:g> භාවිත කරමින් සිටිති.</item>
+ <item quantity="other">යෙදුම් <xliff:g id="NUM_APPS_4">%1$d</xliff:g>ක් ඔබේ <xliff:g id="TYPE_5">%2$s</xliff:g> භාවිත කරමින් සිටිති.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"විස්තර බලන්න"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ඔබගේ <xliff:g id="TYPES_LIST">%s</xliff:g> භාවිත කරන යෙදුම්"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ඔබගේ <xliff:g id="TYPES_LIST">%s</xliff:g> භාවිත කරන යෙදුම්"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index bcc444f39157..28b3d24a1671 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Povoliť ladenie USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Digitálny odtlačok RSA počítača je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Vždy povoliť z tohto počítača"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ladenie cez USB nie je povolené"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Používateľ, ktorý je práve prihlásený v tomto zariadení, nemôže zapnúť ladenie USB. Ak chcete použiť túto funkciu, prepnite na hlavného používateľa."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Priblížiť na celú obrazovku"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Na celú obrazovku"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Snímka obrazovky"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Zrušiť"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblasť správy pomocníka"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdiť"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Skúsiť znova"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Klepnite na senzor odtlačkov prstov"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odtlačku prsta"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hľadáme vás…"</string>
@@ -236,11 +241,11 @@
<string name="accessibility_quick_settings_close" msgid="3115847794692516306">"Zavrieť panel"</string>
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Dlhší čas"</string>
<string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Kratší čas"</string>
- <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Svietidlo je vypnuté."</string>
- <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Svietidlo nie je k dispozícii."</string>
- <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Svietidlo je zapnuté."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Svietidlo je vypnuté."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Svietidlo je zapnuté."</string>
+ <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Baterka je vypnutá."</string>
+ <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Baterka nie je k dispozícii."</string>
+ <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Baterka je zapnutá."</string>
+ <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Baterka je vypnutá."</string>
+ <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Baterka je zapnutá."</string>
<string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"Prevrátenie farieb je vypnuté."</string>
<string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"Prevrátenie farieb je zapnuté."</string>
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilný hotspot je vypnutý."</string>
@@ -298,8 +303,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Náhlavná súprava"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vstup"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Načúvacie pomôcky"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Zapína sa…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jas"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatické otáčanie"</string>
@@ -617,17 +621,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Tieto upozornenia zvyčajne odmietate. \nChcete ich naďalej zobrazovať?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Majú sa tieto upozornenia naďalej zobrazovať?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Prestať zobrazovať upozornenia"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokovať"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Naďalej zobrazovať"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimalizovať"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Zobraziť potichu"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Naďalej upozorňovať potichu"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Upozorniť ma"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Naďalej upozorňovať"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Majú sa upozornenia z tejto aplikácie naďalej zobrazovať?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Tieto upozornenia sa nedajú vypnúť"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"prostredníctvom aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavenia"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Dobre"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Výpis haldy SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikácie</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikácií</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikácia</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> používa zoznam <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikácie používajú zoznam <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Zrušiť"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="few"><xliff:g id="TYPE_3">%2$s</xliff:g> používajú <xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikácie</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> používa <xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikácií</item>
+ <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> používa <xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikácia.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Podrobnosti"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikácia používajúca <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikácie používajúce <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 706e7002a749..b25a49d68a01 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Ali dovolite odpravljanje težav prek USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Računalnikov prstni odtis ključa RSA je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Vedno dovoli iz tega računalnika"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Odpravljanje napak s povezavo USB ni dovoljeno"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Uporabnik, trenutno prijavljen v napravo, ne more vklopiti odpravljanja napak s povezavo USB. Če želite uporabljati to funkcijo, preklopite na primarnega uporabnika."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Povečava čez cel zaslon"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Raztegnitev čez zaslon"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Posnetek zaslona"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Prekliči"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Območje sporočila pomoči"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potrdite"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Poskusi znova"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotaknite se tipala prstnih odtisov"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona prstnih odtisov"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Preverjanje vašega obraza …"</string>
@@ -298,8 +303,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvok"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalke z mikrofonom"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vhodna naprava"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni pripomočki"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Vklapljanje …"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Svetlost"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Samodejno sukanje"</string>
@@ -617,17 +621,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Ta obvestila običajno opustite. \nAli želite, da se še naprej prikazujejo?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Želite, da so ta obvestila še naprej prikazana?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Ustavi prikazovanje obvestil"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Prikazuj še naprej"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimiraj"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži brez zvoka"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Še naprej prikazuj brez zvoka"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Opozori me"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Še naprej opozarjaj"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite, da so obvestila te aplikacije še naprej prikazana?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Teh obvestil ni mogoče izklopiti"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"prek aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavitve"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"V redu"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Izvoz kopice SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item>
+ <item quantity="two"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikaciji</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacij</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> uporablja <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije uporabljajo <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Prekliči"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija uporablja <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="two"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikaciji uporabljata <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije uporabljajo <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacij uporablja <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Podrobnosti"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacija, ki uporablja te funkcije: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije, ki uporabljajo te funkcije: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 66a577811bf5..1642e9987246 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Të lejohet korrigjimi i USB-së?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Shenja e gishtit të tastit \"RSA\" së kompjuterit është:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Lejo gjithmonë nga ky kompjuter"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Korrigjimi i USB-së nuk lejohet"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Përdoruesi i identifikuar aktualisht në këtë pajisje nuk mund ta aktivizojë korrigjimin e USB-së. Për ta përdorur këtë funksion, kalo te përdoruesi parësor."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zmadho për të mbushur ekranin"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Shtrije për të mbushur ekranin"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Pamja e ekranit"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Anulo"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona e mesazhit të ndihmës"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmo"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Provo përsëri"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Prek sensorin e gjurmës së gishtit"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona e gjurmës së gishtit"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Po të kërkojmë…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Kufje me mikrofon"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Hyrja"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparatet e dëgjimit"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Po aktivizohet…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ndriçimi"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rrotullim automatik"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Këto njoftime ti zakonisht i largon. \nDëshiron të vazhdosh t\'i shfaqësh ato?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Do të vazhdosh t\'i shfaqësh këto njoftime?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Ndalo njoftimet"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blloko"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Vazhdo të shfaqësh"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizo"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Shfaq në heshtje"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Qëndro në heshtje"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Më sinjalizo"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Vazhdo të sinjalizosh"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Do të vazhdosh t\'i shfaqësh njoftimet nga ky aplikacion?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Këto njoftime nuk mund të çaktivizohen"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"nëpërmjet <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Cilësimet"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"E kuptova"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Hidh grumbullin SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacione</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikacion</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> po përdor <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacionet po përdorin <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Anulo"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacione po përdorin <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikacion po përdor <xliff:g id="TYPE_1">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Shiko detajet"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacionet që po përdorin <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacionet që po përdorin <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 1ff65d782fc0..dac91a87064e 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Желите ли да дозволите отклањање USB грешака?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Дигитални отисак RSA кључа овог рачунара је:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Увек дозволи са овог рачунара"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отклањање грешака на USB-у није дозвољено"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Корисник који је тренутно пријављен на овај уређај не може да укључи отклањање грешака на USB-у. Да бисте користили ову функцију, пребаците на примарног корисника."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Зумирај на целом екрану"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Развуци на цео екран"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Снимак екрана"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Откажи"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област поруке за помоћ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Пробај поново"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Додирните сензор за отисак прста"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона отиска прста"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Тражимо вас…"</string>
@@ -297,8 +302,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Слушалице"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Унос"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слушни апарати"</string>
<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>
@@ -614,17 +618,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Обично одбацујете ова обавештења. \nЖелите ли да се и даље приказују?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Желите ли да се ова обавештења и даље приказују?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Престани да приказујеш обавештења"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Блокирај"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Настави да приказујеш"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Умањи"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Прикажи без звука"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Не укључуј звук"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Обавести ме"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Настави са обавештењима"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Желите ли да се обавештења из ове апликације и даље приказују?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Не можете да искључите ова обавештења"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"преко апликације <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -876,11 +876,20 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Подешавања"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Важи"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Издвоји SysUI мем."</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликација</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> апликације</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликација</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> користи <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Апликације користе <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Откажи"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликација користи дозволу <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> апликације користе дозволу <xliff:g id="TYPE_3">%2$s</xliff:g>.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликација користи дозволу <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Прикажи детаље"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Апликација која користи дозволе <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Апликације које користе дозволе <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 3c8c3abef06a..ff0d0c0f24bb 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Ska USB-felsökning tillåtas?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Fingeravtrycket för datorns RSA-nyckel är:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Tillåt alltid på den här datorn"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-felsökning är inte tillåtet"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Användaren som är inloggad på enheten för närvarande kan inte aktivera USB-felsökning. Byt till den primära användaren om du vill använda den här funktionen."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Zooma för att fylla skärm"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Dra för att fylla skärmen"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skärmdump"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Avbryt"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område för hjälpmeddelande"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekräfta"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Försök igen"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tryck på fingeravtryckssensorn"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon för fingeravtryck"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Håller utkik efter dig …"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ljud"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ingång"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hörapparater"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktiverar …"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ljusstyrka"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotera automatiskt"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Du brukar avvisa de här aviseringarna. \nVill du fortsätta att visa dem?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Vill du fortsätta visa de här aviseringarna?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stoppa aviseringar"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Blockera"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Fortsätt visa"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Minimera"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Visa utan ljud"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Fortsätt visa utan ljud"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Meddela mig"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsätt meddela"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vill du fortsätta visa aviseringar för den här appen?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"De här aviseringarna kan inte inaktiveras"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Inställningar"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dumpa SysUI-heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> appar</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="TYPES_LIST">%2$s</xliff:g> används av <xliff:g id="APP">%1$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"<xliff:g id="TYPES_LIST">%s</xliff:g> används av appar."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Avbryt"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> används av <xliff:g id="NUM_APPS_4">%1$d</xliff:g> appar.</item>
+ <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> används av <xliff:g id="NUM_APPS_0">%1$d</xliff:g> app.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Läs mer"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"En app använder din <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Appar använder dina <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 69b3be7ffbc4..dbb3a8d4e224 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Ruhusu utatuaji wa USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Alama ya kidole ya kitufe cha RSA ya kompyuta ni:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Ruhusu kutoka kwenye kompyuta hii kila wakati"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Utatuzi wa USB hauruhusiwi"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Mtumiaji aliyeingia katika akaunti kwa kutumia kifaa hiki kwa sasa hawezi kuwasha utatuzi wa USB. Ili utumie kipengele hiki, tumia akaunti ya mtumiaji wa msingi."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Kuza ili kujaza skrini"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Tanua ili kujaza skrini"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Picha ya skrini"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Ghairi"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Sehemu ya ujumbe wa usaidizi"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Thibitisha"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Jaribu tena"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Gusa kitambua alama ya kidole"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Aikoni ya alama ya kidole"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Inakutafuta…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Sauti"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Vifaa vya sauti"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vifaa vya kuingiza sauti"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Visaidizi vya Kusikia"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Inawasha..."</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ung\'avu"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Zungusha kiotomatiki"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Wewe huondoa arifa hizi. \nUngependa kuzionyesha?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Ungependa kuendelea kuonyesha arifa hizi?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Acha kuonyesha arifa"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Zuia"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Endelea kuonyesha"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Punguza"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Ionyeshe bila kutoa sauti"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Isitoe sauti"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Niarifu"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Endelea kutoa arifa"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Ungependa kuendelea kuonyesha arifa kutoka programu hii?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Huwezi kuzima arifa hizi"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"kupitia <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Mipangilio"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Nimeelewa"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other">Programu <xliff:g id="NUM_APPS_2">%d</xliff:g></item>
+ <item quantity="one">Programu <xliff:g id="NUM_APPS_0">%d</xliff:g></item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> inatumia <xliff:g id="TYPES_LIST">%2$s</xliff:g> yako."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Programu zinatumia <xliff:g id="TYPES_LIST">%s</xliff:g> yako."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Ghairi"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other">Programu <xliff:g id="NUM_APPS_4">%1$d</xliff:g> zinatumia <xliff:g id="TYPE_5">%2$s</xliff:g> yako.</item>
+ <item quantity="one">Programu <xliff:g id="NUM_APPS_0">%1$d</xliff:g> inatumia <xliff:g id="TYPE_1">%2$s</xliff:g> yako.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Angalia maelezo"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Programu inayotumia <xliff:g id="TYPES_LIST">%s</xliff:g> yako"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Programu zinazotumia <xliff:g id="TYPES_LIST">%s</xliff:g> yako"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index f75cc4dec1b6..0ef8bbf807d6 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB பிழைத்திருத்தத்தை அனுமதிக்கவா?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"பின்வருவது கணினியின் RSA விசை கைரேகையாகும்:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"இந்தக் கணினியிலிருந்து எப்போதும் அனுமதி"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB பிழைத்திருத்தம் அனுமதிக்கப்படவில்லை"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"தற்போது இந்தச் சாதனத்தில் உள்நுழைந்துள்ள பயனரால் USB பிழைத்திருத்தத்தை இயக்க முடியாது. இந்த அம்சத்தை இயக்க, முதன்மைப் பயனருக்கு மாறவும்."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"திரையை நிரப்ப அளவை மாற்று"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"திரையை நிரப்ப இழு"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ஸ்கிரீன் ஷாட்"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"உதவிச் செய்திக்கான பகுதி"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"உறுதிப்படுத்துக"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"மீண்டும் முயல்க"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"கைரேகை உணர்வியைத் தொடவும்"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"கைரேகை ஐகான்"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"உங்கள் முகத்தைத் தேடுகிறது…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ஆடியோ"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ஹெட்செட்"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"உள்ளீடு"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"செவித்துணை கருவிகள்"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"வழக்கமாக, இந்த அறிவிப்புகளை நிராகரிக்கிறீர்கள். \nதொடர்ந்து இவற்றைக் காட்டலாமா?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"இந்த அறிவிப்புகளைத் தொடர்ந்து காட்டவா?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"அறிவிப்புகளை நிறுத்து"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"தடு"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"அறிவிப்புகளைத் தொடர்ந்து காட்டு"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"சிறிதாக்கு"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"ஒலிக்காமல் காட்டு"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"அறிவிப்புகளை ஒலியின்றிக் காட்டு"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"எனக்கு விழிப்பூட்டலை அனுப்பு"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"தொடர்ந்து விழிப்பூட்டு"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"இந்தப் பயன்பாட்டின் அறிவிப்புகளைத் தொடர்ந்து காட்டவா?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"இந்த அறிவிப்புகளை ஆஃப் செய்ய முடியாது"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> மூலமாக"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"அமைப்புகள்"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"சரி"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ஆப்ஸ்</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ஆப்ஸ்</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"உங்கள் <xliff:g id="TYPES_LIST">%2$s</xliff:g>ஐ <xliff:g id="APP">%1$s</xliff:g> ஆப்ஸ் பயன்படுத்துகிறது."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"உங்கள் <xliff:g id="TYPES_LIST">%s</xliff:g> ஆகியவற்றை ஆப்ஸ் பயன்படுத்துகின்றன."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ரத்துசெய்"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ஆப்ஸால் உங்கள் <xliff:g id="TYPE_5">%2$s</xliff:g> பயன்படுத்தப் படுகிறது.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ஆப்ஸால் உங்கள் <xliff:g id="TYPE_1">%2$s</xliff:g> பயன்படுத்தப் படுகிறது.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"விவரங்களைக் காட்டு"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"உங்கள் <xliff:g id="TYPES_LIST">%s</xliff:g> ஆகியவற்றைப் பயன்படுத்தும் ஆப்ஸ்"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"உங்கள் <xliff:g id="TYPES_LIST">%s</xliff:g> ஆகியவற்றைப் பயன்படுத்தும் ஆப்ஸ்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 894263ebf5bb..4b05f0f0b77e 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB డీబగ్గింగ్‌ను అనుమతించాలా?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ఇది కంప్యూటర్ యొక్క RSA కీ వేలిముద్ర:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ఈ కంప్యూటర్ నుండి ఎల్లప్పుడూ అనుమతించు"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB డీబగ్గింగ్‌కి అనుమతి లేదు"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ఈ పరికరానికి ప్రస్తుతం సైన్ ఇన్ చేసిన వినియోగదారు USB డీబగ్గింగ్ ఆన్ చేయలేరు. ఈ ఫీచర్ ఉపయోగించడానికి, ప్రాథమిక వినియోగదారుకి మారాలి."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"స్క్రీన్‌కు నింపేలా జూమ్ చేయండి"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"స్క్రీన్‌కు నింపేలా విస్తరించండి"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"స్క్రీన్‌షాట్"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"సహాయ సందేశ ప్రాంతం"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"నిర్ధారించు"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"మళ్లీ ప్రయత్నించు"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"వేలిముద్ర సెన్సార్‌ను తాకండి"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"వేలిముద్ర చిహ్నం"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"మీ కోసం చూస్తోంది…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ఆడియో"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"హెడ్‌సెట్"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ఇన్‌పుట్"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"వినికిడి పరికరాలు"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"మీరు సాధారణంగా ఈ నోటిఫికేషన్‌లను విస్మరిస్తారు. \nవాటి ప్రదర్శనను కొనసాగించాలా?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"ఈ నోటిఫికేషన్‌లను చూపిస్తూ ఉండాలా?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"నోటిఫికేషన్‌లను ఆపివేయి"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"బ్లాక్ చేయి"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"చూపిస్తూనే ఉండు"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"కుదించు"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"నిశ్శబ్దంగా చూపండి"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"నిశబ్దంగా తెలియజేయి"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"నన్ను హెచ్చరించు"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ఎప్పటికప్పుడు హెచ్చరించు"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ఈ యాప్ నుండి నోటిఫికేషన్‌లను చూపిస్తూ ఉండాలా?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ఈ నోటిఫికేషన్‌లను ఆఫ్ చేయలేరు"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ద్వారా"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"సెట్టింగ్‌లు"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"అర్థమైంది"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"డంప్ SysUI హీప్"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> యాప్‌లు</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> యాప్</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> మీ <xliff:g id="TYPES_LIST">%2$s</xliff:g>ని ఉపయోగిస్తోంది."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"అప్లికేషన్‌లు మీ <xliff:g id="TYPES_LIST">%s</xliff:g>ని ఉపయోగిస్తున్నాయి."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"రద్దు చేయండి"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> అప్లికేషన్‌లు మీ <xliff:g id="TYPE_5">%2$s</xliff:g>ని ఉపయోగిస్తున్నాయి.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> అప్లికేషన్‌ మీ <xliff:g id="TYPE_1">%2$s</xliff:g>ని ఉపయోగిస్తుంది.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"వివరాలను చూడండి"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"మీ <xliff:g id="TYPES_LIST">%s</xliff:g> ఉపయోగించే యాప్‌"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"మీ<xliff:g id="TYPES_LIST">%s</xliff:g> ఉపయోగిస్తున్న యాప్‌లు"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index ae581aca2325..707bcf9efd0c 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"อนุญาตให้แก้ไขข้อบกพร่อง USB หรือไม่"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ลายนิ้วมือหลัก RSA ของคอมพิวเตอร์คือ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"อนุญาตจากคอมพิวเตอร์เครื่องนี้เสมอ"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์อยู่ในขณะนี้ไม่สามารถเปิดการแก้ไขข้อบกพร่องผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ ให้เปลี่ยนไปเป็นผู้ใช้หลัก"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"ขยายจนเต็มหน้าจอ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ยืดจนเต็มหน้าจอ"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"ภาพหน้าจอ"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"ยกเลิก"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"พื้นที่ข้อความช่วยเหลือ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ยืนยัน"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ลองอีกครั้ง"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"แตะเซ็นเซอร์ลายนิ้วมือ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ไอคอนลายนิ้วมือ"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"กำลังหาใบหน้าคุณ…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"เสียง"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ชุดหูฟัง"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"อินพุต"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"เครื่องช่วยการได้ยิน"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"โดยปกติแล้ว คุณจะปิดการแจ้งเตือนเหล่านี้ \nต้องการให้แสดงต่อไหม"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"แสดงการแจ้งเตือนเหล่านี้ต่อไปไหม"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"ปิดการแจ้งเตือน"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"บล็อก"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"แสดงต่อไป"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"ย่อเล็กสุด"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"แสดงโดยไม่ส่งเสียง"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ปิดเสียงไว้"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"แจ้งเตือนฉัน"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"แจ้งเตือนต่อไป"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"แสดงการแจ้งเตือนจากแอปนี้ต่อไปไหม"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ปิดการแจ้งเตือนเหล่านี้ไม่ได้"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"ผ่าน <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"การตั้งค่า"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"รับทราบ"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> แอป</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> แอป</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ใช้<xliff:g id="TYPES_LIST">%2$s</xliff:g>ของคุณอยู่"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"หลายแอปพลิเคชันใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณอยู่"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ยกเลิก"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other">มี <xliff:g id="NUM_APPS_4">%1$d</xliff:g> แอปพลิเคชันกำลังใช้<xliff:g id="TYPE_5">%2$s</xliff:g></item>
+ <item quantity="one">มี <xliff:g id="NUM_APPS_0">%1$d</xliff:g> แอปพลิเคชันกำลังใช้<xliff:g id="TYPE_1">%2$s</xliff:g></item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ดูรายละเอียด"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"มีแอปกำลังใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณ"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"มีหลายแอปกำลังใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณ"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index ab20ff0780ea..1d9460ca98d3 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Payagan ang pag-debug ng USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Ang RSA key fingerprint ng computer ay:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Palaging payagan mula sa computer na ito"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Hindi pinapayagan ang pagde-debug sa pamamagitan ng USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Hindi mao-on ng user na kasalukuyang naka-sign in sa device na ito ang pag-debug ng USB. Upang magamit ang feature na ito, lumipat sa pangunahing user."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"I-zoom upang punan screen"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"I-stretch upang mapuno screen"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Kanselahin"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Lugar ng mensahe ng tulong"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kumpirmahin"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Subukang muli"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pindutin ang fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icon ng fingerprint"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hinahanap ka…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Mga Hearing Aid"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ino-on…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Awtomatikong i-rotate"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Karaniwan mong dini-dismiss ang mga ganitong notification. \nPatuloy na ipakita ang mga ito?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Patuloy na ipakita ang mga notification na ito?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Ihinto ang mga notification"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"I-block"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Patuloy na ipakita"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"I-minimize"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Ipakita nang tahimik"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Manatiling naka-silent"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alertuhan ako"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Patuloy na mag-alerto"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Patuloy na ipakita ang mga notification mula sa app na ito?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Hindi maaaring i-off ang mga notification na ito"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"sa pamamagitan ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Mga Setting"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Itapon SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> na app</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Ginagamit ng <xliff:g id="APP">%1$s</xliff:g> ang iyong <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Ginagamit ng mga application ang iyong <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Kanselahin"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one">Ginagamit ng <xliff:g id="NUM_APPS_4">%1$d</xliff:g> application ang iyong <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ <item quantity="other">Ginagamit ng <xliff:g id="NUM_APPS_4">%1$d</xliff:g> na application ang iyong <xliff:g id="TYPE_5">%2$s</xliff:g>.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Tingnan ang mga detalye"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App na gumagamit ng iyong <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Mga app na gumagamit ng iyong <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 32201fb6054b..021772028d49 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB hata ayıklamasına izin verilsin mi?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Bilgisayarın RSA anahtarı parmak izi:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Bu bilgisayardan her zaman izin ver"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB hata ayıklama işlevine izin verilmiyor"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Bu cihazda geçerli olarak oturum açmış olan kullanıcı, USB hata ayıklama özelliğini açamaz. Bu özelliği kullanmak için birincil kullanıcıya geçin."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Yakınlaştır (ekranı kaplasın)"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Genişlet (ekran kapansın)"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Ekran görüntüsü"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"İptal"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı alanı"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Onaylayın"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tekrar dene"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Parmak izi sensörüne dokunun"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Parmak izi simgesi"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yüzünüz tanınmaya çalışılıyor…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ses"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Mikrofonlu kulaklık"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Giriş"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"İşitme Cihazları"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Açılıyor…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Parlaklık"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Otomatik döndür"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Bu bildirimleri genellikle kapatıyorsunuz. \nBildirimler gösterilmeye devam edilsin mi?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Bu bildirimler gösterilmeye devam edilsin mi?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Bildirimleri durdur"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Engelle"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Göstermeye devam et"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Küçült"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Sessiz bir şekilde göster"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Sessiz uyarı göster"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Beni uyar"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Uyarıda bulunmaya devam et"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu uygulamadan gelen bildirimler gösterilmeye devam edilsin mi?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirimler kapatılamaz"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ile"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Ayarlar"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Anladım"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI Yığın Dökümü"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> uygulama</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> uygulama</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> şunları kullanıyor: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Uygulamalar şunları kullanıyor: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"İptal"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> uygulama, cihazınızın <xliff:g id="TYPE_5">%2$s</xliff:g> özelliğini kullanıyor.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> uygulama, cihazınızın <xliff:g id="TYPE_1">%2$s</xliff:g> özelliğini kullanıyor.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ayrıntıları göster"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Uygulama cihazınızın <xliff:g id="TYPES_LIST">%s</xliff:g> özelliklerini kullanıyor"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Uygulamalar cihazınızın <xliff:g id="TYPES_LIST">%s</xliff:g> özelliklerini kullanıyor"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index a298c6a26589..69ed197aa265 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Дозволити налагодження USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Цифровий відбиток ключа RSA комп’ютера:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Завжди дозволяти з цього комп’ютера"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ви не можете вмикати налагодження USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Користувач поточного облікового запису не може вмикати налагодження USB. Щоб увімкнути цю функцію, увійдіть в обліковий запис основного користувача."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Масштабув. на весь екран"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Розтягнути на весь екран"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Знімок екрана"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Скасувати"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Область довідкового повідомлення"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Підтвердити"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Повторити спробу"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Торкніться сканера відбитків пальців"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок відбитка пальця"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Пошук обличчя…"</string>
@@ -298,8 +303,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудіопристрій"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнітура"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Джерело сигналу"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слухові апарати"</string>
<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>
@@ -617,17 +621,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Ви зазвичай закриваєте ці сповіщення. \nПоказувати їх?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Чи показувати ці сповіщення надалі?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Не показувати сповіщення"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Блокувати"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Показувати надалі"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Згорнути"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Показувати без звуку"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Без звуку"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Сповіщати мене"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Отримувати сповіщення"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Чи показувати сповіщення з цього додатка надалі?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ці сповіщення не можна вимкнути"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"через додаток <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -881,11 +881,22 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Налаштування"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> додаток</item>
+ <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> додатки</item>
+ <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> додатків</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> додатка</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Додаток <xliff:g id="APP">%1$s</xliff:g> використовує <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Додатки використовують <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Скасувати"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="TYPE_5">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_4">%1$d</xliff:g> додатку.</item>
+ <item quantity="few"><xliff:g id="TYPE_3">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_2">%1$d</xliff:g> додатках.</item>
+ <item quantity="many"><xliff:g id="TYPE_5">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_4">%1$d</xliff:g> додатках.</item>
+ <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_4">%1$d</xliff:g> додатка.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Докладніше"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Додаток, яким використовується <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Додатки, якими використовується <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index ee9da5e923d6..59e8946a30f1 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"‏USB ڈیبگ کرنے کی اجازت دیں؟"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"‏کمپیوٹر کے RSA کا کلیدی فنگر پرنٹ ہے:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"اس کمپیوٹر سے ہمیشہ اجازت دیں"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"‏USB ڈیبگ کرنے کی اجازت نہیں ہے"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"‏اس آلہ پر فی الحال سائن ان کردہ صارف USB ڈیبگنگ آن نہیں کر سکتا۔ اس خصوصیت کا استعمال کرنے کیلئے، ابتدائی صارف پر سوئچ کریں۔"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"پوری سکرین پر زوم کریں"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"پوری سکرین پر پھیلائیں"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"اسکرین شاٹ"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"منسوخ کریں"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"امدادی پیغام کا علاقہ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"تصدیق کریں"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"دوبارہ کوشش کریں"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"فنگر پرنٹ سینسر پر ٹچ کریں"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"فنگر پرنٹ آئیکن"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"آپ کے لیے تلاش کیا جا رہا ہے…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"آڈیو"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ہیڈ سیٹ"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ان پٹ"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"سماعتی آلات"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"آپ عام طور پر ان اطلاعات کو مسترد کرتے ہیں۔ \nان کو دکھاتے رہیں؟"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"یہ اطلاعات دکھانا جاری رکھیں؟"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"اطلاعات روک دیں"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"مسدود کریں"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"دکھانا جاری رکھیں"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"چھوٹا کریں"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"خاموشی سے دکھائیں"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"خاموش رہیں"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"مجھے متنبہ کریں"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"متنبہ کرنا جاری رکھیں"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"اس ایپ کی طرف سے اطلاعات دکھانا جاری رکھیں؟"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ان اطلاعات کو آف نہیں کیا جا سکتا"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"بذریعہ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"ترتیبات"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"سمجھ آ گئی"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ایپس</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ایپ</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> آپ کی <xliff:g id="TYPES_LIST">%2$s</xliff:g> کا استعمال کر رہی ہے۔"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ایپلیکیشنز آپ کی <xliff:g id="TYPES_LIST">%s</xliff:g> کا استعمال کر رہی ہیں۔"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"منسوخ کریں"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ایپلیکیشنز آپ کی <xliff:g id="TYPE_5">%2$s</xliff:g> کا استعمال کر رہی ہیں۔</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ایپلیکیشن آپ کی <xliff:g id="TYPE_1">%2$s</xliff:g> کا استعمال کر رہی ہے۔</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"تفصیلات دیکھیں"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ایپ آپ کی <xliff:g id="TYPES_LIST">%s</xliff:g> کا استعمال کر رہی ہیں"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ایپس آپ کی <xliff:g id="TYPES_LIST">%s</xliff:g> کا استعمال کر رہی ہیں"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 488bfaed333c..85204afc1eeb 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB orqali nosozliklarni tuzatishga ruxsat berilsinmi?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Kompyuterning RSA tugmasi barmoq izlari:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Doimo ushbu kompyuterdan ruxsat berilsin"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB orqali nosozliklarni tuzatishga ruxsat berilmagan"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni tuzatish funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Ekranga moslashtirish"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Ekran hajmida cho‘zish"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Skrinshot"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Bekor qilish"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yordam xabari"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"OK"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Qayta urinish"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmoq izi skaneriga tegining"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yuzingiz tekshirilmoqda…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Garnitura"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Kirish"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Eshitish apparatlari"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Yoqilmoqda…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Yorqinlik"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Avtomatik burilish"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Odatda bunday bildirishnomalarni yopasiz. \nUlar ochiq tursinmi?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Mazkur bildirishnomalar chiqaversinmi?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Chiqmasin"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Bloklash"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Ha"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Kichraytirish"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Ovozsiz"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Ovozsiz qolsin"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Ogohlantirish"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Signal berishda davom etilsin"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu ilovadan keladigan bildirishnomalar chiqaversinmi?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirishnomalarni chiqmaydigan qilish imkonsiz"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> orqali"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Sozlamalar"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ta ilova</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ta ilova</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ishlatmoqda: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Ilovalarda ishlatilmoqda: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Bekor qilish"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ta ilova <xliff:g id="TYPE_5">%2$s</xliff:g> ishlatmoqda.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ta ilova <xliff:g id="TYPE_1">%2$s</xliff:g> ishlatmoqda.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Tafsilotlar"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> ishlatayotgan ilova"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Ilovalar <xliff:g id="TYPES_LIST">%s</xliff:g> ishlatmoqda"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 125eb727b903..d2b1384c2b69 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Cho phép gỡ lỗi USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Tệp tham chiếu khóa RSA của máy tính là:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Luôn cho phép từ máy tính này"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Tính năng gỡ lỗi USB không được phép"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi USB. Để sử dụng tính năng này, hãy chuyển sang người dùng chính."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"T.phóng để lấp đầy m.hình"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Giãn ra để lấp đầy m.hình"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Chụp ảnh màn hình"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Hủy"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Vùng thông báo trợ giúp"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Xác nhận"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Thử lại"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Chạm vào cảm biến vân tay"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Biểu tượng vân tay"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Đang tìm kiếm bạn…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Âm thanh"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Tai nghe"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Thiết bị đầu vào"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Thiết bị trợ thính"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Đang bật…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Độ sáng"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Tự động xoay"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Bạn thường bỏ qua những thông báo này. \nTiếp tục hiển thị thông báo?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Tiếp tục hiển thị các thông báo này?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Dừng thông báo"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Chặn"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Tiếp tục hiển thị"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Thu nhỏ"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Hiển thị không phát âm báo"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Tiếp tục chế độ im lặng"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Cảnh báo cho tôi"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Tiếp tục cảnh báo"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Tiếp tục hiển thị các thông báo từ ứng dụng này?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Không thể tắt các thông báo này"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"thông qua <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Cài đặt"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"Trích xuất bộ nhớ SysUI"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ứng dụng</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ứng dụng</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> đang dùng <xliff:g id="TYPES_LIST">%2$s</xliff:g> của bạn."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Các ứng dụng đang dùng <xliff:g id="TYPES_LIST">%s</xliff:g> của bạn."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Hủy"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ứng dụng đang dùng <xliff:g id="TYPE_5">%2$s</xliff:g> của bạn.</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ứng dụng đang dùng <xliff:g id="TYPE_1">%2$s</xliff:g> của bạn.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Xem chi tiết"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Ứng dụng đang sử dụng <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Các ứng dụng đang sử dụng <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index d6fd3d8927f1..b1eff03a76eb 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"允许 USB 调试吗?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"这台计算机的 RSA 密钥指纹如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"一律允许使用这台计算机进行调试"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"不允许使用 USB 调试功能"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"缩放以填满屏幕"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"拉伸以填满屏幕"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"屏幕截图"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"取消"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"帮助消息区域"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"确认"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"重试"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"请触摸指纹传感器"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指纹图标"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在查找中…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"音频"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"耳机"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"输入"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"助听器"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"您通常会关闭这些通知。\n是否继续显示通知?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"要继续显示这些通知吗?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"停止通知"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"屏蔽"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"继续显示"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"显示通知但不发出提示音"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"显示通知但不发出提示音"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"提醒我"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"继续提醒"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"要继续显示来自此应用的通知吗?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"无法关闭这些通知"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"通过<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"设置"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"知道了"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"转储 SysUI 堆"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> 个应用</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> 个应用</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>正在使用您的<xliff:g id="TYPES_LIST">%2$s</xliff:g>。"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"有多个应用正在使用您的<xliff:g id="TYPES_LIST">%s</xliff:g>。"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"取消"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> 个应用正在使用您的<xliff:g id="TYPE_5">%2$s</xliff:g>。</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> 个应用正在使用您的<xliff:g id="TYPE_1">%2$s</xliff:g>。</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"查看详情"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"正在使用您的<xliff:g id="TYPES_LIST">%s</xliff:g>的应用"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"正在使用您的<xliff:g id="TYPES_LIST">%s</xliff:g>的应用"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 5c2a5d271071..64f4e218b78a 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"允許 USB 除錯嗎?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"這部電腦的 RSA 密鑰指紋如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"一律允許透過這部電腦進行"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"不允許 USB 偵錯"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前登入此裝置的使用者無法啟用 USB 偵錯功能。如要使用此功能,請切換至主要使用者。"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"取消"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"請再試一次"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在搜尋您的臉孔…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"音訊"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"耳機"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"輸入"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"助聽器"</string>
<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>
@@ -307,7 +311,7 @@
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"直向"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"橫向"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"輸入法"</string>
- <string name="quick_settings_location_label" msgid="5011327048748762257">"位置資訊"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"定位"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"位置資訊已關閉"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"媒體裝置"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"您通常會關閉這些通知。\n要繼續顯示通知嗎?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"要繼續顯示這些通知嗎?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"停止通知"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"封鎖"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"繼續顯示"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"顯示通知但不發出音效"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"保持靜音"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"提示我"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"繼續提示"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"要繼續顯示此應用程式的通知嗎?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"無法關閉這些通知"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"透過「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"知道了"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"傾印 SysUI 記憶體快照"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> 個應用程式</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> 個應用程式</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"「<xliff:g id="APP">%1$s</xliff:g>」正在使用<xliff:g id="TYPES_LIST">%2$s</xliff:g>。"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"有多個應用程式正在使用<xliff:g id="TYPES_LIST">%s</xliff:g>。"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"取消"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other">有 <xliff:g id="NUM_APPS_4">%1$d</xliff:g> 個應用程式正在使用您的<xliff:g id="TYPE_5">%2$s</xliff:g>。</item>
+ <item quantity="one">有 <xliff:g id="NUM_APPS_0">%1$d</xliff:g> 個應用程式正在使用您的<xliff:g id="TYPE_1">%2$s</xliff:g>。</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"查看詳情"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index dbe24bb33bd6..bd1896a025ef 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"允許 USB 偵錯嗎?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"這台電腦的 RSA 金鑰指紋如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"一律允許透過這台電腦進行"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"無權使用 USB 偵錯功能"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前登入這個裝置的使用者無法啟用 USB 偵錯功能。如要使用這項功能,請切換到主要使用者。"</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"取消"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"再試一次"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在尋找你的臉孔…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"音訊"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"耳機"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"輸入"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"助聽器"</string>
<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>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"你通常會關閉這些通知。\n要繼續顯示通知嗎?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"要繼續顯示這些通知嗎?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"停止顯示通知"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"封鎖"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"繼續顯示"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"顯示通知但不發出音效"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"繼續顯示通知但不發出音效"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"顯示通知"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"繼續顯示通知"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"要繼續顯示這個應用程式的通知嗎?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"無法關閉這些通知"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"透過「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"我知道了"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"傾印 SysUI 記憶體快照"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> 個應用程式</item>
+ <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> 個應用程式</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"「<xliff:g id="APP">%1$s</xliff:g>」正在使用<xliff:g id="TYPES_LIST">%2$s</xliff:g>。"</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"有多個應用程式正在使用<xliff:g id="TYPES_LIST">%s</xliff:g>。"</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"取消"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="other">有 <xliff:g id="NUM_APPS_4">%1$d</xliff:g> 個應用程式正在使用你的<xliff:g id="TYPE_5">%2$s</xliff:g>。</item>
+ <item quantity="one">有 <xliff:g id="NUM_APPS_0">%1$d</xliff:g> 個應用程式正在使用你的<xliff:g id="TYPE_1">%2$s</xliff:g>。</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"查看詳細資料"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 098ed0167c70..9f704209cec6 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -57,8 +57,14 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"Vumela ukulungisa iphutha le-USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Izigxivizo zeminwe zokhiye we-RSA wekhompyutha ngu:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"Hlala uvumela njalo kusuka kule khompyutha"</string>
+ <!-- no translation found for usb_debugging_allow (2272145052073254852) -->
+ <skip />
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ukususa iphutha kwe-USB akuvunyelwe"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Umsebenzisi manje ongene ngemvume kule divayisi entsha akakwazi ukuvula ukulungisa amaphutha ku-USB. Ukuze usebenzise lesi sici, shintshela kumsebenzisi oyinhloko."</string>
+ <!-- no translation found for usb_contaminant_title (206854874263058490) -->
+ <skip />
+ <!-- no translation found for usb_contaminant_message (2205845572186473860) -->
+ <skip />
<string name="compat_mode_on" msgid="6623839244840638213">"Sondeza ukugcwalisa isikrini"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Nweba ukugcwalisa isikrini"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Isithombe-skrini"</string>
@@ -112,8 +118,7 @@
<string name="cancel" msgid="6442560571259935130">"Khansela"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Indawo yosizo lomlayezo"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Qinisekisa"</string>
- <!-- no translation found for biometric_dialog_try_again (1900185172633183201) -->
- <skip />
+ <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Zama futhi"</string>
<string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Thinta inzwa yesigxivizo somunwe"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Isithonjana sezigxivizo zeminwe"</string>
<string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Kufunwa wena…"</string>
@@ -296,8 +301,7 @@
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Umsindo"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ihedisethi"</string>
<string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Okokufaka"</string>
- <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) -->
- <skip />
+ <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Izinsiza zokuzwa"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Iyavula..."</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ukugqama"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Ukuphenduka okuzenzakalelayo"</string>
@@ -611,17 +615,13 @@
<string name="inline_blocking_helper" msgid="3055064577771478591">"Uvamise ukucashisa lezi zaziso. \nQhubeka ulokhu uzibonisa?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Qhubeka nokubonisa lezi zaziso?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Misa izaziso"</string>
- <!-- no translation found for inline_block_button (8735843688021655065) -->
- <skip />
+ <string name="inline_block_button" msgid="8735843688021655065">"Vimba"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Qhubeka nokubonisa"</string>
<string name="inline_minimize_button" msgid="966233327974702195">"Nciphisa"</string>
<string name="inline_silent_button_silent" msgid="4411510650503783646">"Bonisa ngokuthulile"</string>
- <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) -->
- <skip />
- <!-- no translation found for inline_silent_button_alert (7961887853830826523) -->
- <skip />
- <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) -->
- <skip />
+ <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Hlala uthulile"</string>
+ <string name="inline_silent_button_alert" msgid="7961887853830826523">"Ngazise"</string>
+ <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Qhubeka wazise"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Qhubeka nokubonisa izaziso kusuka kulolu hlelo lokusebenza?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Lezi zaziso azikwazi ukuvalwa"</string>
<string name="notification_delegate_header" msgid="9167022191405284627">"nge-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -871,11 +871,18 @@
<string name="open_saver_setting_action" msgid="8314624730997322529">"Izilungiselelo"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"Ngiyezwa"</string>
<string name="heap_dump_tile_name" msgid="9141031328971226374">"I-Dump SysUI Heap"</string>
- <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) -->
+ <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714">
+ <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> izinhlelo zokusebenza</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> izinhlelo zokusebenza</item>
+ </plurals>
<string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"I-<xliff:g id="APP">%1$s</xliff:g> isebenzisa i-<xliff:g id="TYPES_LIST">%2$s</xliff:g> yakho."</string>
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Izinhlelo zokusebenza zisebenzisa i-<xliff:g id="TYPES_LIST">%s</xliff:g> yakho."</string>
- <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) -->
- <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Khansela"</string>
+ <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088">
+ <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> izinhlelo zokusebenza zisebenzisa i-<xliff:g id="TYPE_5">%2$s</xliff:g> yakho.</item>
+ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> izinhlelo zokusebenza zisebenzisa i-<xliff:g id="TYPE_5">%2$s</xliff:g> yakho.</item>
+ </plurals>
+ <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) -->
+ <skip />
<string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Buka imininingwane"</string>
<string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Uhlelo lokusebenza olusebenzisa i-<xliff:g id="TYPES_LIST">%s</xliff:g> yakho"</string>
<string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Izinhlelo zokusebenza ezisebenzisa i-<xliff:g id="TYPES_LIST">%s</xliff:g> yakho"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 2aecc24e83c0..50409421a68b 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -19,8 +19,11 @@ package com.android.systemui;
import static android.view.Display.DEFAULT_DISPLAY;
import android.app.WallpaperManager;
+import android.content.BroadcastReceiver;
import android.content.ComponentCallbacks2;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.RecordingCanvas;
@@ -28,7 +31,9 @@ import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region.Op;
import android.hardware.display.DisplayManager;
+import android.opengl.GLSurfaceView;
import android.os.AsyncTask;
+import android.os.Build;
import android.os.Handler;
import android.os.Trace;
import android.service.wallpaper.WallpaperService;
@@ -39,6 +44,7 @@ import android.view.Surface;
import android.view.SurfaceHolder;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.glwallpaper.ImageWallpaperRenderer;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -51,12 +57,17 @@ import java.io.PrintWriter;
public class ImageWallpaper extends WallpaperService {
private static final String TAG = "ImageWallpaper";
private static final String GL_LOG_TAG = "ImageWallpaperGL";
+ // TODO: Testing purpose, need to remove later, b/123616712.
+ private static final String SENSOR_EVENT_AWAKE = "systemui.test.event.awake";
+ // TODO: Testing purpose, need to remove later, b/123616712.
+ private static final String SENSOR_EVENT_SLEEP = "systemui.test.event.sleep";
private static final boolean DEBUG = false;
private static final String PROPERTY_KERNEL_QEMU = "ro.kernel.qemu";
private static final long DELAY_FORGET_WALLPAPER = 5000;
private WallpaperManager mWallpaperManager;
private DrawableEngine mEngine;
+ private GLEngine mGlEngine;
@Override
public void onCreate() {
@@ -73,10 +84,112 @@ public class ImageWallpaper extends WallpaperService {
@Override
public Engine onCreateEngine() {
- mEngine = new DrawableEngine();
- return mEngine;
+ mGlEngine = new GLEngine(this);
+ return mGlEngine;
}
+ class GLEngine extends Engine {
+ private GLWallpaperSurfaceView mWallpaperSurfaceView;
+
+ GLEngine(Context context) {
+ mWallpaperSurfaceView = new GLWallpaperSurfaceView(context);
+ mWallpaperSurfaceView.setRenderer(
+ new ImageWallpaperRenderer(context, mWallpaperSurfaceView));
+ mWallpaperSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
+ setOffsetNotificationsEnabled(true);
+ }
+
+ @Override
+ public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) {
+ if (mWallpaperSurfaceView != null) {
+ mWallpaperSurfaceView.notifyAmbientModeChanged(inAmbientMode);
+ }
+ }
+
+ @Override
+ public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,
+ float yOffsetStep, int xPixelOffset, int yPixelOffset) {
+ if (mWallpaperSurfaceView != null) {
+ mWallpaperSurfaceView.notifyOffsetsChanged(xOffset, yOffset);
+ }
+ }
+
+ private class GLWallpaperSurfaceView extends GLSurfaceView implements ImageGLView {
+ private SensorEventListener mEventListener;
+ private WallpaperStatusListener mWallpaperChangedListener;
+
+ // TODO: Testing purpose, need to remove later, b/123616712.
+ /**
+ * For testing only: adb shell am broadcast -a <INTENT>
+ */
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent == null) {
+ return;
+ }
+ switch (intent.getAction()) {
+ case SENSOR_EVENT_AWAKE:
+ notifySensorEvents(true);
+ break;
+ case SENSOR_EVENT_SLEEP:
+ notifySensorEvents(false);
+ break;
+ }
+ }
+ };
+
+ GLWallpaperSurfaceView(Context context) {
+ super(context);
+ setEGLContextClientVersion(2);
+ // TODO: Testing purpose, need to remove later, b/123616712.
+ if (Build.IS_DEBUGGABLE) {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(SENSOR_EVENT_AWAKE);
+ filter.addAction(SENSOR_EVENT_SLEEP);
+ registerReceiver(mReceiver, filter);
+ }
+ }
+
+ @Override
+ public SurfaceHolder getHolder() {
+ return getSurfaceHolder();
+ }
+
+ @Override
+ public void setRenderer(Renderer renderer) {
+ super.setRenderer(renderer);
+ mEventListener = (SensorEventListener) renderer;
+ mWallpaperChangedListener = (WallpaperStatusListener) renderer;
+ }
+
+ private void notifySensorEvents(boolean reach) {
+ if (mEventListener != null) {
+ mEventListener.onSensorEvent(reach);
+ }
+ }
+
+ private void notifyAmbientModeChanged(boolean inAmbient) {
+ if (mWallpaperChangedListener != null) {
+ mWallpaperChangedListener.onAmbientModeChanged(inAmbient);
+ }
+ }
+
+ private void notifyOffsetsChanged(float xOffset, float yOffset) {
+ if (mWallpaperChangedListener != null) {
+ mWallpaperChangedListener.onOffsetsChanged(
+ xOffset, yOffset, getHolder().getSurfaceFrame());
+ }
+ }
+
+ @Override
+ public void render() {
+ requestRender();
+ }
+ }
+ }
+
+ // TODO: Remove this engine, tracking on b/123617158.
class DrawableEngine extends Engine {
private final Runnable mUnloadWallpaperCallback = () -> {
unloadWallpaper(false /* forgetSize */);
@@ -564,4 +677,46 @@ public class ImageWallpaper extends WallpaperService {
}
}
}
+
+ /**
+ * A listener to trace sensor event.
+ */
+ public interface SensorEventListener {
+
+ /**
+ * Called back while sensor event comes.
+ * @param reach The status of sensor.
+ */
+ void onSensorEvent(boolean reach);
+ }
+
+ /**
+ * A listener to trace status of image wallpaper.
+ */
+ public interface WallpaperStatusListener {
+
+ /**
+ * Called back while ambient mode changes.
+ * @param inAmbientMode true if is in ambient mode, false otherwise.
+ */
+ void onAmbientModeChanged(boolean inAmbientMode);
+
+ /**
+ * Called back while wallpaper offsets.
+ * @param xOffset The offset portion along x.
+ * @param yOffset The offset portion along y.
+ */
+ void onOffsetsChanged(float xOffset, float yOffset, Rect frame);
+ }
+
+ /**
+ * An abstraction for view of GLRenderer.
+ */
+ public interface ImageGLView {
+
+ /**
+ * Ask the view to render.
+ */
+ void render();
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index f66a57b6133c..9b3d7ed8f045 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -137,8 +137,10 @@ public class SystemUIFactory {
}
public NotificationIconAreaController createNotificationIconAreaController(Context context,
- StatusBar statusBar, StatusBarStateController statusBarStateController) {
- return new NotificationIconAreaController(context, statusBar, statusBarStateController);
+ StatusBar statusBar, StatusBarStateController statusBarStateController,
+ NotificationListener listener) {
+ return new NotificationIconAreaController(context, statusBar, statusBarStateController,
+ listener);
}
public KeyguardIndicationController createKeyguardIndicationController(Context context,
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
index 83fd9708e26a..8731bd52e0dd 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
@@ -238,14 +238,14 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
*/
public void setExpandedBubble(BubbleView bubbleToExpand) {
mExpandedBubble = bubbleToExpand;
- boolean prevExpanded = mIsExpanded;
- mIsExpanded = true;
- if (!prevExpanded) {
+ if (!mIsExpanded) {
// If we weren't previously expanded we should animate open.
animateExpansion(true /* expand */);
} else {
- // If we were expanded just update the views
+ // Otherwise just update the views
+ // TODO: probably animate / page to expanded one
updateExpandedBubble();
+ updatePointerPosition();
requestUpdate();
}
mExpandedBubble.getEntry().setShowInShadeWhenBubble(false);
@@ -387,7 +387,6 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
mIsExpanded = shouldExpand;
updateExpandedBubble();
applyCurrentState();
- //requestUpdate();
mIsAnimating = true;
@@ -400,7 +399,10 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
if (shouldExpand) {
mBubbleContainer.setController(mExpandedAnimationController);
mExpandedAnimationController.expandFromStack(
- mStackAnimationController.getStackPosition(), updateAfter);
+ mStackAnimationController.getStackPosition(), () -> {
+ updatePointerPosition();
+ updateAfter.run();
+ });
} else {
mBubbleContainer.cancelAllAnimations();
mExpandedAnimationController.collapseBackToStack(
@@ -649,10 +651,7 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
}
// Bubble with notification as expanded state doesn't need a header / title
mExpandedViewContainer.setHeaderText(null);
-
}
- float pointerPosition = mExpandedBubble.getPosition().x + (mExpandedBubble.getWidth() / 2);
- mExpandedViewContainer.setPointerPosition((int) pointerPosition);
}
private void applyCurrentState() {
@@ -690,6 +689,14 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F
}
}
+ private void updatePointerPosition() {
+ if (mExpandedBubble != null) {
+ float pointerPosition = mExpandedBubble.getPosition().x
+ + (mExpandedBubble.getWidth() / 2f);
+ mExpandedViewContainer.setPointerPosition((int) pointerPosition);
+ }
+ }
+
private void applyRowState(ExpandableNotificationRow view) {
view.reset();
view.setHeadsUp(false);
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java
new file mode 100644
index 000000000000..d03b00bcfc85
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java
@@ -0,0 +1,115 @@
+/*
+ * 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.glwallpaper;
+
+import static android.opengl.GLES20.GL_FRAGMENT_SHADER;
+import static android.opengl.GLES20.GL_VERTEX_SHADER;
+import static android.opengl.GLES20.glAttachShader;
+import static android.opengl.GLES20.glCompileShader;
+import static android.opengl.GLES20.glCreateProgram;
+import static android.opengl.GLES20.glCreateShader;
+import static android.opengl.GLES20.glGetAttribLocation;
+import static android.opengl.GLES20.glGetUniformLocation;
+import static android.opengl.GLES20.glLinkProgram;
+import static android.opengl.GLES20.glShaderSource;
+import static android.opengl.GLES20.glUseProgram;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * This class takes charge of linking shader codes and then return a handle for OpenGL ES program.
+ */
+class ImageGLProgram {
+ private static final String TAG = ImageGLProgram.class.getSimpleName();
+
+ private Context mContext;
+ private int mProgramHandle;
+
+ ImageGLProgram(Context context) {
+ mContext = context.getApplicationContext();
+ }
+
+ private int loadShaderProgram(int vertexId, int fragmentId) {
+ final String vertexSrc = getShaderResource(vertexId);
+ final String fragmentSrc = getShaderResource(fragmentId);
+ final int vertexHandle = getShaderHandle(GL_VERTEX_SHADER, vertexSrc);
+ final int fragmentHandle = getShaderHandle(GL_FRAGMENT_SHADER, fragmentSrc);
+ return getProgramHandle(vertexHandle, fragmentHandle);
+ }
+
+ private String getShaderResource(int shaderId) {
+ Resources res = mContext.getResources();
+ StringBuilder code = new StringBuilder();
+
+ try (BufferedReader reader = new BufferedReader(
+ new InputStreamReader(res.openRawResource(shaderId)))) {
+ String nextLine;
+ while ((nextLine = reader.readLine()) != null) {
+ code.append(nextLine).append("\n");
+ }
+ } catch (IOException | Resources.NotFoundException ex) {
+ Log.d(TAG, "Can not read the shader source", ex);
+ code = null;
+ }
+
+ return code == null ? "" : code.toString();
+ }
+
+ private int getShaderHandle(int type, String src) {
+ final int shader = glCreateShader(type);
+ if (shader == 0) {
+ Log.d(TAG, "Create shader failed, type=" + type);
+ return 0;
+ }
+ glShaderSource(shader, src);
+ glCompileShader(shader);
+ return shader;
+ }
+
+ private int getProgramHandle(int vertexHandle, int fragmentHandle) {
+ final int program = glCreateProgram();
+ if (program == 0) {
+ Log.d(TAG, "Can not create OpenGL ES program");
+ return 0;
+ }
+
+ glAttachShader(program, vertexHandle);
+ glAttachShader(program, fragmentHandle);
+ glLinkProgram(program);
+ return program;
+ }
+
+ boolean useGLProgram(int vertexResId, int fragmentResId) {
+ mProgramHandle = loadShaderProgram(vertexResId, fragmentResId);
+ glUseProgram(mProgramHandle);
+ return true;
+ }
+
+ int getAttributeHandle(String name) {
+ return glGetAttribLocation(mProgramHandle, name);
+ }
+
+ int getUniformHandle(String name) {
+ return glGetUniformLocation(mProgramHandle, name);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java
new file mode 100644
index 000000000000..4e07872c9456
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.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.systemui.glwallpaper;
+
+import static android.opengl.GLES20.GL_FLOAT;
+import static android.opengl.GLES20.GL_LINEAR;
+import static android.opengl.GLES20.GL_TEXTURE0;
+import static android.opengl.GLES20.GL_TEXTURE_2D;
+import static android.opengl.GLES20.GL_TEXTURE_MAG_FILTER;
+import static android.opengl.GLES20.GL_TEXTURE_MIN_FILTER;
+import static android.opengl.GLES20.GL_TRIANGLES;
+import static android.opengl.GLES20.glActiveTexture;
+import static android.opengl.GLES20.glBindTexture;
+import static android.opengl.GLES20.glDrawArrays;
+import static android.opengl.GLES20.glEnableVertexAttribArray;
+import static android.opengl.GLES20.glGenTextures;
+import static android.opengl.GLES20.glTexParameteri;
+import static android.opengl.GLES20.glUniform1i;
+import static android.opengl.GLES20.glVertexAttribPointer;
+
+import android.graphics.Bitmap;
+import android.opengl.GLUtils;
+import android.util.Log;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+/**
+ * This class takes charge of the geometry data like vertices and texture coordinates.
+ * It delivers these data to opengl runtime and triggers draw calls if necessary.
+ */
+class ImageGLWallpaper {
+ private static final String TAG = ImageGLWallpaper.class.getSimpleName();
+
+ static final String A_POSITION = "aPosition";
+ static final String A_TEXTURE_COORDINATES = "aTextureCoordinates";
+ static final String U_CENTER_REVEAL = "uCenterReveal";
+ static final String U_REVEAL = "uReveal";
+ static final String U_AOD2OPACITY = "uAod2Opacity";
+ static final String U_TEXTURE = "uTexture";
+ static final String U_AOD_MODE = "uAodMode";
+
+ private static final int HANDLE_UNDEFINED = -1;
+ private static final int POSITION_COMPONENT_COUNT = 2;
+ private static final int TEXTURE_COMPONENT_COUNT = 2;
+ private static final int BYTES_PER_FLOAT = 4;
+
+ // Vertices to define the square with 2 triangles.
+ private static final float[] VERTICES = {
+ -1.0f, -1.0f,
+ +1.0f, -1.0f,
+ +1.0f, +1.0f,
+ +1.0f, +1.0f,
+ -1.0f, +1.0f,
+ -1.0f, -1.0f
+ };
+
+ // Texture coordinates that maps to vertices.
+ private static final float[] TEXTURES = {
+ 0f, 1f,
+ 1f, 1f,
+ 1f, 0f,
+ 1f, 0f,
+ 0f, 0f,
+ 0f, 1f
+ };
+
+ private final FloatBuffer mVertexBuffer;
+ private final FloatBuffer mTextureBuffer;
+ private final ImageGLProgram mProgram;
+
+ private int mAttrPosition;
+ private int mAttrTextureCoordinates;
+ private int mUniAod2Opacity;
+ private int mUniAodMode;
+ private int mUniCenterReveal;
+ private int mUniReveal;
+ private int mUniTexture;
+ private int mTextureId;
+
+ ImageGLWallpaper(ImageGLProgram program) {
+ mProgram = program;
+
+ // Create an float array in opengles runtime (native) and put vertex data.
+ mVertexBuffer = ByteBuffer.allocateDirect(VERTICES.length * BYTES_PER_FLOAT)
+ .order(ByteOrder.nativeOrder())
+ .asFloatBuffer();
+ mVertexBuffer.put(VERTICES);
+ mVertexBuffer.position(0);
+
+ // Create an float array in opengles runtime (native) and put texture data.
+ mTextureBuffer = ByteBuffer.allocateDirect(TEXTURES.length * BYTES_PER_FLOAT)
+ .order(ByteOrder.nativeOrder())
+ .asFloatBuffer();
+ mTextureBuffer.put(TEXTURES);
+ mTextureBuffer.position(0);
+ }
+
+ void setup() {
+ setupAttributes();
+ setupUniforms();
+ }
+
+ private void setupAttributes() {
+ mAttrPosition = mProgram.getAttributeHandle(A_POSITION);
+ mVertexBuffer.position(0);
+ glVertexAttribPointer(mAttrPosition, POSITION_COMPONENT_COUNT, GL_FLOAT,
+ false, 0, mVertexBuffer);
+ glEnableVertexAttribArray(mAttrPosition);
+
+ mAttrTextureCoordinates = mProgram.getAttributeHandle(A_TEXTURE_COORDINATES);
+ mTextureBuffer.position(0);
+ glVertexAttribPointer(mAttrTextureCoordinates, TEXTURE_COMPONENT_COUNT, GL_FLOAT,
+ false, 0, mTextureBuffer);
+ glEnableVertexAttribArray(mAttrTextureCoordinates);
+ }
+
+ private void setupUniforms() {
+ mUniAod2Opacity = mProgram.getUniformHandle(U_AOD2OPACITY);
+ mUniAodMode = mProgram.getUniformHandle(U_AOD_MODE);
+ mUniCenterReveal = mProgram.getUniformHandle(U_CENTER_REVEAL);
+ mUniReveal = mProgram.getUniformHandle(U_REVEAL);
+ mUniTexture = mProgram.getUniformHandle(U_TEXTURE);
+ }
+
+ int getHandle(String name) {
+ switch (name) {
+ case A_POSITION:
+ return mAttrPosition;
+ case A_TEXTURE_COORDINATES:
+ return mAttrTextureCoordinates;
+ case U_AOD2OPACITY:
+ return mUniAod2Opacity;
+ case U_AOD_MODE:
+ return mUniAodMode;
+ case U_CENTER_REVEAL:
+ return mUniCenterReveal;
+ case U_REVEAL:
+ return mUniReveal;
+ case U_TEXTURE:
+ return mUniTexture;
+ default:
+ return HANDLE_UNDEFINED;
+ }
+ }
+
+ void draw() {
+ glDrawArrays(GL_TRIANGLES, 0, VERTICES.length / 2);
+ }
+
+ void setupTexture(Bitmap bitmap) {
+ final int[] tids = new int[1];
+
+ if (bitmap == null) {
+ Log.w(TAG, "setupTexture: invalid bitmap");
+ return;
+ }
+
+ // Generate one texture object and store the id in tids[0].
+ glGenTextures(1, tids, 0);
+ if (tids[0] == 0) {
+ Log.w(TAG, "setupTexture: glGenTextures() failed");
+ return;
+ }
+
+ // Bind a named texture to a texturing target.
+ glBindTexture(GL_TEXTURE_2D, tids[0]);
+ // Load the bitmap data and copy it over into the texture object that is currently bound.
+ GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmap, 0);
+ // Use bilinear texture filtering when minification.
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ // Use bilinear texture filtering when magnification.
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ mTextureId = tids[0];
+ }
+
+ void useTexture() {
+ // Set the active texture unit to texture unit 0.
+ glActiveTexture(GL_TEXTURE0);
+ // Bind the texture to this unit.
+ glBindTexture(GL_TEXTURE_2D, mTextureId);
+ // Let the texture sampler in fragment shader to read form this texture unit.
+ glUniform1i(mUniTexture, 0);
+ }
+
+ void adjustTextureCoordinates(Bitmap bitmap, int surfaceWidth, int surfaceHeight,
+ float xOffset, float yOffset) {
+ if (bitmap == null) {
+ Log.d(TAG, "adjustTextureCoordinates: invalid bitmap");
+ return;
+ }
+
+ float ratioW = 1f;
+ float ratioH = 1f;
+ int bitmapWidth = bitmap.getWidth();
+ int bitmapHeight = bitmap.getHeight();
+
+ boolean adjustWidth = bitmapWidth > surfaceWidth;
+ if (adjustWidth) {
+ ratioW = (float) surfaceWidth / bitmapWidth;
+ float referenceX = xOffset + ratioW > 1f ? 1f - ratioW : xOffset;
+ for (int i = 0; i < TEXTURES.length; i += 2) {
+ if (i == 2 || i == 4 || i == 6) {
+ TEXTURES[i] = Math.min(1f, referenceX + ratioW);
+ } else {
+ TEXTURES[i] = referenceX;
+ }
+ }
+ }
+
+ boolean adjustHeight = bitmapHeight > surfaceHeight;
+ if (adjustHeight) {
+ ratioH = (float) surfaceHeight / bitmapHeight;
+ float referenceY = yOffset + ratioH > 1f ? 1f - ratioH : yOffset;
+ for (int i = 1; i < TEXTURES.length; i += 2) {
+ if (i == 1 || i == 3 || i == 11) {
+ TEXTURES[i] = Math.min(1f, referenceY + ratioH);
+ } else {
+ TEXTURES[i] = referenceY;
+ }
+ }
+ }
+
+ if (adjustWidth || adjustHeight) {
+ mTextureBuffer.put(TEXTURES);
+ mTextureBuffer.position(0);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java
new file mode 100644
index 000000000000..477e7d7ebf72
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java
@@ -0,0 +1,144 @@
+/*
+ * 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.glwallpaper;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.Handler.Callback;
+import android.os.Message;
+import android.util.Log;
+
+/**
+ * A helper class that computes histogram and percentile 85 from a bitmap.
+ * Percentile 85 will be computed each time the user picks a new image wallpaper.
+ */
+class ImageProcessHelper {
+ private static final String TAG = ImageProcessHelper.class.getSimpleName();
+ private static final float DEFAULT_PER85 = 0.8f;
+ private static final int MSG_UPDATE_PER85 = 1;
+
+ /**
+ * This color matrix will be applied to each pixel to get luminance from rgb by below formula:
+ * Luminance = .2126f * r + .7152f * g + .0722f * b.
+ */
+ private static final float[] LUMINOSITY_MATRIX = new float[] {
+ .2126f, .0000f, .0000f, .0000f, .0000f,
+ .0000f, .7152f, .0000f, .0000f, .0000f,
+ .0000f, .0000f, .0722f, .0000f, .0000f,
+ .0000f, .0000f, .0000f, 1.000f, .0000f
+ };
+
+ private final Handler mHandler = new Handler(new Callback() {
+ @Override
+ public boolean handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_UPDATE_PER85:
+ mPer85 = (float) msg.obj;
+ return true;
+ default:
+ return false;
+ }
+ }
+ });
+
+ private float mPer85 = DEFAULT_PER85;
+
+ void startComputingPercentile85(Bitmap bitmap) {
+ new Per85ComputeTask(mHandler).execute(bitmap);
+ }
+
+ float getPercentile85() {
+ return mPer85;
+ }
+
+ private static class Per85ComputeTask extends AsyncTask<Bitmap, Void, Float> {
+ private Handler mUpdateHandler;
+
+ Per85ComputeTask(Handler handler) {
+ super(handler);
+ mUpdateHandler = handler;
+ }
+
+ @Override
+ protected Float doInBackground(Bitmap... bitmaps) {
+ Bitmap bitmap = bitmaps[0];
+ if (bitmap != null) {
+ int[] histogram = processHistogram(bitmap);
+ return computePercentile85(bitmap, histogram);
+ }
+ Log.e(TAG, "Per85ComputeTask: Can't get bitmap");
+ return DEFAULT_PER85;
+ }
+
+ @Override
+ protected void onPostExecute(Float result) {
+ Message msg = mUpdateHandler.obtainMessage(MSG_UPDATE_PER85, result);
+ mUpdateHandler.sendMessage(msg);
+ }
+
+ private int[] processHistogram(Bitmap bitmap) {
+ int width = bitmap.getWidth();
+ int height = bitmap.getHeight();
+
+ Bitmap target = Bitmap.createBitmap(width, height, bitmap.getConfig());
+ Canvas canvas = new Canvas(target);
+ ColorMatrix cm = new ColorMatrix(LUMINOSITY_MATRIX);
+ Paint paint = new Paint();
+ paint.setColorFilter(new ColorMatrixColorFilter(cm));
+ canvas.drawBitmap(bitmap, new Matrix(), paint);
+
+ // TODO: Fine tune the performance here, tracking on b/123615079.
+ int[] histogram = new int[256];
+ for (int row = 0; row < height; row++) {
+ for (int col = 0; col < width; col++) {
+ int pixel = target.getPixel(col, row);
+ int y = Color.red(pixel) + Color.green(pixel) + Color.blue(pixel);
+ histogram[y]++;
+ }
+ }
+
+ return histogram;
+ }
+
+ private float computePercentile85(Bitmap bitmap, int[] histogram) {
+ float per85 = DEFAULT_PER85;
+ int pixelCount = bitmap.getWidth() * bitmap.getHeight();
+ float[] acc = new float[256];
+ for (int i = 0; i < acc.length; i++) {
+ acc[i] = (float) histogram[i] / pixelCount;
+ float prev = i == 0 ? 0f : acc[i - 1];
+ float next = acc[i];
+ float idx = (float) (i + 1) / 255;
+ float sum = prev + next;
+ if (prev < 0.85f && sum >= 0.85f) {
+ per85 = idx;
+ }
+ if (i > 0) {
+ acc[i] += acc[i - 1];
+ }
+ }
+ return per85;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java
new file mode 100644
index 000000000000..787972c08e4a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java
@@ -0,0 +1,103 @@
+/*
+ * 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.glwallpaper;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+
+import com.android.systemui.Interpolators;
+
+/**
+ * Use ValueAnimator and appropriate interpolator to control the progress of reveal transition.
+ * The transition will happen while getting awake and quit events.
+ */
+class ImageRevealHelper {
+ private static final String TAG = ImageRevealHelper.class.getSimpleName();
+ private static final float MAX_REVEAL = 0f;
+ private static final float MIN_REVEAL = 1f;
+ private static final int REVEAL_DURATION = 1000;
+
+ private final ValueAnimator mAnimator;
+ private final RevealStateListener mRevealListener;
+ private float mReveal = MIN_REVEAL;
+ private boolean mAwake = false;
+
+ ImageRevealHelper(RevealStateListener listener) {
+ mRevealListener = listener;
+ mAnimator = ValueAnimator.ofFloat();
+ mAnimator.setDuration(REVEAL_DURATION);
+ mAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
+ mAnimator.addUpdateListener(animator -> {
+ mReveal = (float) animator.getAnimatedValue();
+ if (mRevealListener != null) {
+ mRevealListener.onRevealStateChanged();
+ }
+ });
+ mAnimator.addListener(new AnimatorListenerAdapter() {
+ private boolean mIsCanceled;
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ mIsCanceled = true;
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (!mIsCanceled) {
+ mAwake = !mAwake;
+ }
+ mIsCanceled = false;
+ }
+ });
+ }
+
+ private void animate() {
+ mAnimator.cancel();
+ mAnimator.setFloatValues(mReveal, !mAwake ? MIN_REVEAL : MAX_REVEAL);
+ mAnimator.start();
+ }
+
+ public float getReveal() {
+ return mReveal;
+ }
+
+ public boolean isAwake() {
+ return mAwake;
+ }
+
+ void updateAwake(boolean awake) {
+ mAwake = awake;
+ animate();
+ }
+
+ void sleep() {
+ mReveal = MIN_REVEAL;
+ mAwake = false;
+ }
+
+ /**
+ * A listener to trace value changes of reveal.
+ */
+ public interface RevealStateListener {
+
+ /**
+ * Called back while reveal status changes.
+ */
+ void onRevealStateChanged();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
new file mode 100644
index 000000000000..8916b28f201a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java
@@ -0,0 +1,153 @@
+/*
+ * 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.glwallpaper;
+
+import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;
+import static android.opengl.GLES20.glClear;
+import static android.opengl.GLES20.glClearColor;
+import static android.opengl.GLES20.glUniform1f;
+import static android.opengl.GLES20.glUniform1i;
+import static android.opengl.GLES20.glViewport;
+
+import android.app.WallpaperManager;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.opengl.GLSurfaceView;
+import android.util.Log;
+
+import com.android.systemui.ImageWallpaper;
+import com.android.systemui.ImageWallpaper.ImageGLView;
+import com.android.systemui.R;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * A GL renderer for image wallpaper.
+ */
+public class ImageWallpaperRenderer implements GLSurfaceView.Renderer,
+ ImageWallpaper.SensorEventListener, ImageWallpaper.WallpaperStatusListener,
+ ImageRevealHelper.RevealStateListener {
+ private static final String TAG = ImageWallpaperRenderer.class.getSimpleName();
+
+ private final WallpaperManager mWallpaperManager;
+ private final ImageGLProgram mProgram;
+ private final ImageGLWallpaper mWallpaper;
+ private final ImageProcessHelper mImageProcessHelper;
+ private final ImageRevealHelper mImageRevealHelper;
+ private final ImageGLView mGLView;
+ private boolean mIsInAmbientMode;
+ private float mXOffset = 0f;
+ private float mYOffset = 0f;
+
+ public ImageWallpaperRenderer(Context context, ImageGLView glView) {
+ mWallpaperManager = context.getSystemService(WallpaperManager.class);
+ if (mWallpaperManager == null) {
+ Log.w(TAG, "WallpaperManager not available");
+ }
+
+ mProgram = new ImageGLProgram(context);
+ mWallpaper = new ImageGLWallpaper(mProgram);
+ mImageProcessHelper = new ImageProcessHelper();
+ mImageRevealHelper = new ImageRevealHelper(this);
+ mGLView = glView;
+
+ if (mWallpaperManager != null) {
+ // Compute per85 as transition threshold, this is an async work.
+ mImageProcessHelper.startComputingPercentile85(mWallpaperManager.getBitmap());
+ }
+ }
+
+ @Override
+ public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+ glClearColor(0f, 0f, 0f, 1.0f);
+ mProgram.useGLProgram(
+ R.raw.image_wallpaper_vertex_shader, R.raw.image_wallpaper_fragment_shader);
+ mWallpaper.setup();
+ mWallpaper.setupTexture(mWallpaperManager.getBitmap());
+ }
+
+ @Override
+ public void onSurfaceChanged(GL10 gl, int width, int height) {
+ glViewport(0, 0, width, height);
+ mWallpaper.adjustTextureCoordinates(mWallpaperManager.getBitmap(),
+ width, height, mXOffset, mYOffset);
+ }
+
+ @Override
+ public void onDrawFrame(GL10 gl) {
+ float threshold = mImageProcessHelper.getPercentile85();
+ float reveal = mImageRevealHelper.getReveal();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_AOD2OPACITY), .25f);
+ glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_CENTER_REVEAL), threshold);
+ glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_REVEAL), reveal);
+ glUniform1i(mWallpaper.getHandle(ImageGLWallpaper.U_AOD_MODE), mIsInAmbientMode ? 1 : 0);
+
+ mWallpaper.useTexture();
+ mWallpaper.draw();
+ }
+
+ @Override
+ public void onSensorEvent(boolean awake) {
+ mImageRevealHelper.updateAwake(awake);
+ }
+
+ @Override
+ public void onAmbientModeChanged(boolean inAmbientMode) {
+ mIsInAmbientMode = inAmbientMode;
+ if (inAmbientMode) {
+ mImageRevealHelper.sleep();
+ }
+ requestRender();
+ }
+
+ @Override
+ public void onOffsetsChanged(float xOffset, float yOffset, Rect frame) {
+ if (frame == null || mWallpaperManager == null
+ || (xOffset == mXOffset && yOffset == mYOffset)) {
+ return;
+ }
+
+ Bitmap bitmap = mWallpaperManager.getBitmap();
+ if (bitmap == null) {
+ return;
+ }
+
+ int width = frame.width();
+ int height = frame.height();
+ mXOffset = xOffset;
+ mYOffset = yOffset;
+
+ mWallpaper.adjustTextureCoordinates(bitmap, width, height, mXOffset, mYOffset);
+ requestRender();
+ }
+
+ @Override
+ public void onRevealStateChanged() {
+ requestRender();
+ }
+
+ private void requestRender() {
+ if (mGLView != null) {
+ mGLView.render();
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java
index 968bd283c4b1..60dceef23f7c 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java
@@ -165,6 +165,11 @@ public class PipAccessibilityInteractionConnection
}
}
+ @Override
+ public void clearAccessibilityFocus() {
+ // We should not be here.
+ }
+
public static AccessibilityNodeInfo obtainRootAccessibilityNodeInfo() {
AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain();
info.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID,
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
index db5c244d95b2..e2688f13134c 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
@@ -19,6 +19,7 @@ import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
+import android.content.pm.PackageManager
import android.content.res.ColorStateList
import android.os.UserHandle
import android.util.IconDrawableFactory
@@ -157,16 +158,21 @@ class OngoingPrivacyDialog constructor(
} else {
icons.visibility = View.GONE
}
- item.setOnClickListener(object : View.OnClickListener {
- val intent = Intent(Intent.ACTION_REVIEW_APP_PERMISSION_USAGE)
- .putExtra(Intent.EXTRA_PACKAGE_NAME, app.packageName)
- .putExtra(Intent.EXTRA_USER, UserHandle.getUserHandleForUid(app.uid))
- override fun onClick(v: View?) {
- Dependency.get(ActivityStarter::class.java)
- .postStartActivityDismissingKeyguard(intent, 0)
- dismissDialog?.invoke()
- }
- })
+ try {
+ // Check if package exists
+ context.packageManager.getPackageInfo(app.packageName, 0)
+ item.setOnClickListener(object : View.OnClickListener {
+ val intent = Intent(Intent.ACTION_REVIEW_APP_PERMISSION_USAGE)
+ .putExtra(Intent.EXTRA_PACKAGE_NAME, app.packageName)
+ .putExtra(Intent.EXTRA_USER, UserHandle.getUserHandleForUid(app.uid))
+ override fun onClick(v: View?) {
+ Dependency.get(ActivityStarter::class.java)
+ .postStartActivityDismissingKeyguard(intent, 0)
+ dismissDialog?.invoke()
+ }
+ })
+ } catch (e: PackageManager.NameNotFoundException) {}
+
itemList.addView(item)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
index f3a46ce5778a..0583843d003b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
@@ -20,6 +20,8 @@ import static com.android.systemui.statusbar.RemoteInputController.processForRem
import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
import static com.android.systemui.statusbar.phone.StatusBar.ENABLE_CHILD_NOTIFICATIONS;
+import android.annotation.SuppressLint;
+import android.app.NotificationManager;
import android.content.ComponentName;
import android.content.Context;
import android.os.RemoteException;
@@ -32,10 +34,13 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
+import java.util.ArrayList;
+
/**
* This class handles listening to notification updates and passing them along to
* NotificationPresenter to be displayed to the user.
*/
+@SuppressLint("OverrideAbstract")
public class NotificationListener extends NotificationListenerWithPlugins {
private static final String TAG = "NotificationListener";
@@ -47,6 +52,7 @@ public class NotificationListener extends NotificationListenerWithPlugins {
private final NotificationGroupManager mGroupManager =
Dependency.get(NotificationGroupManager.class);
+ private final ArrayList<NotificationSettingsListener> mSettingsListeners = new ArrayList<>();
private final Context mContext;
protected NotificationPresenter mPresenter;
@@ -55,6 +61,10 @@ public class NotificationListener extends NotificationListenerWithPlugins {
mContext = context;
}
+ public void addNotificationSettingsListener(NotificationSettingsListener listener) {
+ mSettingsListeners.add(listener);
+ }
+
@Override
public void onListenerConnected() {
if (DEBUG) Log.d(TAG, "onListenerConnected");
@@ -70,6 +80,8 @@ public class NotificationListener extends NotificationListenerWithPlugins {
mEntryManager.addNotification(sbn, currentRanking);
}
});
+ NotificationManager noMan = mContext.getSystemService(NotificationManager.class);
+ onStatusBarIconsBehaviorChanged(noMan.shouldHideSilentStatusBarIcons());
}
@Override
@@ -133,6 +145,13 @@ public class NotificationListener extends NotificationListenerWithPlugins {
}
}
+ @Override
+ public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+ for (NotificationSettingsListener listener : mSettingsListeners) {
+ listener.onStatusBarIconsBehaviorChanged(hideSilentStatusIcons);
+ }
+ }
+
public void setUpWithPresenter(NotificationPresenter presenter) {
mPresenter = presenter;
@@ -144,4 +163,10 @@ public class NotificationListener extends NotificationListenerWithPlugins {
Log.e(TAG, "Unable to register notification listener", e);
}
}
+
+ public interface NotificationSettingsListener {
+
+ default void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { }
+
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
index cb1384cacec8..aa221993cd82 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
@@ -25,7 +25,6 @@ import android.app.NotificationChannel;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.metrics.LogMaker;
import android.net.Uri;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -392,12 +391,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
return false;
}
- LogMaker logMaker = (row.getStatusBarNotification() == null)
- ? new LogMaker(MetricsProto.MetricsEvent.ACTION_NOTE_CONTROLS)
- : row.getStatusBarNotification().getLogMaker();
- mMetricsLogger.write(logMaker.setCategory(MetricsProto.MetricsEvent.ACTION_NOTE_CONTROLS)
- .setType(MetricsProto.MetricsEvent.TYPE_ACTION));
-
// ensure that it's laid but not visible until actually laid out
guts.setVisibility(View.INVISIBLE);
// Post to ensure the the guts are properly laid out.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
index 359bc6ec71d8..b6948fc4bd1f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
@@ -126,18 +126,23 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
private OnClickListener mOnKeepShowing = v -> {
mExitReason = NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING;
closeControls(v);
- mMetricsLogger.write(getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
- .setType(MetricsEvent.TYPE_ACTION)
- .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_STAY_SILENT));
+ if (mIsForBlockingHelper) {
+ mMetricsLogger.write(getLogMaker().setCategory(
+ MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setType(MetricsEvent.TYPE_ACTION)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_STAY_SILENT));
+ }
};
private OnClickListener mOnToggleSilent = v -> {
Runnable saveImportance = () -> {
swapContent(ACTION_TOGGLE_SILENT, true /* animate */);
- mMetricsLogger.write(getLogMaker()
- .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
- .setType(MetricsEvent.TYPE_ACTION)
- .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_ALERT_ME));
+ if (mIsForBlockingHelper) {
+ mMetricsLogger.write(getLogMaker()
+ .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setType(MetricsEvent.TYPE_ACTION)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_ALERT_ME));
+ }
};
if (mCheckSaveListener != null) {
mCheckSaveListener.checkSave(saveImportance, mSbn);
@@ -149,10 +154,12 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
private OnClickListener mOnStopOrMinimizeNotifications = v -> {
Runnable saveImportance = () -> {
swapContent(ACTION_BLOCK, true /* animate */);
- mMetricsLogger.write(getLogMaker()
- .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
- .setType(MetricsEvent.TYPE_ACTION)
- .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_BLOCKED));
+ if (mIsForBlockingHelper) {
+ mMetricsLogger.write(getLogMaker()
+ .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setType(MetricsEvent.TYPE_ACTION)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_BLOCKED));
+ }
};
if (mCheckSaveListener != null) {
mCheckSaveListener.checkSave(saveImportance, mSbn);
@@ -164,12 +171,16 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
private OnClickListener mOnUndo = v -> {
// Reset exit counter that we'll log and record an undo event separately (not an exit event)
mExitReason = NotificationCounters.BLOCKING_HELPER_DISMISSED;
- logBlockingHelperCounter(NotificationCounters.BLOCKING_HELPER_UNDO);
- mMetricsLogger.write(importanceChangeLogMaker().setType(MetricsEvent.TYPE_DISMISS));
+ if (mIsForBlockingHelper) {
+ logBlockingHelperCounter(NotificationCounters.BLOCKING_HELPER_UNDO);
+ mMetricsLogger.write(getLogMaker().setCategory(
+ MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ .setType(MetricsEvent.TYPE_DISMISS)
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_UNDO));
+ } else {
+ mMetricsLogger.write(importanceChangeLogMaker().setType(MetricsEvent.TYPE_DISMISS));
+ }
swapContent(ACTION_UNDO, true /* animate */);
- mMetricsLogger.write(getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
- .setType(MetricsEvent.TYPE_DISMISS)
- .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_UNDO));
};
public NotificationInfo(Context context, AttributeSet attrs) {
@@ -269,11 +280,11 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
bindPrompt();
bindButtons();
- mMetricsLogger.write(getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
- .setType(MetricsEvent.TYPE_OPEN)
- .setSubtype(MetricsEvent.BLOCKING_HELPER_DISPLAY));
+ mMetricsLogger.write(notificationControlsLogMaker());
}
+
+
private void bindHeader() throws RemoteException {
// Package name
Drawable pkgicon = null;
@@ -404,19 +415,6 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
}
}
- /**
- * Returns an initialized LogMaker for logging importance changes.
- * The caller may override the type (to DISMISS) before passing it to mMetricsLogger.
- * @return new LogMaker
- */
- private LogMaker importanceChangeLogMaker() {
- Integer chosenImportance =
- mChosenImportance != null ? mChosenImportance : mStartingChannelImportance;
- return new LogMaker(MetricsEvent.ACTION_SAVE_IMPORTANCE)
- .setType(MetricsEvent.TYPE_ACTION)
- .setSubtype(chosenImportance - mStartingChannelImportance);
- }
-
private boolean hasImportanceChanged() {
return mSingleNotificationChannel != null
&& mChosenImportance != null
@@ -616,8 +614,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
confirmation.setAlpha(1f);
header.setVisibility(VISIBLE);
header.setAlpha(1f);
- mMetricsLogger.write(getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
- .setType(MetricsEvent.TYPE_CLOSE));
+
+ mMetricsLogger.write(notificationControlsLogMaker().setType(MetricsEvent.TYPE_CLOSE));
}
@Override
@@ -764,7 +762,39 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
}
}
+ /**
+ * Returns a LogMaker with all available notification information.
+ * Caller should set category, type, and maybe subtype, before passing it to mMetricsLogger.
+ * @return LogMaker
+ */
private LogMaker getLogMaker() {
- return mSbn.getLogMaker();
+ // The constructor requires a category, so also do it in the other branch for consistency.
+ return mSbn == null ? new LogMaker(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
+ : mSbn.getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER);
+ }
+
+ /**
+ * Returns an initialized LogMaker for logging importance changes.
+ * The caller may override the type before passing it to mMetricsLogger.
+ * @return LogMaker
+ */
+ private LogMaker importanceChangeLogMaker() {
+ Integer chosenImportance =
+ mChosenImportance != null ? mChosenImportance : mStartingChannelImportance;
+ return getLogMaker().setCategory(MetricsEvent.ACTION_SAVE_IMPORTANCE)
+ .setType(MetricsEvent.TYPE_ACTION)
+ .setSubtype(chosenImportance - mStartingChannelImportance);
+ }
+
+ /**
+ * Returns an initialized LogMaker for logging open/close of the info display.
+ * The caller may override the type before passing it to mMetricsLogger.
+ * @return LogMaker
+ */
+ private LogMaker notificationControlsLogMaker() {
+ return getLogMaker().setCategory(MetricsEvent.ACTION_NOTE_CONTROLS)
+ .setType(MetricsEvent.TYPE_OPEN)
+ .setSubtype(mIsForBlockingHelper ? MetricsEvent.BLOCKING_HELPER_DISPLAY
+ : MetricsEvent.BLOCKING_HELPER_UNKNOWN);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index e86996a81bcd..9e99fe9dac36 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -11,9 +11,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
-import androidx.annotation.NonNull;
-import androidx.collection.ArrayMap;
-
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.widget.ViewClippingUtil;
@@ -21,6 +19,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
+import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.StatusBarStateController;
@@ -28,11 +27,13 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.tuner.TunerService;
import java.util.ArrayList;
import java.util.function.Function;
+import androidx.annotation.NonNull;
+import androidx.collection.ArrayMap;
+
/**
* A controller for the space in the status bar to the left of the system icons. This area is
* normally reserved for notifications.
@@ -46,18 +47,19 @@ public class NotificationIconAreaController implements DarkReceiver,
private final NotificationEntryManager mEntryManager;
private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons;
private final StatusBarStateController mStatusBarStateController;
- private final TunerService.Tunable mTunable = new TunerService.Tunable() {
- @Override
- public void onTuningChanged(String key, String newValue) {
- if (key.equals(LOW_PRIORITY)) {
- mShowLowPriority = "1".equals(newValue)
- || !NotificationUtils.useNewInterruptionModel(mContext);
- if (mNotificationScrollLayout != null) {
- updateStatusBarIcons();
+ @VisibleForTesting
+ final NotificationListener.NotificationSettingsListener mSettingsListener =
+ new NotificationListener.NotificationSettingsListener() {
+ @Override
+ public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+ if (NotificationUtils.useNewInterruptionModel(mContext)) {
+ mShowLowPriority = !hideSilentStatusIcons;
+ if (mNotificationScrollLayout != null) {
+ updateStatusBarIcons();
+ }
+ }
}
- }
- }
- };
+ };
private int mIconSize;
private int mIconHPadding;
@@ -71,7 +73,7 @@ public class NotificationIconAreaController implements DarkReceiver,
private ViewGroup mNotificationScrollLayout;
private Context mContext;
private boolean mFullyDark;
- private boolean mShowLowPriority;
+ private boolean mShowLowPriority = true;
/**
* Ratio representing being awake or in ambient mode, where 1 is dark and 0 awake.
@@ -90,15 +92,15 @@ public class NotificationIconAreaController implements DarkReceiver,
view -> view instanceof StatusBarWindowView;
public NotificationIconAreaController(Context context, StatusBar statusBar,
- StatusBarStateController statusBarStateController) {
+ StatusBarStateController statusBarStateController,
+ NotificationListener notificationListener) {
mStatusBar = statusBar;
mContrastColorUtil = ContrastColorUtil.getInstance(context);
mContext = context;
mEntryManager = Dependency.get(NotificationEntryManager.class);
mStatusBarStateController = statusBarStateController;
mStatusBarStateController.addCallback(this);
-
- Dependency.get(TunerService.class).addTunable(mTunable, LOW_PRIORITY);
+ notificationListener.addNotificationSettingsListener(mSettingsListener);
initializeNotificationAreaViews(context);
}
@@ -243,6 +245,11 @@ public class NotificationIconAreaController implements DarkReceiver,
true /* hideRepliedMessages */);
}
+ @VisibleForTesting
+ boolean shouldShouldLowPriorityIcons() {
+ return mShowLowPriority;
+ }
+
/**
* Updates the notification icons for a host layout. This will ensure that the notification
* host layout will have the same icons like the ones in here.
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 1470d0f44266..dd231821ef2b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -480,8 +480,7 @@ public class StatusBar extends SystemUI implements DemoMode,
updateAodMaskVisibility(deviceSupportsAodWallpaper && aodImageWallpaperEnabled);
// If WallpaperInfo is null, it must be ImageWallpaper.
final boolean supportsAmbientMode = deviceSupportsAodWallpaper
- && (info == null && aodImageWallpaperEnabled
- || info != null && info.supportsAmbientMode());
+ && (info == null || info.supportsAmbientMode());
mStatusBarWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
mScrimController.setWallpaperSupportsAmbientMode(supportsAmbientMode);
@@ -801,7 +800,8 @@ public class StatusBar extends SystemUI implements DemoMode,
mNotificationLogger.setUpWithContainer(notifListContainer);
mNotificationIconAreaController = SystemUIFactory.getInstance()
- .createNotificationIconAreaController(context, this, mStatusBarStateController);
+ .createNotificationIconAreaController(
+ context, this, mStatusBarStateController, mNotificationListener);
inflateShelf();
mNotificationIconAreaController.setupShelf(mNotificationShelf);
diff --git a/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java b/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java
index 52cabe278e2d..dd1d0ca06fa8 100644
--- a/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java
@@ -156,6 +156,8 @@ public class AodMaskView extends ImageView implements StatusBarStateController.S
private boolean checkIfNeedMask() {
// We need mask for ImageWallpaper / LockScreen Wallpaper (Music album art).
+ // Because of conflicting with another wallpaper feature,
+ // we only support LockScreen wallpaper currently.
return mWallpaperManager.getWallpaperInfo() == null || ScrimState.AOD.hasBackdrop();
}
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 c880172e775a..bcf5964bead5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
@@ -17,10 +17,12 @@
package com.android.systemui.statusbar;
import static org.mockito.ArgumentMatchers.any;
+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.NotificationManager;
import android.os.Handler;
import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
@@ -55,6 +57,7 @@ public class NotificationListenerTest extends SysuiTestCase {
// Dependency mocks:
@Mock private NotificationEntryManager mEntryManager;
@Mock private NotificationRemoteInputManager mRemoteInputManager;
+ @Mock private NotificationManager mNotificationManager;
private NotificationListener mListener;
private StatusBarNotification mSbn;
@@ -67,6 +70,7 @@ public class NotificationListenerTest extends SysuiTestCase {
mRemoteInputManager);
mDependency.injectTestDependency(Dependency.MAIN_HANDLER,
new Handler(TestableLooper.get(this).getLooper()));
+ mContext.addMockSystemService(NotificationManager.class, mNotificationManager);
when(mEntryManager.getNotificationData()).thenReturn(mNotificationData);
@@ -106,4 +110,28 @@ public class NotificationListenerTest extends SysuiTestCase {
// RankingMap may be modified by plugins.
verify(mEntryManager).updateNotificationRanking(any());
}
+
+ @Test
+ public void testOnConnectReadStatusBarSetting() {
+ NotificationListener.NotificationSettingsListener settingsListener =
+ mock(NotificationListener.NotificationSettingsListener.class);
+ mListener.addNotificationSettingsListener(settingsListener);
+
+ when(mNotificationManager.shouldHideSilentStatusBarIcons()).thenReturn(true);
+
+ mListener.onListenerConnected();
+
+ verify(settingsListener).onStatusBarIconsBehaviorChanged(true);
+ }
+
+ @Test
+ public void testOnStatusBarIconsBehaviorChanged() {
+ NotificationListener.NotificationSettingsListener settingsListener =
+ mock(NotificationListener.NotificationSettingsListener.class);
+ mListener.addNotificationSettingsListener(settingsListener);
+
+ mListener.onStatusBarIconsBehaviorChanged(true);
+
+ verify(settingsListener).onStatusBarIconsBehaviorChanged(true);
+ }
}
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 fdc9e0c4d7e4..727e9af94146 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
@@ -45,7 +45,6 @@ import android.app.Notification;
import android.app.NotificationChannel;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.metrics.LogMaker;
import android.os.Binder;
import android.os.Handler;
import android.provider.Settings;
@@ -57,7 +56,6 @@ import android.util.ArraySet;
import android.view.View;
import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.NotificationPresenter;
@@ -220,34 +218,6 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
}
@Test
- public void testOpenGutsLogging() {
- NotificationGutsManager gutsManager = spy(mGutsManager);
- doReturn(true).when(gutsManager).bindGuts(any(), any());
-
- NotificationGuts guts = spy(new NotificationGuts(mContext));
- doReturn(true).when(guts).post(any());
-
- ExpandableNotificationRow realRow = createTestNotificationRow();
- NotificationMenuRowPlugin.MenuItem menuItem = createTestMenuItem(realRow);
-
- ExpandableNotificationRow row = spy(realRow);
- when(row.getWindowToken()).thenReturn(new Binder());
- when(row.getGuts()).thenReturn(guts);
- StatusBarNotification notification = spy(realRow.getStatusBarNotification());
- when(row.getStatusBarNotification()).thenReturn(notification);
-
- assertTrue(gutsManager.openGuts(row, 0, 0, menuItem));
-
- ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class);
- verify(notification).getLogMaker();
- verify(mMetricsLogger).write(logMakerCaptor.capture());
- assertEquals(MetricsProto.MetricsEvent.ACTION_NOTE_CONTROLS,
- logMakerCaptor.getValue().getCategory());
- assertEquals(MetricsProto.MetricsEvent.TYPE_ACTION,
- logMakerCaptor.getValue().getType());
- }
-
- @Test
public void testAppOpsSettingsIntent_camera() {
ArraySet<Integer> ops = new ArraySet<>();
ops.add(OP_CAMERA);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
index 554baaf1ab9e..2a64445f342a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
@@ -83,7 +83,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
@@ -107,11 +106,16 @@ public class NotificationInfoTest extends SysuiTestCase {
private NotificationChannel mDefaultNotificationChannel;
private StatusBarNotification mSbn;
- @Rule public MockitoRule mockito = MockitoJUnit.rule();
- @Mock private MetricsLogger mMetricsLogger;
- @Mock private INotificationManager mMockINotificationManager;
- @Mock private PackageManager mMockPackageManager;
- @Mock private NotificationBlockingHelperManager mBlockingHelperManager;
+ @Rule
+ public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock
+ private MetricsLogger mMetricsLogger;
+ @Mock
+ private INotificationManager mMockINotificationManager;
+ @Mock
+ private PackageManager mMockPackageManager;
+ @Mock
+ private NotificationBlockingHelperManager mBlockingHelperManager;
@Before
public void setUp() throws Exception {
@@ -172,44 +176,25 @@ public class NotificationInfoTest extends SysuiTestCase {
PollingCheck.waitFor(1000,
() -> VISIBLE == mNotificationInfo.findViewById(R.id.confirmation).getVisibility());
}
+
private void ensureNoUndoButton() {
PollingCheck.waitFor(1000,
() -> GONE == mNotificationInfo.findViewById(R.id.confirmation).getVisibility()
&& !mNotificationInfo.isAnimating());
}
+
private void waitForStopButton() {
PollingCheck.waitFor(1000,
() -> VISIBLE == mNotificationInfo.findViewById(R.id.prompt).getVisibility());
}
- class ImportanceChangeLogMaker implements ArgumentMatcher<LogMaker> {
- private static final int CATEGORY = MetricsProto.MetricsEvent.ACTION_SAVE_IMPORTANCE;
- private int mType, mSubtype;
-
- ImportanceChangeLogMaker(int type, int subtype) {
- mType = type;
- mSubtype = subtype;
- }
- public boolean matches(LogMaker l) {
- return (l.getCategory() == CATEGORY)
- && (l.getType() == mType)
- && (l.getSubtype() == mSubtype);
- }
-
- public String toString() {
- return String.format("LogMaker(%d, %d, %d)", CATEGORY, mType, mSubtype);
- }
- }
-
- private LogMaker importanceChangeLog(int type, int subtype) {
- return argThat(new ImportanceChangeLogMaker(type, subtype));
- }
-
@Test
public void testBindNotification_SetsTextApplicationName() throws Exception {
when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+ null, null, null,
+ true, false,
IMPORTANCE_DEFAULT, true);
final TextView textView = mNotificationInfo.findViewById(R.id.pkgname);
assertTrue(textView.getText().toString().contains("App Name"));
@@ -330,9 +315,9 @@ public class NotificationInfoTest extends SysuiTestCase {
@Test
public void testBindNotification_BlockButton() throws Exception {
- mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
- IMPORTANCE_DEFAULT, true);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+ IMPORTANCE_DEFAULT, true);
final View block = mNotificationInfo.findViewById(R.id.int_block);
final View minimize = mNotificationInfo.findViewById(R.id.block_or_minimize);
assertEquals(VISIBLE, block.getVisibility());
@@ -340,7 +325,7 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testBindNotification_BlockButton_BlockHelper() throws Exception {
+ public void testBindNotification_BlockButton_BlockingHelper() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
true /* isBlockingHelper */, false, IMPORTANCE_DEFAULT, true);
@@ -498,13 +483,29 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testLogBlockingHelperCounter_logGutsViewDisplayed() throws Exception {
+ public void testBindNotificationLogging_notBlockingHelper() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+ null, null, null,
+ true, false,
+ IMPORTANCE_DEFAULT, true);
+ verify(mMetricsLogger).write(argThat(logMaker ->
+ logMaker.getCategory() == MetricsEvent.ACTION_NOTE_CONTROLS
+ && logMaker.getType() == MetricsEvent.TYPE_OPEN
+ && logMaker.getSubtype() == MetricsEvent.BLOCKING_HELPER_UNKNOWN
+ ));
+ }
+
+ @Test
+ public void testBindNotificationLogging_BlockingHelper() throws Exception {
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+ null, null, null,
+ false, true,
+ true, true,
IMPORTANCE_DEFAULT, true);
- mNotificationInfo.logBlockingHelperCounter("HowCanNotifsBeRealIfAppsArent");
verify(mMetricsLogger).write(argThat(logMaker ->
- logMaker.getCategory() == MetricsEvent.NOTIFICATION_BLOCKING_HELPER
+ logMaker.getCategory() == MetricsEvent.ACTION_NOTE_CONTROLS
&& logMaker.getType() == MetricsEvent.TYPE_OPEN
&& logMaker.getSubtype() == MetricsEvent.BLOCKING_HELPER_DISPLAY
));
@@ -513,8 +514,11 @@ public class NotificationInfoTest extends SysuiTestCase {
@Test
public void testLogBlockingHelperCounter_logsForBlockingHelper() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false, true,
- true, true, IMPORTANCE_DEFAULT, true);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+ null, null, null,
+ false, true,
+ true, true,
+ IMPORTANCE_DEFAULT, true);
mNotificationInfo.logBlockingHelperCounter("HowCanNotifsBeRealIfAppsArent");
verify(mMetricsLogger).count(eq("HowCanNotifsBeRealIfAppsArent"), eq(1));
}
@@ -680,7 +684,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
- null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+ null /* onSettingsClick */, null /* onAppSettingsClick */,
true, false /* isNonblockable */, IMPORTANCE_DEFAULT, false
);
@@ -722,7 +726,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
- null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+ null /* onSettingsClick */, null /* onAppSettingsClick */,
true /* provisioned */,
false /* isNonblockable */, true /* isForBlockingHelper */,
true /* isUserSentimentNegative */, IMPORTANCE_DEFAULT, true);
@@ -744,14 +748,14 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testCloseControls_nonNullCheckSaveListenerDoesntDelayKeepShowing()
+ public void testCloseControls_nonNullCheckSaveListenerDoesntDelayKeepShowing_BlockingHelper()
throws Exception {
NotificationInfo.CheckSaveListener listener =
mock(NotificationInfo.CheckSaveListener.class);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */,
- null /* onSettingsClick */, null /* onAppSettingsClick */ , true /* provisioned */,
+ null /* onSettingsClick */, null /* onAppSettingsClick */, true /* provisioned */,
false /* isNonblockable */, true /* isForBlockingHelper */,
true /* isUserSentimentNegative */, IMPORTANCE_DEFAULT, true);
@@ -772,14 +776,14 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testCloseControls_nonNullCheckSaveListenerDoesntDelayDismiss()
+ public void testCloseControls_nonNullCheckSaveListenerDoesntDelayDismiss_BlockingHelper()
throws Exception {
NotificationInfo.CheckSaveListener listener =
mock(NotificationInfo.CheckSaveListener.class);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */,
- null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+ null /* onSettingsClick */, null /* onAppSettingsClick */,
false /* isNonblockable */, true /* isForBlockingHelper */,
true, true /* isUserSentimentNegative */, /* isNoisy */
IMPORTANCE_DEFAULT, true);
@@ -791,7 +795,7 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testCloseControls_checkSaveListenerDelaysStopNotifications()
+ public void testCloseControls_checkSaveListenerDelaysStopNotifications_BlockingHelper()
throws Exception {
NotificationInfo.CheckSaveListener listener =
mock(NotificationInfo.CheckSaveListener.class);
@@ -849,18 +853,25 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testBlockChangedCallsUpdateNotificationChannel() throws Exception {
+ public void testBlockChangedCallsUpdateNotificationChannel_notBlockingHelper()
+ throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+ null, null, null,
+ true, false,
IMPORTANCE_DEFAULT, false);
mNotificationInfo.findViewById(R.id.int_block).performClick();
waitForUndoButton();
mNotificationInfo.handleCloseControls(true, false);
- verify(mMetricsLogger).write(importanceChangeLog(
- MetricsProto.MetricsEvent.TYPE_ACTION, IMPORTANCE_NONE - IMPORTANCE_LOW));
+ ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class);
+ verify(mMetricsLogger, times(2)).write(logMakerCaptor.capture());
+ assertEquals(MetricsProto.MetricsEvent.TYPE_ACTION,
+ logMakerCaptor.getValue().getType());
+ assertEquals(IMPORTANCE_NONE - IMPORTANCE_LOW,
+ logMakerCaptor.getValue().getSubtype());
mTestableLooper.processAllMessages();
ArgumentCaptor<NotificationChannel> updated =
@@ -896,8 +907,12 @@ public class NotificationInfoTest extends SysuiTestCase {
waitForUndoButton();
mNotificationInfo.handleCloseControls(true, false);
- verify(mMetricsLogger).write(importanceChangeLog(
- MetricsProto.MetricsEvent.TYPE_ACTION, IMPORTANCE_NONE - IMPORTANCE_LOW));
+ ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class);
+ verify(mMetricsLogger, times(3)).write(logMakerCaptor.capture());
+ assertEquals(MetricsProto.MetricsEvent.TYPE_ACTION,
+ logMakerCaptor.getValue().getType());
+ assertEquals(IMPORTANCE_NONE - IMPORTANCE_LOW,
+ logMakerCaptor.getValue().getSubtype());
mTestableLooper.processAllMessages();
ArgumentCaptor<NotificationChannel> updated =
@@ -965,10 +980,12 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testBlockUndoDoesNotBlockNotificationChannel() throws Exception {
+ public void testBlockUndoDoesNotBlockNotificationChannel_notBlockingHelper() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false,
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+ null, null, null,
+ true, false,
IMPORTANCE_DEFAULT, false);
mNotificationInfo.findViewById(R.id.int_block).performClick();
@@ -977,8 +994,15 @@ public class NotificationInfoTest extends SysuiTestCase {
waitForStopButton();
// mNotificationInfo.handleCloseControls doesn't get called by this interaction.
- verify(mMetricsLogger).write(importanceChangeLog(
- MetricsProto.MetricsEvent.TYPE_DISMISS, IMPORTANCE_NONE - IMPORTANCE_LOW));
+ ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class);
+ verify(mMetricsLogger, times(2)).write(logMakerCaptor.capture());
+ assertEquals(MetricsEvent.ACTION_SAVE_IMPORTANCE,
+ logMakerCaptor.getValue().getCategory());
+ assertEquals(MetricsEvent.TYPE_DISMISS,
+ logMakerCaptor.getValue().getType());
+ assertEquals(IMPORTANCE_NONE - IMPORTANCE_LOW,
+ logMakerCaptor.getValue().getSubtype());
+
mTestableLooper.processAllMessages();
verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
@@ -986,11 +1010,12 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testMinUndoDoesNotMinNotificationChannel() throws Exception {
+ public void testMinUndoDoesNotMinNotificationChannel_notBlockingHelper() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, true,
- IMPORTANCE_DEFAULT, false);
+ TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn,
+ null, null, null, true,
+ true, IMPORTANCE_DEFAULT, false);
mNotificationInfo.findViewById(R.id.minimize).performClick();
waitForUndoButton();
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
new file mode 100644
index 000000000000..13145b830178
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.phone;
+
+import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.NotificationListener;
+import com.android.systemui.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.phone.LightBarTransitionsController.DarkIntensityApplier;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class NotificationIconAreaControllerTest extends SysuiTestCase {
+
+ @Mock
+ private NotificationListener mListener;
+ @Mock
+ StatusBar mStatusBar;
+ @Mock
+ StatusBarStateController mStatusBarStateController;
+ private NotificationIconAreaController mController;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+
+ mController = new NotificationIconAreaController(mContext, mStatusBar,
+ mStatusBarStateController, mListener);
+ }
+
+ @Test
+ public void testNotificationIcons_featureOff() {
+ Settings.Secure.putInt(
+ mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 0);
+ assertTrue(mController.shouldShouldLowPriorityIcons());
+ }
+
+ @Test
+ public void testNotificationIcons_featureOn_settingHideIcons() {
+ Settings.Secure.putInt(
+ mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 1);
+ mController.mSettingsListener.onStatusBarIconsBehaviorChanged(true);
+
+ assertFalse(mController.shouldShouldLowPriorityIcons());
+ }
+
+ @Test
+ public void testNotificationIcons_featureOn_settingShowIcons() {
+ Settings.Secure.putInt(
+ mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 1);
+ mController.mSettingsListener.onStatusBarIconsBehaviorChanged(false);
+
+ assertTrue(mController.shouldShouldLowPriorityIcons());
+ }
+}
diff --git a/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml
index 8172e717850b..1d0b9b6d83db 100644
--- a/packages/VpnDialogs/AndroidManifest.xml
+++ b/packages/VpnDialogs/AndroidManifest.xml
@@ -20,6 +20,7 @@
package="com.android.vpndialogs">
<uses-permission android:name="android.permission.CONTROL_VPN" />
+ <uses-permission android:name="android.permission.CONTROL_ALWAYS_ON_VPN" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<application android:label="VpnDialogs"
diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto
index 385931d24bee..aeb4261e10a5 100644
--- a/proto/src/metrics_constants/metrics_constants.proto
+++ b/proto/src/metrics_constants/metrics_constants.proto
@@ -6910,6 +6910,11 @@ message MetricsEvent {
// CATEGORY: NOTIFICATION
FIELD_NOTIFICATION_CATEGORY = 1641;
+ // OPEN: Settings > Settings > Network & internet > Click Mobile network to land on page with
+ // details for a SIM/eSIM mobile network > Click edit icon to bring up a rename dialog.
+ // OS: Q
+ MOBILE_NETWORK_RENAME_DIALOG = 1642;
+
// ---- 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 84647a6040e0..b84736ba5c47 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -1775,6 +1775,21 @@ message WifiLinkLayerUsageStats {
}
message WifiUsabilityStatsEntry {
+ // Status codes for link probe status
+ enum LinkProbeStatus {
+ // Link probe status is unknown
+ PROBE_STATUS_UNKNOWN = 0;
+
+ // Link probe is not triggered
+ PROBE_STATUS_NO_PROBE = 1;
+
+ // Link probe is triggered and the result is success
+ PROBE_STATUS_SUCCESS = 2;
+
+ // Link probe is triggered and the result is failure
+ PROBE_STATUS_FAILURE = 3;
+ }
+
// Absolute milliseconds from device boot when these stats were sampled
optional int64 time_stamp_ms = 1;
@@ -1847,6 +1862,18 @@ message WifiUsabilityStatsEntry {
// Prediction horizon (in second) of Wifi usability score provided by external
// system app
optional int32 prediction_horizon_sec = 23;
+
+ // The link probe status since last stats update
+ optional LinkProbeStatus probe_status_since_last_update = 24;
+
+ // The elapsed time of the most recent link probe since last stats update;
+ optional int32 probe_elapsed_time_ms_since_last_update = 25;
+
+ // The MCS rate of the most recent link probe since last stats update
+ optional int32 probe_mcs_rate_since_last_update = 26;
+
+ // Rx link speed at the sample time in Mbps
+ optional int32 rx_link_speed_mbps = 27;
}
message WifiUsabilityStats {
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index f4ac13074903..fc43882b4ffd 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -348,8 +348,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
}
int getRelevantEventTypes() {
- return (mUsesAccessibilityCache ? AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK : 0)
- | mEventTypes;
+ return (mUsesAccessibilityCache ? AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK
+ : AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) | mEventTypes;
}
@Override
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index f88d5217ab2f..47cd917bf84e 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -3024,9 +3024,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
public void clearAccessibilityFocusNotLocked(int windowId) {
- AccessibilityNodeInfo focus = getAccessibilityFocusNotLocked(windowId);
- if (focus != null) {
- focus.performAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
+ RemoteAccessibilityConnection connection;
+ synchronized (mLock) {
+ connection = getConnectionLocked(windowId);
+ if (connection == null) {
+ return;
+ }
+ }
+ try {
+ connection.getRemote().clearAccessibilityFocus();
+ } catch (RemoteException re) {
+ if (DEBUG) {
+ Slog.e(LOG_TAG, "Error calling clearAccessibilityFocus()");
+ }
}
}
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index 7d228f1ad5f2..8b2c1b95ecfd 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -1863,7 +1863,7 @@ public class UserBackupManagerService {
// The agent was running with a stub Application object, so shut it down.
// !!! We hardcode the confirmation UI's package name here rather than use a
// manifest flag! TODO something less direct.
- if (app.uid >= Process.FIRST_APPLICATION_UID
+ if (!UserHandle.isCore(app.uid)
&& !app.packageName.equals("com.android.backupconfirm")) {
if (MORE_DEBUG) Slog.d(TAG, "Killing agent host process");
mActivityManager.killApplicationProcess(app.processName, app.uid);
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 7763d7b9adc0..324c2d974010 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -45,9 +45,9 @@ import android.content.pm.PackageManagerInternal;
import android.os.Bundle;
import android.os.Message;
import android.os.ParcelFileDescriptor;
-import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.util.EventLog;
import android.util.Slog;
@@ -1174,7 +1174,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// b. the app does not state android:killAfterRestore="false" in its manifest
final int appFlags = mCurrentPackage.applicationInfo.flags;
final boolean killAfterRestore =
- (mCurrentPackage.applicationInfo.uid >= Process.FIRST_APPLICATION_UID)
+ !UserHandle.isCore(mCurrentPackage.applicationInfo.uid)
&& ((mRestoreDescription.getDataType()
== RestoreDescription.TYPE_FULL_STREAM)
|| ((appFlags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0));
diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
index 2db89289e4fc..7ee304780530 100644
--- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
@@ -31,7 +31,6 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.content.pm.SigningInfo;
-import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Slog;
@@ -72,7 +71,7 @@ public class AppBackupUtils {
}
// 2. they run as a system-level uid
- if ((app.uid < Process.FIRST_APPLICATION_UID)) {
+ if (UserHandle.isCore(app.uid)) {
// and the backup is happening for non-system user
if (userId != UserHandle.USER_SYSTEM && !app.packageName.equals(
PACKAGE_MANAGER_SENTINEL)) {
diff --git a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
index cce5b3b4e238..97bde9c03440 100644
--- a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
@@ -34,7 +34,7 @@ import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.Bundle;
import android.os.IBinder;
-import android.os.Process;
+import android.os.UserHandle;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
@@ -162,7 +162,7 @@ public class RestoreUtils {
if (AppBackupUtils.signaturesMatch(sigs, pkg, pmi)) {
// If this is a system-uid app without a declared backup agent,
// don't restore any of the file data.
- if ((pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID)
+ if (UserHandle.isCore(pkg.applicationInfo.uid)
&& (pkg.applicationInfo.backupAgentName == null)) {
Slog.w(TAG, "Installed app " + info.packageName
+ " has restricted uid and no agent");
diff --git a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java
index f4b235a3f3e1..f3b80988fef3 100644
--- a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java
+++ b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java
@@ -53,7 +53,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.Bundle;
-import android.os.Process;
+import android.os.UserHandle;
import android.util.Slog;
import com.android.server.backup.FileMetadata;
@@ -404,8 +404,7 @@ public class TarBackupReader {
if ((flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0) {
// Restore system-uid-space packages only if they have
// defined a custom backup agent
- if ((pkgInfo.applicationInfo.uid
- >= Process.FIRST_APPLICATION_UID)
+ if (!UserHandle.isCore(pkgInfo.applicationInfo.uid)
|| (pkgInfo.applicationInfo.backupAgentName != null)) {
// Verify signatures against any installed version; if they
// don't match, then we fall though and ignore the data. The
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 1519c1785070..58263fce5119 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -40,6 +40,7 @@ import static android.net.NetworkPolicyManager.RULE_NONE;
import static android.net.NetworkPolicyManager.uidRulesToString;
import static android.net.NetworkStack.NETWORKSTACK_PACKAGE_NAME;
import static android.net.shared.NetworkMonitorUtils.isValidationRequired;
+import static android.net.shared.NetworkParcelableUtil.toStableParcelable;
import static android.os.Process.INVALID_UID;
import static android.system.OsConstants.IPPROTO_TCP;
import static android.system.OsConstants.IPPROTO_UDP;
@@ -78,6 +79,7 @@ import android.net.Network;
import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
import android.net.NetworkConfig;
+import android.net.NetworkFactory;
import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.NetworkMisc;
@@ -98,10 +100,10 @@ import android.net.VpnService;
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.NetworkEvent;
import android.net.netlink.InetDiagMessage;
-import android.net.shared.NetdService;
import android.net.shared.NetworkMonitorUtils;
import android.net.shared.PrivateDnsConfig;
import android.net.util.MultinetworkPolicyTracker;
+import android.net.util.NetdService;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -144,6 +146,7 @@ import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IBatteryStats;
+import com.android.internal.logging.MetricsLogger;
import com.android.internal.net.LegacyVpnInfo;
import com.android.internal.net.VpnConfig;
import com.android.internal.net.VpnInfo;
@@ -2683,6 +2686,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
EVENT_PROVISIONING_NOTIFICATION, PROVISIONING_NOTIFICATION_HIDE,
mNai.network.netId));
}
+
+ @Override
+ public void logCaptivePortalLoginEvent(int eventId, String packageName) {
+ new MetricsLogger().action(eventId, packageName);
+ }
}
private boolean networkRequiresValidation(NetworkAgentInfo nai) {
@@ -2772,8 +2780,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
if (nri.request.isListen()) continue;
NetworkAgentInfo nai = getNetworkForRequest(nri.request.requestId);
- ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK,
- (nai != null ? nai.getCurrentScore() : 0), 0, nri.request);
+ final int score;
+ final int serial;
+ if (nai != null) {
+ score = nai.getCurrentScore();
+ serial = nai.factorySerialNumber;
+ } else {
+ score = 0;
+ serial = NetworkFactory.SerialNumber.NONE;
+ }
+ ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, serial,
+ nri.request);
}
} else {
loge("Error connecting NetworkFactory");
@@ -2870,7 +2887,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkAgentInfo currentNetwork = getNetworkForRequest(request.requestId);
if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) {
clearNetworkForRequest(request.requestId);
- sendUpdatedScoreToFactories(request, 0);
+ sendUpdatedScoreToFactories(request, null);
}
}
nai.clearLingerState();
@@ -2946,7 +2963,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
rematchAllNetworksAndRequests(null, 0);
if (nri.request.isRequest() && getNetworkForRequest(nri.request.requestId) == null) {
- sendUpdatedScoreToFactories(nri.request, 0);
+ sendUpdatedScoreToFactories(nri.request, null);
}
}
@@ -4531,11 +4548,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
public final String name;
public final Messenger messenger;
public final AsyncChannel asyncChannel;
+ public final int factorySerialNumber;
- public NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel) {
+ NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel,
+ int factorySerialNumber) {
this.name = name;
this.messenger = messenger;
this.asyncChannel = asyncChannel;
+ this.factorySerialNumber = factorySerialNumber;
}
}
@@ -4896,10 +4916,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
@Override
- public void registerNetworkFactory(Messenger messenger, String name) {
+ public int registerNetworkFactory(Messenger messenger, String name) {
enforceConnectivityInternalPermission();
- NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel());
+ NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(),
+ NetworkFactory.SerialNumber.nextSerialNumber());
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));
+ return nfi.factorySerialNumber;
}
private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) {
@@ -4991,9 +5013,35 @@ public class ConnectivityService extends IConnectivityManager.Stub
return nri.request.requestId == mDefaultRequest.requestId;
}
+ // TODO : remove this method. It's a stopgap measure to help sheperding a number of dependent
+ // changes that would conflict throughout the automerger graph. Having this method temporarily
+ // helps with the process of going through with all these dependent changes across the entire
+ // tree.
public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
int currentScore, NetworkMisc networkMisc) {
+ return registerNetworkAgent(messenger, networkInfo, linkProperties, networkCapabilities,
+ currentScore, networkMisc, NetworkFactory.SerialNumber.NONE);
+ }
+
+ /**
+ * Register a new agent with ConnectivityService to handle a network.
+ *
+ * @param messenger a messenger for ConnectivityService to contact the agent asynchronously.
+ * @param networkInfo the initial info associated with this network. It can be updated later :
+ * see {@link #updateNetworkInfo}.
+ * @param linkProperties the initial link properties of this network. They can be updated
+ * later : see {@link #updateLinkProperties}.
+ * @param networkCapabilities the initial capabilites of this network. They can be updated
+ * later : see {@link #updateNetworkCapabilities}.
+ * @param currentScore the initial score of the network. See
+ * {@link NetworkAgentInfo#getCurrentScore}.
+ * @param networkMisc metadata about the network. This is never updated.
+ * @param factorySerialNumber the serial number of the factory owning this NetworkAgent.
+ */
+ public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
+ LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
+ int currentScore, NetworkMisc networkMisc, int factorySerialNumber) {
enforceConnectivityInternalPermission();
LinkProperties lp = new LinkProperties(linkProperties);
@@ -5003,7 +5051,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
new Network(reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore,
- mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS);
+ mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS,
+ factorySerialNumber);
// Make sure the network capabilities reflect what the agent info says.
nai.networkCapabilities = mixInCapabilities(nai, nc);
final String extraInfo = networkInfo.getExtraInfo();
@@ -5012,8 +5061,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (DBG) log("registerNetworkAgent " + nai);
final long token = Binder.clearCallingIdentity();
try {
- mContext.getSystemService(NetworkStack.class)
- .makeNetworkMonitor(nai.network, name, new NetworkMonitorCallbacks(nai));
+ mContext.getSystemService(NetworkStack.class).makeNetworkMonitor(
+ toStableParcelable(nai.network), name, new NetworkMonitorCallbacks(nai));
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -5419,17 +5468,23 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequest nr = nai.requestAt(i);
// Don't send listening requests to factories. b/17393458
if (nr.isListen()) continue;
- sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
+ sendUpdatedScoreToFactories(nr, nai);
}
}
- private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
+ private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, NetworkAgentInfo nai) {
+ int score = 0;
+ int serial = 0;
+ if (nai != null) {
+ score = nai.getCurrentScore();
+ serial = nai.factorySerialNumber;
+ }
if (VDBG || DDBG){
log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
}
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
- nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, 0,
- networkRequest);
+ nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score,
+ serial, networkRequest);
}
}
@@ -5705,7 +5760,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// TODO - this could get expensive if we have a lot of requests for this
// network. Think about if there is a way to reduce this. Push
// netid->request mapping to each factory?
- sendUpdatedScoreToFactories(nri.request, score);
+ sendUpdatedScoreToFactories(nri.request, newNetwork);
if (isDefaultRequest(nri)) {
isNewDefault = true;
oldDefaultNetwork = currentNetwork;
@@ -5729,7 +5784,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
newNetwork.removeRequest(nri.request.requestId);
if (currentNetwork == newNetwork) {
clearNetworkForRequest(nri.request.requestId);
- sendUpdatedScoreToFactories(nri.request, 0);
+ sendUpdatedScoreToFactories(nri.request, null);
} else {
Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " +
newNetwork.name() +
diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java
index 371276fbd2ae..126bf6556538 100644
--- a/services/core/java/com/android/server/IpSecService.java
+++ b/services/core/java/com/android/server/IpSecService.java
@@ -44,7 +44,7 @@ import android.net.LinkAddress;
import android.net.Network;
import android.net.NetworkUtils;
import android.net.TrafficStats;
-import android.net.shared.NetdService;
+import android.net.util.NetdService;
import android.os.Binder;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index d2c6354e91b8..33c6dd24012a 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -405,6 +405,7 @@ public class LocationManagerService extends ILocationManager.Stub {
// initialize in-memory settings values
onBackgroundThrottleWhitelistChangedLocked();
+ onIgnoreSettingsWhitelistChangedLocked();
}
@GuardedBy("mLock")
@@ -547,18 +548,17 @@ public class LocationManagerService extends ILocationManager.Stub {
@GuardedBy("mLock")
private void onBackgroundThrottleWhitelistChangedLocked() {
+ mBackgroundThrottlePackageWhitelist.clear();
+ mBackgroundThrottlePackageWhitelist.addAll(
+ SystemConfig.getInstance().getAllowUnthrottledLocation());
+
String setting = Settings.Global.getString(
mContext.getContentResolver(),
Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST);
- if (setting == null) {
- setting = "";
+ if (!TextUtils.isEmpty(setting)) {
+ mBackgroundThrottlePackageWhitelist.addAll(Arrays.asList(setting.split(",")));
}
- mBackgroundThrottlePackageWhitelist.clear();
- mBackgroundThrottlePackageWhitelist.addAll(
- SystemConfig.getInstance().getAllowUnthrottledLocation());
- mBackgroundThrottlePackageWhitelist.addAll(Arrays.asList(setting.split(",")));
-
for (LocationProvider p : mProviders) {
applyRequirementsLocked(p);
}
@@ -566,18 +566,17 @@ public class LocationManagerService extends ILocationManager.Stub {
@GuardedBy("lock")
private void onIgnoreSettingsWhitelistChangedLocked() {
+ mIgnoreSettingsPackageWhitelist.clear();
+ mIgnoreSettingsPackageWhitelist.addAll(
+ SystemConfig.getInstance().getAllowIgnoreLocationSettings());
+
String setting = Settings.Global.getString(
mContext.getContentResolver(),
Settings.Global.LOCATION_IGNORE_SETTINGS_PACKAGE_WHITELIST);
- if (setting == null) {
- setting = "";
+ if (!TextUtils.isEmpty(setting)) {
+ mIgnoreSettingsPackageWhitelist.addAll(Arrays.asList(setting.split(",")));
}
- mIgnoreSettingsPackageWhitelist.clear();
- mIgnoreSettingsPackageWhitelist.addAll(
- SystemConfig.getInstance().getAllowIgnoreLocationSettings());
- mIgnoreSettingsPackageWhitelist.addAll(Arrays.asList(setting.split(",")));
-
for (LocationProvider p : mProviders) {
applyRequirementsLocked(p);
}
@@ -2200,7 +2199,7 @@ public class LocationManagerService extends ILocationManager.Stub {
return false;
}
- if (mBackgroundThrottlePackageWhitelist.contains(record.mReceiver.mIdentity.mPackageName)) {
+ if (mIgnoreSettingsPackageWhitelist.contains(record.mReceiver.mIdentity.mPackageName)) {
return true;
}
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index b3997ef2b54f..f505b76178a4 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -62,7 +62,7 @@ import android.net.NetworkUtils;
import android.net.RouteInfo;
import android.net.TetherStatsParcel;
import android.net.UidRange;
-import android.net.shared.NetdService;
+import android.net.util.NetdService;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Handler;
diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java
index 84577f125f1d..4507193a5aff 100644
--- a/services/core/java/com/android/server/PackageWatchdog.java
+++ b/services/core/java/com/android/server/PackageWatchdog.java
@@ -21,6 +21,7 @@ import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.content.Context;
+import android.content.pm.VersionedPackage;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
@@ -230,7 +231,6 @@ public class PackageWatchdog {
return null;
}
- // TODO(zezeozue:) Accept current versionCodes of failing packages?
/**
* Called when a process fails either due to a crash or ANR.
*
@@ -239,15 +239,16 @@ public class PackageWatchdog {
*
* <p>This method could be called frequently if there is a severe problem on the device.
*/
- public void onPackageFailure(String[] packages) {
+ public void onPackageFailure(List<VersionedPackage> packages) {
mWorkerHandler.post(() -> {
synchronized (mLock) {
if (mAllObservers.isEmpty()) {
return;
}
- for (int pIndex = 0; pIndex < packages.length; pIndex++) {
- String packageToReport = packages[pIndex];
+ for (int pIndex = 0; pIndex < packages.size(); pIndex++) {
+ String packageToReport = packages.get(pIndex).getPackageName();
+ long packageVersionCode = packages.get(pIndex).getVersionCode();
// Observer that will receive failure for packageToReport
PackageHealthObserver currentObserverToNotify = null;
int currentObserverImpact = Integer.MAX_VALUE;
@@ -258,7 +259,8 @@ public class PackageWatchdog {
PackageHealthObserver registeredObserver = observer.mRegisteredObserver;
if (registeredObserver != null
&& observer.onPackageFailure(packageToReport)) {
- int impact = registeredObserver.onHealthCheckFailed(packageToReport);
+ int impact = registeredObserver.onHealthCheckFailed(packageToReport,
+ packageVersionCode);
if (impact != PackageHealthObserverImpact.USER_IMPACT_NONE
&& impact < currentObserverImpact) {
currentObserverToNotify = registeredObserver;
@@ -269,7 +271,7 @@ public class PackageWatchdog {
// Execute action with least user impact
if (currentObserverToNotify != null) {
- currentObserverToNotify.execute(packageToReport);
+ currentObserverToNotify.execute(packageToReport, packageVersionCode);
}
}
}
@@ -313,14 +315,14 @@ public class PackageWatchdog {
* @return any one of {@link PackageHealthObserverImpact} to express the impact
* to the user on {@link #execute}
*/
- @PackageHealthObserverImpact int onHealthCheckFailed(String packageName);
+ @PackageHealthObserverImpact int onHealthCheckFailed(String packageName, long versionCdoe);
/**
* Executes mitigation for {@link #onHealthCheckFailed}.
*
* @return {@code true} if action was executed successfully, {@code false} otherwise
*/
- boolean execute(String packageName);
+ boolean execute(String packageName, long versionCode);
// TODO(zezeozue): Ensure uniqueness?
/**
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index cecd55a325d3..f2329d3ebf8e 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -1541,10 +1541,6 @@ class StorageManagerService extends IStorageManager.Stub
mCallbacks = new Callbacks(FgThread.get().getLooper());
mLockPatternUtils = new LockPatternUtils(mContext);
- mPmInternal = LocalServices.getService(PackageManagerInternal.class);
- mUmInternal = LocalServices.getService(UserManagerInternal.class);
- mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
-
HandlerThread hthread = new HandlerThread(TAG);
hthread.start();
mHandler = new StorageManagerServiceHandler(hthread.getLooper());
@@ -1662,6 +1658,19 @@ class StorageManagerService extends IStorageManager.Stub
}
private void servicesReady() {
+ mPmInternal = LocalServices.getService(PackageManagerInternal.class);
+ mUmInternal = LocalServices.getService(UserManagerInternal.class);
+ mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
+
+ mIPackageManager = IPackageManager.Stub.asInterface(
+ ServiceManager.getService("package"));
+ mIAppOpsService = IAppOpsService.Stub.asInterface(
+ ServiceManager.getService(Context.APP_OPS_SERVICE));
+ try {
+ mIAppOpsService.startWatchingMode(OP_REQUEST_INSTALL_PACKAGES, null, mAppOpsCallback);
+ } catch (RemoteException e) {
+ }
+
synchronized (mLock) {
final boolean thisIsolatedStorage = StorageManager.hasIsolatedStorage();
if (mLastIsolatedStorage == thisIsolatedStorage) {
@@ -1734,14 +1743,6 @@ class StorageManagerService extends IStorageManager.Stub
.registerScreenObserver(this);
mSystemReady = true;
- mIPackageManager = IPackageManager.Stub.asInterface(
- ServiceManager.getService("package"));
- mIAppOpsService = IAppOpsService.Stub.asInterface(
- ServiceManager.getService(Context.APP_OPS_SERVICE));
- try {
- mIAppOpsService.startWatchingMode(OP_REQUEST_INSTALL_PACKAGES, null, mAppOpsCallback);
- } catch (RemoteException e) {
- }
mHandler.obtainMessage(H_SYSTEM_READY).sendToTarget();
}
diff --git a/services/core/java/com/android/server/ThreadPriorityBooster.java b/services/core/java/com/android/server/ThreadPriorityBooster.java
index 53e8ce43fff8..f74a438509c2 100644
--- a/services/core/java/com/android/server/ThreadPriorityBooster.java
+++ b/services/core/java/com/android/server/ThreadPriorityBooster.java
@@ -43,9 +43,9 @@ public class ThreadPriorityBooster {
public void boost() {
final int tid = myTid();
- final int prevPriority = getThreadPriority(tid);
final PriorityState state = mThreadState.get();
if (state.regionCounter == 0) {
+ final int prevPriority = getThreadPriority(tid);
state.prevPriority = prevPriority;
if (prevPriority > mBoostToPriority) {
setThreadPriority(tid, mBoostToPriority);
@@ -60,9 +60,11 @@ public class ThreadPriorityBooster {
public void reset() {
final PriorityState state = mThreadState.get();
state.regionCounter--;
- final int currentPriority = getThreadPriority(myTid());
- if (state.regionCounter == 0 && state.prevPriority != currentPriority) {
- setThreadPriority(myTid(), state.prevPriority);
+ if (state.regionCounter == 0) {
+ final int currentPriority = getThreadPriority(myTid());
+ if (state.prevPriority != currentPriority) {
+ setThreadPriority(myTid(), state.prevPriority);
+ }
}
}
@@ -77,9 +79,11 @@ public class ThreadPriorityBooster {
mBoostToPriority = priority;
final PriorityState state = mThreadState.get();
final int tid = myTid();
- final int prevPriority = getThreadPriority(tid);
- if (state.regionCounter != 0 && prevPriority != priority) {
- setThreadPriority(tid, priority);
+ if (state.regionCounter != 0) {
+ final int prevPriority = getThreadPriority(tid);
+ if (prevPriority != priority) {
+ setThreadPriority(tid, priority);
+ }
}
}
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index f6e698ff7839..9b9911a476ca 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -593,7 +593,7 @@ public class VibratorService extends IVibratorService.Stub
Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg, reason);
if (mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)
> ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
- && vib.isHapticFeedback()) {
+ && !vib.isNotification() && !vib.isRingtone()) {
Slog.e(TAG, "Ignoring incoming vibration as process with uid = "
+ uid + " is background");
return;
diff --git a/services/core/java/com/android/server/am/ActiveInstrumentation.java b/services/core/java/com/android/server/am/ActiveInstrumentation.java
index 15de3def913a..9510f594785a 100644
--- a/services/core/java/com/android/server/am/ActiveInstrumentation.java
+++ b/services/core/java/com/android/server/am/ActiveInstrumentation.java
@@ -49,6 +49,9 @@ class ActiveInstrumentation {
// Connection to use the UI introspection APIs.
IUiAutomationConnection mUiAutomationConnection;
+ // Whether the caller holds START_ACTIVITIES_FROM_BACKGROUND permission
+ boolean mHasBackgroundActivityStartsPermission;
+
// As given to us
Bundle mArguments;
@@ -117,6 +120,8 @@ class ActiveInstrumentation {
pw.print(prefix); pw.print("mUiAutomationConnection=");
pw.println(mUiAutomationConnection);
}
+ pw.print("mHasBackgroundActivityStartsPermission=");
+ pw.println(mHasBackgroundActivityStartsPermission);
pw.print(prefix); pw.print("mArguments=");
pw.println(mArguments);
}
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 15d7efb5a74a..d95604e91ca3 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -3318,8 +3318,7 @@ public final class ActiveServices {
}
private boolean collectPackageServicesLocked(String packageName, Set<String> filterByClasses,
- boolean evenPersistent, boolean doit, boolean killProcess,
- ArrayMap<ComponentName, ServiceRecord> services) {
+ boolean evenPersistent, boolean doit, ArrayMap<ComponentName, ServiceRecord> services) {
boolean didSomething = false;
for (int i = services.size() - 1; i >= 0; i--) {
ServiceRecord service = services.valueAt(i);
@@ -3334,13 +3333,10 @@ public final class ActiveServices {
}
didSomething = true;
Slog.i(TAG, " Force stopping service " + service);
- if (service.app != null) {
- service.app.removed = killProcess;
- if (!service.app.isPersistent()) {
- service.app.services.remove(service);
- if (service.whitelistManager) {
- updateWhitelistManagerLocked(service.app);
- }
+ if (service.app != null && !service.app.isPersistent()) {
+ service.app.services.remove(service);
+ if (service.whitelistManager) {
+ updateWhitelistManagerLocked(service.app);
}
}
service.setProcess(null);
@@ -3355,7 +3351,7 @@ public final class ActiveServices {
}
boolean bringDownDisabledPackageServicesLocked(String packageName, Set<String> filterByClasses,
- int userId, boolean evenPersistent, boolean killProcess, boolean doit) {
+ int userId, boolean evenPersistent, boolean doit) {
boolean didSomething = false;
if (mTmpCollectionResults != null) {
@@ -3365,8 +3361,7 @@ public final class ActiveServices {
if (userId == UserHandle.USER_ALL) {
for (int i = mServiceMap.size() - 1; i >= 0; i--) {
didSomething |= collectPackageServicesLocked(packageName, filterByClasses,
- evenPersistent, doit, killProcess,
- mServiceMap.valueAt(i).mServicesByInstanceName);
+ evenPersistent, doit, mServiceMap.valueAt(i).mServicesByInstanceName);
if (!doit && didSomething) {
return true;
}
@@ -3379,7 +3374,7 @@ public final class ActiveServices {
if (smap != null) {
ArrayMap<ComponentName, ServiceRecord> items = smap.mServicesByInstanceName;
didSomething = collectPackageServicesLocked(packageName, filterByClasses,
- evenPersistent, doit, killProcess, items);
+ evenPersistent, doit, items);
}
if (doit && filterByClasses == null) {
forceStopPackageLocked(packageName, userId);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index ffed2e08b583..66e9eb3a33ba 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -22,6 +22,7 @@ import static android.Manifest.permission.FILTER_EVENTS;
import static android.Manifest.permission.INTERACT_ACROSS_USERS;
import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import static android.Manifest.permission.REMOVE_TASKS;
+import static android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND;
import static android.app.ActivityManager.INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS;
import static android.app.ActivityManager.INSTR_FLAG_MOUNT_EXTERNAL_STORAGE_FULL;
import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
@@ -2217,7 +2218,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mConstants = hasHandlerThread ? new ActivityManagerConstants(this, mHandler) : null;
final ActiveUids activeUids = new ActiveUids(this, false /* postChangesToAtm */);
mProcessList.init(this, activeUids);
- mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);
+ mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, new Object());
mIntentFirewall = hasHandlerThread
? new IntentFirewall(new IntentFirewallInterface(), mHandler) : null;
@@ -2265,7 +2266,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mConstants = new ActivityManagerConstants(this, mHandler);
final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */);
mProcessList.init(this, activeUids);
- mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids);
+ mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, atm.getGlobalLock());
// Broadcast policy parameters
final BroadcastConstants foreConstants = new BroadcastConstants(
@@ -3091,7 +3092,7 @@ public class ActivityManagerService extends IActivityManager.Stub
} else {
UidRecord validateUid = mValidateUids.get(item.uid);
if (validateUid == null) {
- validateUid = new UidRecord(item.uid, mAtmInternal);
+ validateUid = new UidRecord(item.uid);
mValidateUids.put(item.uid, validateUid);
}
if ((item.change & UidRecord.CHANGE_IDLE) != 0) {
@@ -3891,7 +3892,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
synchronized (this) {
mProcessList.killPackageProcessesLocked(packageName, appId, targetUserId,
- ProcessList.SERVICE_ADJ, false, true, true, false, "kill background");
+ ProcessList.SERVICE_ADJ, "kill background");
}
}
} finally {
@@ -4252,7 +4253,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
private void cleanupDisabledPackageComponentsLocked(
- String packageName, int userId, boolean killProcess, String[] changedClasses) {
+ String packageName, int userId, String[] changedClasses) {
Set<String> disabledClasses = null;
boolean packageDisabled = false;
@@ -4315,7 +4316,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// Clean-up disabled services.
mServices.bringDownDisabledPackageServicesLocked(
- packageName, disabledClasses, userId, false, killProcess, true);
+ packageName, disabledClasses, userId, false /* evenPersistent */, true /* doIt */);
// Clean-up disabled providers.
ArrayList<ContentProviderRecord> providers = new ArrayList<>();
@@ -4372,14 +4373,15 @@ public class ActivityManagerService extends IActivityManager.Stub
}
boolean didSomething = mProcessList.killPackageProcessesLocked(packageName, appId, userId,
- ProcessList.INVALID_ADJ, callerWillRestart, true, doit, evenPersistent,
+ ProcessList.INVALID_ADJ, callerWillRestart, true /* allowRestart */, doit,
+ evenPersistent, true /* setRemoved */,
packageName == null ? ("stop user " + userId) : ("stop " + packageName));
didSomething |=
mAtmInternal.onForceStopPackage(packageName, doit, evenPersistent, userId);
if (mServices.bringDownDisabledPackageServicesLocked(
- packageName, null, userId, evenPersistent, true, doit)) {
+ packageName, null /* filterByClasses */, userId, evenPersistent, doit)) {
if (!doit) {
return true;
}
@@ -8336,9 +8338,10 @@ public class ActivityManagerService extends IActivityManager.Stub
synchronized (this) {
final long identity = Binder.clearCallingIdentity();
try {
- mProcessList.killPackageProcessesLocked(null, appId, userId,
- ProcessList.PERSISTENT_PROC_ADJ, false, true, true, true,
- reason != null ? reason : "kill uid");
+ mProcessList.killPackageProcessesLocked(null /* packageName */, appId, userId,
+ ProcessList.PERSISTENT_PROC_ADJ, false /* callerWillRestart */,
+ true /* callerWillRestart */, true /* doit */, true /* evenPersistent */,
+ false /* setRemoved */, reason != null ? reason : "kill uid");
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -14573,10 +14576,9 @@ public class ActivityManagerService extends IActivityManager.Stub
-1);
mProcessList.killPackageProcessesLocked(ssp,
UserHandle.getAppId(extraUid),
- userId, ProcessList.INVALID_ADJ,
- false, true, true, false, "change " + ssp);
+ userId, ProcessList.INVALID_ADJ, "change " + ssp);
}
- cleanupDisabledPackageComponentsLocked(ssp, userId, killProcess,
+ cleanupDisabledPackageComponentsLocked(ssp, userId,
intent.getStringArrayExtra(
Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST));
}
@@ -15194,7 +15196,9 @@ public class ActivityManagerService extends IActivityManager.Stub
IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection,
int userId, String abiOverride) {
enforceNotIsolatedCaller("startInstrumentation");
- userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+ final int callingUid = Binder.getCallingUid();
+ final int callingPid = Binder.getCallingPid();
+ userId = mUserController.handleIncomingUser(callingPid, callingUid,
userId, false, ALLOW_FULL_ONLY, "startInstrumentation", null);
// Refuse possible leaked file descriptors
if (arguments != null && arguments.hasFileDescriptors()) {
@@ -15259,6 +15263,9 @@ public class ActivityManagerService extends IActivityManager.Stub
activeInstr.mWatcher = watcher;
activeInstr.mUiAutomationConnection = uiAutomationConnection;
activeInstr.mResultClass = className;
+ activeInstr.mHasBackgroundActivityStartsPermission = checkPermission(
+ START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid)
+ == PackageManager.PERMISSION_GRANTED;
boolean disableHiddenApiChecks = ai.usesNonSdkApi()
|| (flags & INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0;
@@ -17232,10 +17239,8 @@ public class ActivityManagerService extends IActivityManager.Stub
// We don't kill persistent processes.
continue;
}
- if (app.removed) {
- procs.add(app);
- } else if (app.userId == userHandle && app.hasForegroundActivities()) {
- app.removed = true;
+ if (app.removed
+ || (app.userId == userHandle && app.hasForegroundActivities())) {
procs.add(app);
}
}
@@ -18080,8 +18085,7 @@ public class ActivityManagerService extends IActivityManager.Stub
try {
synchronized(this) {
mProcessList.killPackageProcessesLocked(packageName, UserHandle.getAppId(pkgUid),
- userId, ProcessList.FOREGROUND_APP_ADJ, false, true, true, false,
- "dep: " + packageName);
+ userId, ProcessList.FOREGROUND_APP_ADJ, "dep: " + packageName);
}
} finally {
Binder.restoreCallingIdentity(callingId);
diff --git a/services/core/java/com/android/server/am/AppCompactor.java b/services/core/java/com/android/server/am/AppCompactor.java
index bb55ec3100c0..1118014dab96 100644
--- a/services/core/java/com/android/server/am/AppCompactor.java
+++ b/services/core/java/com/android/server/am/AppCompactor.java
@@ -19,6 +19,7 @@ package com.android.server.am;
import static android.os.Process.THREAD_PRIORITY_FOREGROUND;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2;
+import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3;
@@ -45,6 +46,7 @@ import com.android.server.ServiceThread;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Random;
public final class AppCompactor {
@@ -65,6 +67,8 @@ public final class AppCompactor {
@VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_2 = 10_000;
@VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_3 = 500;
@VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_4 = 10_000;
+ // The sampling rate to push app compaction events into statsd for upload.
+ @VisibleForTesting static final float DEFAULT_STATSD_SAMPLE_RATE = 0.1f;
@VisibleForTesting
interface PropertyChangedCallbackForTest {
@@ -104,6 +108,8 @@ public final class AppCompactor {
|| KEY_COMPACT_THROTTLE_3.equals(name)
|| KEY_COMPACT_THROTTLE_4.equals(name)) {
updateCompactionThrottles();
+ } else if (KEY_COMPACT_STATSD_SAMPLE_RATE.equals(name)) {
+ updateStatsdSampleRate();
}
}
if (mTestCallback != null) {
@@ -116,21 +122,25 @@ public final class AppCompactor {
// Configured by phenotype. Updates from the server take effect immediately.
@GuardedBy("mPhenotypeFlagLock")
- @VisibleForTesting String mCompactActionSome =
+ @VisibleForTesting volatile String mCompactActionSome =
compactActionIntToString(DEFAULT_COMPACT_ACTION_1);
@GuardedBy("mPhenotypeFlagLock")
- @VisibleForTesting String mCompactActionFull =
+ @VisibleForTesting volatile String mCompactActionFull =
compactActionIntToString(DEFAULT_COMPACT_ACTION_2);
@GuardedBy("mPhenotypeFlagLock")
- @VisibleForTesting long mCompactThrottleSomeSome = DEFAULT_COMPACT_THROTTLE_1;
+ @VisibleForTesting volatile long mCompactThrottleSomeSome = DEFAULT_COMPACT_THROTTLE_1;
@GuardedBy("mPhenotypeFlagLock")
- @VisibleForTesting long mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2;
+ @VisibleForTesting volatile long mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2;
@GuardedBy("mPhenotypeFlagLock")
- @VisibleForTesting long mCompactThrottleFullSome = DEFAULT_COMPACT_THROTTLE_3;
+ @VisibleForTesting volatile long mCompactThrottleFullSome = DEFAULT_COMPACT_THROTTLE_3;
@GuardedBy("mPhenotypeFlagLock")
- @VisibleForTesting long mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4;
+ @VisibleForTesting volatile long mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4;
@GuardedBy("mPhenotypeFlagLock")
- private boolean mUseCompaction = DEFAULT_USE_COMPACTION;
+ private volatile boolean mUseCompaction = DEFAULT_USE_COMPACTION;
+
+ private final Random mRandom = new Random();
+ @GuardedBy("mPhenotypeFlagLock")
+ @VisibleForTesting volatile float mStatsdSampleRate = DEFAULT_STATSD_SAMPLE_RATE;
// Handler on which compaction runs.
private Handler mCompactionHandler;
@@ -158,6 +168,7 @@ public final class AppCompactor {
updateUseCompaction();
updateCompactionActions();
updateCompactionThrottles();
+ updateStatsdSampleRate();
}
}
@@ -181,6 +192,7 @@ public final class AppCompactor {
pw.println(" " + KEY_COMPACT_THROTTLE_2 + "=" + mCompactThrottleSomeFull);
pw.println(" " + KEY_COMPACT_THROTTLE_3 + "=" + mCompactThrottleFullSome);
pw.println(" " + KEY_COMPACT_THROTTLE_4 + "=" + mCompactThrottleFullFull);
+ pw.println(" " + KEY_COMPACT_STATSD_SAMPLE_RATE + "=" + mStatsdSampleRate);
}
}
@@ -289,6 +301,19 @@ public final class AppCompactor {
}
}
+ @GuardedBy("mPhenotypeFlagLock")
+ private void updateStatsdSampleRate() {
+ String sampleRateFlag = DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ KEY_COMPACT_STATSD_SAMPLE_RATE);
+ try {
+ mStatsdSampleRate = TextUtils.isEmpty(sampleRateFlag)
+ ? DEFAULT_STATSD_SAMPLE_RATE : Float.parseFloat(sampleRateFlag);
+ } catch (NumberFormatException e) {
+ mStatsdSampleRate = DEFAULT_STATSD_SAMPLE_RATE;
+ }
+ mStatsdSampleRate = Math.min(1.0f, Math.max(0.0f, mStatsdSampleRate));
+ }
+
@VisibleForTesting
static String compactActionIntToString(int action) {
switch(action) {
@@ -385,11 +410,16 @@ public final class AppCompactor {
rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3],
rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time,
lastCompactAction, lastCompactTime, msg.arg1, msg.arg2);
- StatsLog.write(StatsLog.APP_COMPACTED, pid, name, pendingAction,
- rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3],
- rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time,
- lastCompactAction, lastCompactTime, msg.arg1,
- ActivityManager.processStateAmToProto(msg.arg2));
+ // Note that as above not taking mPhenoTypeFlagLock here to avoid locking
+ // on every single compaction for a flag that will seldom change and the
+ // impact of reading the wrong value here is low.
+ if (mRandom.nextFloat() < mStatsdSampleRate) {
+ StatsLog.write(StatsLog.APP_COMPACTED, pid, name, pendingAction,
+ rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3],
+ rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time,
+ lastCompactAction, lastCompactTime, msg.arg1,
+ ActivityManager.processStateAmToProto(msg.arg2));
+ }
synchronized (mAm) {
proc.lastCompactTime = end;
proc.lastCompactAction = pendingAction;
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index a634b577f506..f153ab9cfa9e 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -34,6 +34,7 @@ import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
+import android.content.pm.VersionedPackage;
import android.net.Uri;
import android.os.Binder;
import android.os.Message;
@@ -60,6 +61,7 @@ import com.android.server.wm.WindowProcessController;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Collections;
+import java.util.List;
/**
* Controls error conditions in applications.
@@ -411,7 +413,7 @@ class AppErrors {
} else {
// If a non-persistent app is stuck in crash loop, we want to inform
// the package watchdog, maybe an update or experiment can be rolled back.
- mPackageWatchdog.onPackageFailure(r.getPackageList());
+ mPackageWatchdog.onPackageFailure(r.getPackageListWithVersionCode());
}
}
@@ -830,7 +832,7 @@ class AppErrors {
void handleShowAnrUi(Message msg) {
Dialog dialogToShow = null;
- String[] packageList = null;
+ List<VersionedPackage> packageList = null;
synchronized (mService) {
AppNotRespondingDialog.Data data = (AppNotRespondingDialog.Data) msg.obj;
final ProcessRecord proc = data.proc;
@@ -839,7 +841,7 @@ class AppErrors {
return;
}
if (!proc.isPersistent()) {
- packageList = proc.getPackageList();
+ packageList = proc.getPackageListWithVersionCode();
}
if (proc.anrDialog != null) {
Slog.e(TAG, "App already has anr dialog: " + proc);
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 64a36ef66f12..1fb11baab2e4 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -450,7 +450,7 @@ public final class BroadcastQueue {
if (state == BroadcastRecord.IDLE) {
Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE");
}
- if (r.allowBackgroundActivityStarts) {
+ if (r.allowBackgroundActivityStarts && r.curApp != null) {
r.curApp.removeAllowBackgroundActivityStartsToken(r);
}
// If we're abandoning this broadcast before any receivers were actually spun up,
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 6e8646e476b3..4985c52ea118 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -127,8 +127,18 @@ public final class OomAdjuster {
private final ActivityManagerService mService;
private final ProcessList mProcessList;
- OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids) {
+ /**
+ * Used to lock {@link #updateOomAdjImpl} for state consistency. It also reduces frequency lock
+ * and unlock when getting and setting value to {@link ProcessRecord#mWindowProcessController}.
+ * Note it is declared as Object type so the locked-region-code-injection won't wrap the
+ * unnecessary priority booster.
+ */
+ private final Object mAtmGlobalLock;
+
+ OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids,
+ Object atmGlobalLock) {
mService = service;
+ mAtmGlobalLock = atmGlobalLock;
mProcessList = processList;
mActiveUids = activeUids;
@@ -186,6 +196,13 @@ public final class OomAdjuster {
@GuardedBy("mService")
final void updateOomAdjLocked() {
+ synchronized (mAtmGlobalLock) {
+ updateOomAdjImpl();
+ }
+ }
+
+ @GuardedBy({"mService", "mAtmGlobalLock"})
+ private void updateOomAdjImpl() {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "updateOomAdj");
mService.mOomAdjProfiler.oomAdjStarted();
final ProcessRecord TOP_APP = mService.getTopAppLocked();
@@ -534,6 +551,7 @@ public final class OomAdjuster {
uidRec.setProcState = uidRec.getCurProcState();
uidRec.setWhitelist = uidRec.curWhitelist;
uidRec.setIdle = uidRec.idle;
+ mService.mAtmInternal.onUidProcStateChanged(uidRec.uid, uidRec.setProcState);
mService.enqueueUidChangeLocked(uidRec, -1, uidChange);
mService.noteUidProcessState(uidRec.uid, uidRec.getCurProcState());
if (uidRec.foregroundServices) {
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index c2e77633510c..49c4bc486d2e 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -2043,25 +2043,25 @@ public final class ProcessList {
// We don't kill persistent processes.
continue;
}
- if (app.removed) {
- procs.add(app);
- } else if (app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
- app.removed = true;
+ if (app.removed || app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
procs.add(app);
}
}
}
+ }
- final int N = procs.size();
- for (int i = 0; i < N; i++) {
- removeProcessLocked(procs.get(i), false, true, "kill all background");
- }
+ @GuardedBy("mService")
+ boolean killPackageProcessesLocked(String packageName, int appId, int userId, int minOomAdj,
+ String reason) {
+ return killPackageProcessesLocked(packageName, appId, userId, minOomAdj,
+ false /* callerWillRestart */, true /* allowRestart */, true /* doit */,
+ false /* evenPersistent */, false /* setRemoved */, reason);
}
@GuardedBy("mService")
final boolean killPackageProcessesLocked(String packageName, int appId,
int userId, int minOomAdj, boolean callerWillRestart, boolean allowRestart,
- boolean doit, boolean evenPersistent, String reason) {
+ boolean doit, boolean evenPersistent, boolean setRemoved, String reason) {
ArrayList<ProcessRecord> procs = new ArrayList<>();
// Remove all processes this package may have touched: all with the
@@ -2119,7 +2119,9 @@ public final class ProcessList {
if (!doit) {
return true;
}
- app.removed = true;
+ if (setRemoved) {
+ app.removed = true;
+ }
procs.add(app);
}
}
@@ -2195,7 +2197,7 @@ public final class ProcessList {
}
UidRecord uidRec = mActiveUids.get(proc.uid);
if (uidRec == null) {
- uidRec = new UidRecord(proc.uid, mService.mAtmInternal);
+ uidRec = new UidRecord(proc.uid);
// This is the first appearance of the uid, report it now!
if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
"Creating new process uid: " + uidRec);
@@ -2353,11 +2355,8 @@ public final class ProcessList {
final int NA = apps.size();
for (int ia = 0; ia < NA; ia++) {
final ProcessRecord app = apps.valueAt(ia);
- if (app.removed) {
- procs.add(app);
- } else if ((minTargetSdk < 0 || app.info.targetSdkVersion < minTargetSdk)
- && (maxProcState < 0 || app.setProcState > maxProcState)) {
- app.removed = true;
+ if (app.removed || ((minTargetSdk < 0 || app.info.targetSdkVersion < minTargetSdk)
+ && (maxProcState < 0 || app.setProcState > maxProcState))) {
procs.add(app);
}
}
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 7e524631fcfe..6161f7d0a239 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -32,6 +32,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.ServiceInfo;
+import android.content.pm.VersionedPackage;
import android.content.res.CompatibilityInfo;
import android.os.Binder;
import android.os.Debug;
@@ -66,6 +67,7 @@ import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
/**
* Full information about a particular process that
@@ -266,7 +268,9 @@ final class ProcessRecord implements WindowProcessListener {
boolean forceCrashReport; // suppress normal auto-dismiss of crash dialog & report UI?
private boolean mNotResponding; // does the app have a not responding dialog?
Dialog anrDialog; // dialog being displayed due to app not resp.
- boolean removed; // has app package been removed from device?
+ volatile boolean removed; // Whether this process should be killed and removed from process
+ // list. It is set when the package is force-stopped or the process
+ // has crashed too many times.
private boolean mDebugging; // was app launched for debugging?
boolean waitedForDebugger; // has process show wait for debugger dialog?
Dialog waitDialog; // current wait for debugger dialog
@@ -651,10 +655,6 @@ final class ProcessRecord implements WindowProcessListener {
return mWindowProcessController.hasActivities();
}
- void clearActivities() {
- mWindowProcessController.clearActivities();
- }
-
boolean hasActivitiesOrRecentTasks() {
return mWindowProcessController.hasActivitiesOrRecentTasks();
}
@@ -663,10 +663,6 @@ final class ProcessRecord implements WindowProcessListener {
return mWindowProcessController.hasRecentTasks();
}
- void clearRecentTasks() {
- mWindowProcessController.clearRecentTasks();
- }
-
/**
* This method returns true if any of the activities within the process record are interesting
* to the user. See HistoryRecord.isInterestingToUserLocked()
@@ -972,6 +968,18 @@ final class ProcessRecord implements WindowProcessListener {
return list;
}
+ public List<VersionedPackage> getPackageListWithVersionCode() {
+ int size = pkgList.size();
+ if (size == 0) {
+ return null;
+ }
+ List<VersionedPackage> list = new ArrayList<>();
+ for (int i = 0; i < pkgList.size(); i++) {
+ list.add(new VersionedPackage(pkgList.keyAt(i), pkgList.valueAt(i).appVersion));
+ }
+ return list;
+ }
+
WindowProcessController getWindowProcessController() {
return mWindowProcessController;
}
@@ -1165,6 +1173,8 @@ final class ProcessRecord implements WindowProcessListener {
void setActiveInstrumentation(ActiveInstrumentation instr) {
mInstr = instr;
mWindowProcessController.setInstrumenting(instr != null);
+ mWindowProcessController.setInstrumentingWithBackgroundActivityStartPrivileges(instr != null
+ && instr.mHasBackgroundActivityStartsPermission);
}
ActiveInstrumentation getActiveInstrumentation() {
@@ -1236,10 +1246,8 @@ final class ProcessRecord implements WindowProcessListener {
}
@Override
- public void setRemoved(boolean removed) {
- synchronized (mService) {
- this.removed = removed;
- }
+ public boolean isRemoved() {
+ return removed;
}
/**
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index 5c6090030f74..e731f345b704 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -77,6 +77,7 @@ class SettingsToPropertiesMapper {
// permission in the corresponding .te file your feature belongs to.
@VisibleForTesting
static final String[] sDeviceConfigScopes = new String[] {
+ DeviceConfig.ActivityManagerNativeBoot.NAMESPACE,
DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT,
DeviceConfig.NAMESPACE_NETD_NATIVE,
DeviceConfig.RuntimeNative.NAMESPACE,
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index 6cb1097c7ddf..22a7de74cc38 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -26,7 +26,6 @@ import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;
import com.android.internal.annotations.GuardedBy;
-import com.android.server.wm.ActivityTaskManagerInternal;
/**
* Overall information about a uid that has actively running processes.
@@ -43,7 +42,6 @@ public final class UidRecord {
boolean idle;
boolean setIdle;
int numProcs;
- final ActivityTaskManagerInternal mAtmInternal;
/**
* Sequence number associated with the {@link #mCurProcState}. This is incremented using
@@ -117,10 +115,9 @@ public final class UidRecord {
ChangeItem pendingChange;
int lastReportedChange;
- public UidRecord(int _uid, ActivityTaskManagerInternal atmInternal) {
+ public UidRecord(int _uid) {
uid = _uid;
idle = true;
- mAtmInternal = atmInternal;
reset();
}
@@ -130,9 +127,6 @@ public final class UidRecord {
public void setCurProcState(int curProcState) {
mCurProcState = curProcState;
- if (mAtmInternal != null) {
- mAtmInternal.onUidProcStateChanged(uid, curProcState);
- }
}
public void reset() {
diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java
index 5b469fe2dc7a..2061b2681268 100644
--- a/services/core/java/com/android/server/attention/AttentionManagerService.java
+++ b/services/core/java/com/android/server/attention/AttentionManagerService.java
@@ -16,9 +16,9 @@
package com.android.server.attention;
+import static android.provider.DeviceConfig.AttentionManagerService.COMPONENT_NAME;
import static android.provider.DeviceConfig.AttentionManagerService.NAMESPACE;
-import static android.provider.DeviceConfig.AttentionManagerService.PROPERTY_COMPONENT_NAME;
-import static android.provider.DeviceConfig.AttentionManagerService.PROPERTY_SERVICE_ENABLED;
+import static android.provider.DeviceConfig.AttentionManagerService.SERVICE_ENABLED;
import android.Manifest;
import android.annotation.Nullable;
@@ -129,7 +129,7 @@ public class AttentionManagerService extends SystemService {
}
private boolean isServiceEnabled() {
- final String enabled = DeviceConfig.getProperty(NAMESPACE, PROPERTY_SERVICE_ENABLED);
+ final String enabled = DeviceConfig.getProperty(NAMESPACE, SERVICE_ENABLED);
return enabled == null ? DEFAULT_SERVICE_ENABLED : "true".equals(enabled);
}
@@ -279,7 +279,7 @@ public class AttentionManagerService extends SystemService {
* system.
*/
private static ComponentName resolveAttentionService(Context context) {
- final String flag = DeviceConfig.getProperty(NAMESPACE, PROPERTY_COMPONENT_NAME);
+ final String flag = DeviceConfig.getProperty(NAMESPACE, COMPONENT_NAME);
final String componentNameString = flag != null ? flag : context.getString(
R.string.config_defaultAttentionService);
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index d652f93ccf04..deaa9313fadd 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -600,7 +600,7 @@ import java.util.ArrayList;
break;
case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE:
mDeviceInventory.onSetA2dpSinkConnectionState(
- (BtHelper.BluetoothA2dpDeviceInfo) msg.obj, msg.arg1, msg.arg2);
+ (BtHelper.BluetoothA2dpDeviceInfo) msg.obj, msg.arg1);
break;
case MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE:
mDeviceInventory.onSetA2dpSourceConnectionState(
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index eb76e6e02edc..97649a741f62 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -147,18 +147,20 @@ public final class AudioDeviceInventory {
}
/*package*/ void onSetA2dpSinkConnectionState(@NonNull BtHelper.BluetoothA2dpDeviceInfo btInfo,
- @AudioService.BtProfileConnectionState int state, int a2dpVolume) {
+ @AudioService.BtProfileConnectionState int state) {
final BluetoothDevice btDevice = btInfo.getBtDevice();
+ int a2dpVolume = btInfo.getVolume();
if (AudioService.DEBUG_DEVICES) {
Log.d(TAG, "onSetA2dpSinkConnectionState btDevice=" + btDevice + " state="
- + state + " is dock=" + btDevice.isBluetoothDock());
+ + state + " is dock=" + btDevice.isBluetoothDock() + " vol=" + a2dpVolume);
}
String address = btDevice.getAddress();
if (!BluetoothAdapter.checkBluetoothAddress(address)) {
address = "";
}
AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(
- "A2DP sink connected: device addr=" + address + " state=" + state));
+ "A2DP sink connected: device addr=" + address + " state=" + state
+ + " vol=" + a2dpVolume));
final int a2dpCodec;
synchronized (mDeviceBroker.mA2dpAvrcpLock) {
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index df33bf249133..1723163a132d 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -392,12 +392,14 @@ public class AudioService extends IAudioService.Stub
* e.g. user on homescreen, no app playing anything, presses hardware volume buttons, this
* stream type is controlled.
*/
- protected static final int DEFAULT_VOL_STREAM_NO_PLAYBACK = AudioSystem.STREAM_MUSIC;
+ protected static final int DEFAULT_VOL_STREAM_NO_PLAYBACK = AudioSystem.STREAM_MUSIC;
private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() {
public void onError(int error) {
switch (error) {
case AudioSystem.AUDIO_STATUS_SERVER_DIED:
+ mRecordMonitor.clear();
+
sendMsg(mAudioHandler, MSG_AUDIO_SERVER_DIED,
SENDMSG_NOOP, 0, 0, null, 0);
sendMsg(mAudioHandler, MSG_DISPATCH_AUDIO_SERVER_STATE,
diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
index 9d6628cf0c40..b2c7ff3bfdf6 100644
--- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
@@ -78,24 +78,27 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin
updateSnapshot(event, uid, session, source, recordingInfo,
portId, silenced, activeSource, clientEffects, effects);
if (configsSystem != null){
- synchronized (mClients) {
- // list of recording configurations for "public consumption". It is only computed if
- // there are non-system recording activity listeners.
- final List<AudioRecordingConfiguration> configsPublic = mHasPublicClients ?
- anonymizeForPublicConsumption(configsSystem) :
- new ArrayList<AudioRecordingConfiguration>();
- final Iterator<RecMonitorClient> clientIterator = mClients.iterator();
- while (clientIterator.hasNext()) {
- final RecMonitorClient rmc = clientIterator.next();
- try {
- if (rmc.mIsPrivileged) {
- rmc.mDispatcherCb.dispatchRecordingConfigChange(configsSystem);
- } else {
- rmc.mDispatcherCb.dispatchRecordingConfigChange(configsPublic);
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Could not call dispatchRecordingConfigChange() on client", e);
+ dispatchCallbacks(configsSystem);
+ }
+ }
+ private void dispatchCallbacks(List<AudioRecordingConfiguration> configs) {
+ synchronized (mClients) {
+ // list of recording configurations for "public consumption". It is only computed if
+ // there are non-system recording activity listeners.
+ final List<AudioRecordingConfiguration> configsPublic = mHasPublicClients
+ ? anonymizeForPublicConsumption(configs) :
+ new ArrayList<AudioRecordingConfiguration>();
+ final Iterator<RecMonitorClient> clientIterator = mClients.iterator();
+ while (clientIterator.hasNext()) {
+ final RecMonitorClient rmc = clientIterator.next();
+ try {
+ if (rmc.mIsPrivileged) {
+ rmc.mDispatcherCb.dispatchRecordingConfigChange(configs);
+ } else {
+ rmc.mDispatcherCb.dispatchRecordingConfigChange(configsPublic);
}
+ } catch (RemoteException e) {
+ Log.w(TAG, "Could not call dispatchRecordingConfigChange() on client", e);
}
}
}
@@ -130,6 +133,13 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin
AudioSystem.setRecordingCallback(this);
}
+ void clear() {
+ synchronized (mRecordConfigs) {
+ mRecordConfigs.clear();
+ }
+ dispatchCallbacks(new ArrayList<AudioRecordingConfiguration>());
+ }
+
void registerRecordingCallback(IRecordingConfigDispatcher rcdb, boolean isPrivileged) {
if (rcdb == null) {
return;
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index d0cff25dbf05..cd4ce2d142bb 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -235,6 +235,8 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
public final Messenger messenger;
public final AsyncChannel asyncChannel;
+ public final int factorySerialNumber;
+
// Used by ConnectivityService to keep track of 464xlat.
public Nat464Xlat clatd;
@@ -252,7 +254,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
NetworkMisc misc, ConnectivityService connService, INetd netd,
- INetworkManagementService nms) {
+ INetworkManagementService nms, int factorySerialNumber) {
this.messenger = messenger;
asyncChannel = ac;
network = net;
@@ -266,6 +268,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
mContext = context;
mHandler = handler;
networkMisc = misc;
+ this.factorySerialNumber = factorySerialNumber;
}
/**
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 250884431440..7e95f10752bd 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -54,6 +54,7 @@ import android.net.LocalSocketAddress;
import android.net.Network;
import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
+import android.net.NetworkFactory;
import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.NetworkMisc;
@@ -942,7 +943,8 @@ public class Vpn {
try {
mNetworkAgent = new NetworkAgent(mLooper, mContext, NETWORKTYPE /* logtag */,
mNetworkInfo, mNetworkCapabilities, lp,
- ConnectivityConstants.VPN_DEFAULT_SCORE, networkMisc) {
+ ConnectivityConstants.VPN_DEFAULT_SCORE, networkMisc,
+ NetworkFactory.SerialNumber.VPN) {
@Override
public void unwanted() {
// We are user controlled, not driven by NetworkRequest.
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index b89768ac4b68..c9df86e83091 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1241,27 +1241,59 @@ public final class DisplayManagerService extends SystemService {
}
}
+ @Nullable
+ private IBinder getDisplayToken(int displayId) {
+ synchronized (mSyncRoot) {
+ final LogicalDisplay display = mLogicalDisplays.get(displayId);
+ if (display != null) {
+ final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
+ if (device != null) {
+ return device.getDisplayTokenLocked();
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private boolean screenshotInternal(int displayId, Surface outSurface) {
+ final IBinder token = getDisplayToken(displayId);
+ if (token == null) {
+ return false;
+ }
+ SurfaceControl.screenshot(token, outSurface);
+ return true;
+ }
+
@VisibleForTesting
DisplayedContentSamplingAttributes getDisplayedContentSamplingAttributesInternal(
int displayId) {
- IBinder displayToken = SurfaceControl.getBuiltInDisplay(displayId);
- return SurfaceControl.getDisplayedContentSamplingAttributes(displayToken);
+ final IBinder token = getDisplayToken(displayId);
+ if (token == null) {
+ return null;
+ }
+ return SurfaceControl.getDisplayedContentSamplingAttributes(token);
}
@VisibleForTesting
boolean setDisplayedContentSamplingEnabledInternal(
int displayId, boolean enable, int componentMask, int maxFrames) {
- IBinder displayToken = SurfaceControl.getBuiltInDisplay(displayId);
+ final IBinder token = getDisplayToken(displayId);
+ if (token == null) {
+ return false;
+ }
return SurfaceControl.setDisplayedContentSamplingEnabled(
- displayToken, enable, componentMask, maxFrames);
+ token, enable, componentMask, maxFrames);
}
@VisibleForTesting
DisplayedContentSample getDisplayedContentSampleInternal(int displayId,
long maxFrames, long timestamp) {
- IBinder displayToken = SurfaceControl.getBuiltInDisplay(displayId);
- return SurfaceControl.getDisplayedContentSample(
- displayToken, maxFrames, timestamp);
+ final IBinder token = getDisplayToken(displayId);
+ if (token == null) {
+ return null;
+ }
+ return SurfaceControl.getDisplayedContentSample(token, maxFrames, timestamp);
}
private void clearViewportsLocked() {
@@ -2257,20 +2289,7 @@ public final class DisplayManagerService extends SystemService {
@Override
public boolean screenshot(int displayId, Surface outSurface) {
- synchronized (mSyncRoot) {
- final LogicalDisplay display = mLogicalDisplays.get(displayId);
- if (display != null) {
- final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
- if (device != null) {
- final IBinder token = device.getDisplayTokenLocked();
- if (token != null) {
- SurfaceControl.screenshot(token, outSurface);
- return true;
- }
- }
- }
- }
- return false;
+ return screenshotInternal(displayId, outSurface);
}
@Override
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index db3928ec5fde..2a8462bc03f7 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -592,6 +592,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
public BrightnessConfiguration getDefaultBrightnessConfiguration() {
+ if (mAutomaticBrightnessController == null) {
+ return null;
+ }
return mAutomaticBrightnessController.getDefaultConfig();
}
diff --git a/services/core/java/com/android/server/dreams/OWNERS b/services/core/java/com/android/server/dreams/OWNERS
index 3c9bbf8797ea..426f002ad236 100644
--- a/services/core/java/com/android/server/dreams/OWNERS
+++ b/services/core/java/com/android/server/dreams/OWNERS
@@ -1,3 +1,3 @@
-dsandler@google.com
+dsandler@android.com
michaelwr@google.com
roosa@google.com
diff --git a/services/core/java/com/android/server/gpu/GpuService.java b/services/core/java/com/android/server/gpu/GpuService.java
new file mode 100644
index 000000000000..a68ceed750ad
--- /dev/null
+++ b/services/core/java/com/android/server/gpu/GpuService.java
@@ -0,0 +1,163 @@
+/*
+ * 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.
+ */
+
+package com.android.server.gpu;
+
+import static android.content.Intent.ACTION_PACKAGE_ADDED;
+import static android.content.Intent.ACTION_PACKAGE_CHANGED;
+import static android.content.Intent.ACTION_PACKAGE_REMOVED;
+
+import android.annotation.NonNull;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.Slog;
+
+import com.android.server.SystemService;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+
+/**
+ * Service to manage GPU related features.
+ *
+ * <p>GPU service is a core service that monitors, coordinates all GPU related features,
+ * as well as collect metrics about the GPU and GPU driver.</p>
+ */
+public class GpuService extends SystemService {
+ public static final String TAG = "GpuService";
+ public static final boolean DEBUG = false;
+
+ private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0";
+ private static final String WHITELIST_FILENAME = "whitelist.txt";
+
+ private final Context mContext;
+ private final String mDriverPackageName;
+ private final PackageManager mPackageManager;
+
+ public GpuService(Context context) {
+ super(context);
+
+ mContext = context;
+ mDriverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER);
+ mPackageManager = context.getPackageManager();
+ if (mDriverPackageName != null && !mDriverPackageName.isEmpty()) {
+ final IntentFilter packageFilter = new IntentFilter();
+ packageFilter.addAction(ACTION_PACKAGE_ADDED);
+ packageFilter.addAction(ACTION_PACKAGE_CHANGED);
+ packageFilter.addAction(ACTION_PACKAGE_REMOVED);
+ packageFilter.addDataScheme("package");
+ getContext().registerReceiverAsUser(new PackageReceiver(), UserHandle.ALL,
+ packageFilter, null, null);
+ }
+ }
+
+ @Override
+ public void onStart() {
+ }
+
+ @Override
+ public void onBootPhase(int phase) {
+ if (phase == PHASE_BOOT_COMPLETED) {
+ if (mDriverPackageName == null || mDriverPackageName.isEmpty()) {
+ return;
+ }
+ fetchGameDriverPackageProperties();
+ }
+ }
+
+ private final class PackageReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(@NonNull final Context context, @NonNull final Intent intent) {
+ final Uri data = intent.getData();
+ if (data == null && DEBUG) {
+ Slog.e(TAG, "Cannot handle package broadcast with null data");
+ return;
+ }
+ final String packageName = data.getSchemeSpecificPart();
+ if (!packageName.equals(mDriverPackageName)) {
+ return;
+ }
+
+ final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
+
+ switch (intent.getAction()) {
+ case ACTION_PACKAGE_ADDED:
+ case ACTION_PACKAGE_CHANGED:
+ case ACTION_PACKAGE_REMOVED:
+ fetchGameDriverPackageProperties();
+ break;
+ default:
+ // do nothing
+ break;
+ }
+ }
+ }
+
+ private void fetchGameDriverPackageProperties() {
+ final ApplicationInfo driverInfo;
+ try {
+ driverInfo = mPackageManager.getApplicationInfo(mDriverPackageName,
+ PackageManager.MATCH_SYSTEM_ONLY);
+ } catch (PackageManager.NameNotFoundException e) {
+ if (DEBUG) {
+ Slog.e(TAG, "driver package '" + mDriverPackageName + "' not installed");
+ }
+ return;
+ }
+
+ // O drivers are restricted to the sphal linker namespace, so don't try to use
+ // packages unless they declare they're compatible with that restriction.
+ if (driverInfo.targetSdkVersion < Build.VERSION_CODES.O) {
+ if (DEBUG) {
+ Slog.w(TAG, "Driver package is not known to be compatible with O");
+ }
+ return;
+ }
+
+ try {
+ final Context driverContext = mContext.createPackageContext(mDriverPackageName,
+ Context.CONTEXT_RESTRICTED);
+ final BufferedReader reader = new BufferedReader(
+ new InputStreamReader(driverContext.getAssets().open(WHITELIST_FILENAME)));
+ final ArrayList<String> whitelistedPackageNames = new ArrayList<>();
+ for (String packageName; (packageName = reader.readLine()) != null; ) {
+ whitelistedPackageNames.add(packageName);
+ }
+ Settings.Global.putString(mContext.getContentResolver(),
+ Settings.Global.GAME_DRIVER_WHITELIST,
+ String.join(",", whitelistedPackageNames));
+ } catch (PackageManager.NameNotFoundException e) {
+ if (DEBUG) {
+ Slog.w(TAG, "driver package '" + mDriverPackageName + "' not installed");
+ }
+ } catch (IOException e) {
+ if (DEBUG) {
+ Slog.w(TAG, "Failed to load whitelist driver package, abort.");
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/incident/IncidentCompanionService.java b/services/core/java/com/android/server/incident/IncidentCompanionService.java
index 3ebba0074a1c..6f2bfc3cd8d2 100644
--- a/services/core/java/com/android/server/incident/IncidentCompanionService.java
+++ b/services/core/java/com/android/server/incident/IncidentCompanionService.java
@@ -16,38 +16,18 @@
package com.android.server.incident;
-import android.app.ActivityManager;
-import android.app.AppOpsManager;
-import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.UserInfo;
-import android.net.Uri;
import android.os.Binder;
-import android.os.Handler;
import android.os.IIncidentAuthListener;
import android.os.IIncidentCompanion;
-import android.os.IncidentManager;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.Log;
import com.android.internal.util.DumpUtils;
import com.android.server.SystemService;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
-// TODO: User changes should deny everything that's pending.
-
/**
* Helper service for incidentd and dumpstated to provide user feedback
* and authorization for bug and inicdent reports to be taken.
@@ -55,83 +35,26 @@ import java.util.List;
public class IncidentCompanionService extends SystemService {
static final String TAG = "IncidentCompanionService";
- private final Handler mHandler = new Handler();
- private final RequestQueue mRequestQueue = new RequestQueue(mHandler);
- private final PackageManager mPackageManager;
- private final AppOpsManager mAppOpsManager;
-
- //
- // All fields below must be protected by mLock
- //
- private final Object mLock = new Object();
- private final ArrayList<PendingReportRec> mPending = new ArrayList();
-
/**
- * The next ID we'll use when we make a PendingReportRec.
+ * Tracker for reports pending approval.
*/
- private int mNextPendingId = 1;
-
- /**
- * One for each authorization that's pending.
- */
- private final class PendingReportRec {
- public int id;
- public String callingPackage;
- public int flags;
- public IIncidentAuthListener listener;
- public long addedRealtime;
- public long addedWalltime;
-
- /**
- * Construct a PendingReportRec, with an auto-incremented id.
- */
- PendingReportRec(String callingPackage, int flags, IIncidentAuthListener listener) {
- this.id = mNextPendingId++;
- this.callingPackage = callingPackage;
- this.flags = flags;
- this.listener = listener;
- this.addedRealtime = SystemClock.elapsedRealtime();
- this.addedWalltime = System.currentTimeMillis();
- }
-
- /**
- * Get the Uri that contains the flattened data.
- */
- Uri getUri() {
- return (new Uri.Builder())
- .scheme(IncidentManager.URI_SCHEME)
- .authority(IncidentManager.URI_AUTHORITY)
- .path(IncidentManager.URI_PATH)
- .appendQueryParameter(IncidentManager.URI_PARAM_ID, Integer.toString(id))
- .appendQueryParameter(IncidentManager.URI_PARAM_CALLING_PACKAGE, callingPackage)
- .appendQueryParameter(IncidentManager.URI_PARAM_FLAGS, Integer.toString(flags))
- .appendQueryParameter(IncidentManager.URI_PARAM_TIMESTAMP,
- Long.toString(addedWalltime))
- .build();
- }
- }
+ private PendingReports mPendingReports;
/**
* Implementation of the IIncidentCompanion binder interface.
*/
private final class BinderService extends IIncidentCompanion.Stub {
/**
- * ONEWAY binder call to initiate authorizing the report. The actual logic is posted
- * to mRequestQueue, and may happen later. The security checks need to happen here.
+ * ONEWAY binder call to initiate authorizing the report.
*/
@Override
- public void authorizeReport(int callingUid, final String callingPackage, final int flags,
+ public void authorizeReport(int callingUid, final String callingPackage, int flags,
final IIncidentAuthListener listener) {
enforceRequestAuthorizationPermission();
final long ident = Binder.clearCallingIdentity();
try {
- // Starting the system server is complicated, and rather than try to
- // have a complicated lifecycle that we share with dumpstated and incidentd,
- // we will accept the request, and then display it whenever it becomes possible to.
- mRequestQueue.enqueue(listener.asBinder(), true, () -> {
- authorizeReportImpl(callingUid, callingPackage, flags, listener);
- });
+ mPendingReports.authorizeReport(callingUid, callingPackage, flags, listener);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -152,9 +75,7 @@ public class IncidentCompanionService extends SystemService {
// authorize/cancel pairs.
final long ident = Binder.clearCallingIdentity();
try {
- mRequestQueue.enqueue(listener.asBinder(), false, () -> {
- cancelReportImpl(listener);
- });
+ mPendingReports.cancelAuthorization(listener);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -167,19 +88,11 @@ public class IncidentCompanionService extends SystemService {
@Override
public List<String> getPendingReports() {
enforceAuthorizePermission();
-
- synchronized (mLock) {
- final int size = mPending.size();
- final ArrayList<String> result = new ArrayList(size);
- for (int i = 0; i < size; i++) {
- result.add(mPending.get(i).getUri().toString());
- }
- return result;
- }
+ return mPendingReports.getPendingReports();
}
/**
- * ONEWAY binder call to mark a report as approved.
+ * SYNCHRONOUS binder call to mark a report as approved.
*/
@Override
public void approveReport(String uri) {
@@ -187,32 +100,14 @@ public class IncidentCompanionService extends SystemService {
final long ident = Binder.clearCallingIdentity();
try {
- final PendingReportRec rec;
- synchronized (mLock) {
- rec = findAndRemovePendingReportRecLocked(uri);
- if (rec == null) {
- Log.e(TAG, "confirmApproved: Couldn't find record for uri: " + uri);
- return;
- }
- }
-
- // Re-do the broadcast, so whoever is listening knows the list changed,
- // in case another one was added in the meantime.
- sendBroadcast();
-
- Log.i(TAG, "Approved report: " + uri);
- try {
- rec.listener.onReportApproved();
- } catch (RemoteException ex) {
- Log.w(TAG, "Failed calling back for approval for: " + uri, ex);
- }
+ mPendingReports.approveReport(uri);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
/**
- * ONEWAY binder call to mark a report as NOT approved.
+ * SYNCHRONOUS binder call to mark a report as NOT approved.
*/
@Override
public void denyReport(String uri) {
@@ -220,25 +115,7 @@ public class IncidentCompanionService extends SystemService {
final long ident = Binder.clearCallingIdentity();
try {
- final PendingReportRec rec;
- synchronized (mLock) {
- rec = findAndRemovePendingReportRecLocked(uri);
- if (rec == null) {
- Log.e(TAG, "confirmDenied: Couldn't find record for uri: " + uri);
- return;
- }
- }
-
- // Re-do the broadcast, so whoever is listening knows the list changed,
- // in case another one was added in the meantime.
- sendBroadcast();
-
- Log.i(TAG, "Denied report: " + uri);
- try {
- rec.listener.onReportDenied();
- } catch (RemoteException ex) {
- Log.w(TAG, "Failed calling back for denial for: " + uri, ex);
- }
+ mPendingReports.denyReport(uri);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -252,27 +129,22 @@ public class IncidentCompanionService extends SystemService {
if (!DumpUtils.checkDumpPermission(getContext(), TAG, writer)) {
return;
}
- if (args.length == 0) {
- // Standard text dumpsys
- final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
- synchronized (mLock) {
- final int size = mPending.size();
- writer.println("mPending: (" + size + ")");
- for (int i = 0; i < size; i++) {
- final PendingReportRec entry = mPending.get(i);
- writer.println(String.format(" %11d %s: %s", entry.addedRealtime,
- df.format(new Date(entry.addedWalltime)),
- entry.getUri().toString()));
- }
- }
- }
+ mPendingReports.dump(fd, writer, args);
}
+ /**
+ * Inside the binder interface class because we want to do all of the authorization
+ * here, before calling out to the helper objects.
+ */
private void enforceRequestAuthorizationPermission() {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.REQUEST_INCIDENT_REPORT_APPROVAL, null);
}
+ /**
+ * Inside the binder interface class because we want to do all of the authorization
+ * here, before calling out to the helper objects.
+ */
private void enforceAuthorizePermission() {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.APPROVE_INCIDENT_REPORTS, null);
@@ -285,8 +157,7 @@ public class IncidentCompanionService extends SystemService {
*/
public IncidentCompanionService(Context context) {
super(context);
- mPackageManager = context.getPackageManager();
- mAppOpsManager = context.getSystemService(AppOpsManager.class);
+ mPendingReports = new PendingReports(context);
}
/**
@@ -307,239 +178,9 @@ public class IncidentCompanionService extends SystemService {
super.onBootPhase(phase);
switch (phase) {
case SystemService.PHASE_BOOT_COMPLETED:
- // Release the enqueued work.
- mRequestQueue.start();
+ mPendingReports.onBootCompleted();
break;
}
}
-
- /**
- * Start the confirmation process.
- */
- private void authorizeReportImpl(int callingUid, final String callingPackage, int flags,
- final IIncidentAuthListener listener) {
- // Enforce that the calling package pertains to the callingUid.
- if (!isPackageInUid(callingUid, callingPackage)) {
- Log.w(TAG, "Calling uid " + callingUid + " doesn't match package "
- + callingPackage);
- denyReportBeforeAddingRec(listener, callingPackage);
- return;
- }
-
- // Find the primary user of this device.
- final int primaryUser = getAndValidateUser();
- if (primaryUser == UserHandle.USER_NULL) {
- denyReportBeforeAddingRec(listener, callingPackage);
- return;
- }
-
- // Find the approver app (hint: it's PermissionController).
- final ComponentName receiver = getApproverComponent(primaryUser);
- if (receiver == null) {
- // We couldn't find an approver... so deny the request here and now, before we
- // do anything else.
- denyReportBeforeAddingRec(listener, callingPackage);
- return;
- }
-
- // Save the record for when the PermissionController comes back to authorize it.
- PendingReportRec rec = null;
- synchronized (mLock) {
- rec = new PendingReportRec(callingPackage, flags, listener);
- mPending.add(rec);
- }
-
- try {
- listener.asBinder().linkToDeath(() -> {
- Log.i(TAG, "Got death notification listener=" + listener);
- cancelReportImpl(listener, receiver, primaryUser);
- }, 0);
- } catch (RemoteException ex) {
- Log.e(TAG, "Remote died while trying to register death listener: " + rec.getUri());
- // First, remove from our list.
- cancelReportImpl(listener, receiver, primaryUser);
- }
-
- // Go tell Permission controller to start asking the user.
- sendBroadcast(receiver, primaryUser);
- }
-
- /**
- * Cancel a pending report request (because of an explicit call to cancel)
- */
- private void cancelReportImpl(IIncidentAuthListener listener) {
- final int primaryUser = getAndValidateUser();
- final ComponentName receiver = getApproverComponent(primaryUser);
- if (primaryUser != UserHandle.USER_NULL && receiver != null) {
- cancelReportImpl(listener, receiver, primaryUser);
- }
- }
-
- /**
- * Cancel a pending report request (either because of an explicit call to cancel
- * by the calling app, or because of a binder death).
- */
- private void cancelReportImpl(IIncidentAuthListener listener, ComponentName receiver,
- int primaryUser) {
- // First, remove from our list.
- synchronized (mLock) {
- removePendingReportRecLocked(listener);
- }
- // Second, call back to PermissionController to say it's canceled.
- sendBroadcast(receiver, primaryUser);
- }
-
- /**
- * Send an extra copy of the broadcast, to tell them that the list has changed
- * because of an addition or removal. This function is less aggressive than
- * authorizeReportImpl in logging about failures, because this is for use in
- * cleanup cases to keep the apps' list in sync with ours.
- */
- private void sendBroadcast() {
- final int primaryUser = getAndValidateUser();
- if (primaryUser == UserHandle.USER_NULL) {
- return;
- }
- final ComponentName receiver = getApproverComponent(primaryUser);
- if (receiver == null) {
- return;
- }
- sendBroadcast(receiver, primaryUser);
- }
-
- /**
- * Send the confirmation broadcast.
- */
- private void sendBroadcast(ComponentName receiver, int primaryUser) {
- final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED);
- intent.setComponent(receiver);
-
- // Send it to the primary user.
- getContext().sendBroadcastAsUser(intent, UserHandle.getUserHandleForUid(primaryUser),
- android.Manifest.permission.APPROVE_INCIDENT_REPORTS);
- }
-
- /**
- * Remove a PendingReportRec keyed by uri, and return it.
- */
- private PendingReportRec findAndRemovePendingReportRecLocked(String uriString) {
- final Uri uri = Uri.parse(uriString);
- final int id;
- try {
- final String idStr = uri.getQueryParameter(IncidentManager.URI_PARAM_ID);
- id = Integer.parseInt(idStr);
- } catch (NumberFormatException ex) {
- Log.w(TAG, "Can't parse id from: " + uriString);
- return null;
- }
- final int size = mPending.size();
- for (int i = 0; i < size; i++) {
- final PendingReportRec rec = mPending.get(i);
- if (rec.id == id) {
- mPending.remove(i);
- return rec;
- }
- }
- return null;
- }
-
- /**
- * Remove a PendingReportRec keyed by listener.
- */
- private void removePendingReportRecLocked(IIncidentAuthListener listener) {
- final int size = mPending.size();
- for (int i = 0; i < size; i++) {
- final PendingReportRec rec = mPending.get(i);
- if (rec.listener.asBinder() == listener.asBinder()) {
- Log.i(TAG, " ...Removed PendingReportRec index=" + i + ": " + rec.getUri());
- mPending.remove(i);
- }
- }
- }
-
- /**
- * Just call listener.deny() (wrapping the RemoteException), without try to
- * add it to the list.
- */
- private void denyReportBeforeAddingRec(IIncidentAuthListener listener, String pkg) {
- try {
- listener.onReportDenied();
- } catch (RemoteException ex) {
- Log.w(TAG, "Failed calling back for denial for " + pkg, ex);
- }
- }
-
- /**
- * Check whether the current user is the primary user, and return the user id if they are.
- * Returns UserHandle.USER_NULL if not valid.
- */
- private int getAndValidateUser() {
- // Current user
- UserInfo currentUser;
- try {
- currentUser = ActivityManager.getService().getCurrentUser();
- } catch (RemoteException ex) {
- // We're already inside the system process.
- throw new RuntimeException(ex);
- }
-
- // Primary user
- final UserManager um = UserManager.get(getContext());
- final UserInfo primaryUser = um.getPrimaryUser();
-
- // Check that we're using the right user.
- if (currentUser == null) {
- Log.w(TAG, "No current user. Nobody to approve the report."
- + " The report will be denied.");
- return UserHandle.USER_NULL;
- }
- if (primaryUser == null) {
- Log.w(TAG, "No primary user. Nobody to approve the report."
- + " The report will be denied.");
- return UserHandle.USER_NULL;
- }
- if (primaryUser.id != currentUser.id) {
- Log.w(TAG, "Only the primary user can approve bugreports, but they are not"
- + " the current user. The report will be denied.");
- return UserHandle.USER_NULL;
- }
-
- return primaryUser.id;
- }
-
- /**
- * Return the ComponentName of the BroadcastReceiver that will approve reports.
- * The system must have zero or one of these installed. We only look on the
- * system partition. When the broadcast happens, the component will also need
- * have the APPROVE_INCIDENT_REPORTS permission.
- */
- private ComponentName getApproverComponent(int userId) {
- // Find the one true BroadcastReceiver
- final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED);
- final List<ResolveInfo> matches = mPackageManager.queryBroadcastReceiversAsUser(intent,
- PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
- if (matches.size() == 1) {
- return matches.get(0).getComponentInfo().getComponentName();
- } else {
- Log.w(TAG, "Didn't find exactly one BroadcastReceiver to handle "
- + Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED
- + ". The report will be denied. size="
- + matches.size() + ": matches=" + matches);
- return null;
- }
- }
-
- /**
- * Return whether the package is one of the packages installed for the uid.
- */
- private boolean isPackageInUid(int uid, String packageName) {
- try {
- mAppOpsManager.checkPackage(uid, packageName);
- return true;
- } catch (SecurityException ex) {
- return false;
- }
- }
}
diff --git a/services/core/java/com/android/server/incident/PendingReports.java b/services/core/java/com/android/server/incident/PendingReports.java
new file mode 100644
index 000000000000..519ed41670f6
--- /dev/null
+++ b/services/core/java/com/android/server/incident/PendingReports.java
@@ -0,0 +1,477 @@
+/*
+ * 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.incident;
+
+import android.app.ActivityManager;
+import android.app.AppOpsManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.IIncidentAuthListener;
+import android.os.IncidentManager;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+// TODO: User changes should deny everything that's pending.
+
+/**
+ * Tracker for reports pending approval.
+ */
+class PendingReports {
+ static final String TAG = IncidentCompanionService.TAG;
+
+ private final Handler mHandler = new Handler();
+ private final RequestQueue mRequestQueue = new RequestQueue(mHandler);
+ private final Context mContext;
+ private final PackageManager mPackageManager;
+ private final AppOpsManager mAppOpsManager;
+
+ //
+ // All fields below must be protected by mLock
+ //
+ private final Object mLock = new Object();
+ private final ArrayList<PendingReportRec> mPending = new ArrayList();
+
+ /**
+ * The next ID we'll use when we make a PendingReportRec.
+ */
+ private int mNextPendingId = 1;
+
+ /**
+ * One for each authorization that's pending.
+ */
+ private final class PendingReportRec {
+ public int id;
+ public String callingPackage;
+ public int flags;
+ public IIncidentAuthListener listener;
+ public long addedRealtime;
+ public long addedWalltime;
+
+ /**
+ * Construct a PendingReportRec, with an auto-incremented id.
+ */
+ PendingReportRec(String callingPackage, int flags, IIncidentAuthListener listener) {
+ this.id = mNextPendingId++;
+ this.callingPackage = callingPackage;
+ this.flags = flags;
+ this.listener = listener;
+ this.addedRealtime = SystemClock.elapsedRealtime();
+ this.addedWalltime = System.currentTimeMillis();
+ }
+
+ /**
+ * Get the Uri that contains the flattened data.
+ */
+ Uri getUri() {
+ return (new Uri.Builder())
+ .scheme(IncidentManager.URI_SCHEME)
+ .authority(IncidentManager.URI_AUTHORITY)
+ .path(IncidentManager.URI_PATH)
+ .appendQueryParameter(IncidentManager.URI_PARAM_ID, Integer.toString(id))
+ .appendQueryParameter(IncidentManager.URI_PARAM_CALLING_PACKAGE, callingPackage)
+ .appendQueryParameter(IncidentManager.URI_PARAM_FLAGS, Integer.toString(flags))
+ .appendQueryParameter(IncidentManager.URI_PARAM_TIMESTAMP,
+ Long.toString(addedWalltime))
+ .build();
+ }
+ }
+
+ /**
+ * Construct new PendingReports with the context.
+ */
+ PendingReports(Context context) {
+ mContext = context;
+ mPackageManager = context.getPackageManager();
+ mAppOpsManager = context.getSystemService(AppOpsManager.class);
+ }
+
+ /**
+ * ONEWAY binder call to initiate authorizing the report. The actual logic is posted
+ * to mRequestQueue, and may happen later.
+ * <p>
+ * The security checks are handled by IncidentCompanionService.
+ */
+ public void authorizeReport(int callingUid, final String callingPackage, final int flags,
+ final IIncidentAuthListener listener) {
+ // Starting the system server is complicated, and rather than try to
+ // have a complicated lifecycle that we share with dumpstated and incidentd,
+ // we will accept the request, and then display it whenever it becomes possible to.
+ mRequestQueue.enqueue(listener.asBinder(), true, () -> {
+ authorizeReportImpl(callingUid, callingPackage, flags, listener);
+ });
+ }
+
+ /**
+ * ONEWAY binder call to cancel the inbound authorization request.
+ * <p>
+ * This is a oneway call, and so is authorizeReport, so the
+ * caller's ordering is preserved. The other calls on this object are synchronous, so
+ * their ordering is not guaranteed with respect to these calls. So the implementation
+ * sends out extra broadcasts to allow for eventual consistency.
+ * <p>
+ * The security checks are handled by IncidentCompanionService.
+ */
+ public void cancelAuthorization(final IIncidentAuthListener listener) {
+ mRequestQueue.enqueue(listener.asBinder(), false, () -> {
+ cancelReportImpl(listener);
+ });
+ }
+
+ /**
+ * SYNCHRONOUS binder call to get the list of reports that are pending confirmation
+ * by the user.
+ * <p>
+ * The security checks are handled by IncidentCompanionService.
+ */
+ public List<String> getPendingReports() {
+ synchronized (mLock) {
+ final int size = mPending.size();
+ final ArrayList<String> result = new ArrayList(size);
+ for (int i = 0; i < size; i++) {
+ result.add(mPending.get(i).getUri().toString());
+ }
+ return result;
+ }
+ }
+
+ /**
+ * SYNCHRONOUS binder call to mark a report as approved.
+ * <p>
+ * The security checks are handled by IncidentCompanionService.
+ */
+ public void approveReport(String uri) {
+ final PendingReportRec rec;
+ synchronized (mLock) {
+ rec = findAndRemovePendingReportRecLocked(uri);
+ if (rec == null) {
+ Log.e(TAG, "confirmApproved: Couldn't find record for uri: " + uri);
+ return;
+ }
+ }
+
+ // Re-do the broadcast, so whoever is listening knows the list changed,
+ // in case another one was added in the meantime.
+ sendBroadcast();
+
+ Log.i(TAG, "Approved report: " + uri);
+ try {
+ rec.listener.onReportApproved();
+ } catch (RemoteException ex) {
+ Log.w(TAG, "Failed calling back for approval for: " + uri, ex);
+ }
+ }
+
+ /**
+ * SYNCHRONOUS binder call to mark a report as NOT approved.
+ */
+ public void denyReport(String uri) {
+ final PendingReportRec rec;
+ synchronized (mLock) {
+ rec = findAndRemovePendingReportRecLocked(uri);
+ if (rec == null) {
+ Log.e(TAG, "confirmDenied: Couldn't find record for uri: " + uri);
+ return;
+ }
+ }
+
+ // Re-do the broadcast, so whoever is listening knows the list changed,
+ // in case another one was added in the meantime.
+ sendBroadcast();
+
+ Log.i(TAG, "Denied report: " + uri);
+ try {
+ rec.listener.onReportDenied();
+ } catch (RemoteException ex) {
+ Log.w(TAG, "Failed calling back for denial for: " + uri, ex);
+ }
+ }
+
+ /**
+ * Implementation of adb shell dumpsys debugreportcompanion.
+ */
+ protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
+ if (args.length == 0) {
+ // Standard text dumpsys
+ final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+ synchronized (mLock) {
+ final int size = mPending.size();
+ writer.println("mPending: (" + size + ")");
+ for (int i = 0; i < size; i++) {
+ final PendingReportRec entry = mPending.get(i);
+ writer.println(String.format(" %11d %s: %s", entry.addedRealtime,
+ df.format(new Date(entry.addedWalltime)),
+ entry.getUri().toString()));
+ }
+ }
+ }
+ }
+
+ /**
+ * Handle the boot process... Starts everything running once the system is
+ * up enough for us to do UI.
+ */
+ public void onBootCompleted() {
+ // Release the enqueued work.
+ mRequestQueue.start();
+ }
+
+ /**
+ * Start the confirmation process.
+ */
+ private void authorizeReportImpl(int callingUid, final String callingPackage, int flags,
+ final IIncidentAuthListener listener) {
+ // Enforce that the calling package pertains to the callingUid.
+ if (!isPackageInUid(callingUid, callingPackage)) {
+ Log.w(TAG, "Calling uid " + callingUid + " doesn't match package "
+ + callingPackage);
+ denyReportBeforeAddingRec(listener, callingPackage);
+ return;
+ }
+
+ // Find the primary user of this device.
+ final int primaryUser = getAndValidateUser();
+ if (primaryUser == UserHandle.USER_NULL) {
+ denyReportBeforeAddingRec(listener, callingPackage);
+ return;
+ }
+
+ // Find the approver app (hint: it's PermissionController).
+ final ComponentName receiver = getApproverComponent(primaryUser);
+ if (receiver == null) {
+ // We couldn't find an approver... so deny the request here and now, before we
+ // do anything else.
+ denyReportBeforeAddingRec(listener, callingPackage);
+ return;
+ }
+
+ // Save the record for when the PermissionController comes back to authorize it.
+ PendingReportRec rec = null;
+ synchronized (mLock) {
+ rec = new PendingReportRec(callingPackage, flags, listener);
+ mPending.add(rec);
+ }
+
+ try {
+ listener.asBinder().linkToDeath(() -> {
+ Log.i(TAG, "Got death notification listener=" + listener);
+ cancelReportImpl(listener, receiver, primaryUser);
+ }, 0);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "Remote died while trying to register death listener: " + rec.getUri());
+ // First, remove from our list.
+ cancelReportImpl(listener, receiver, primaryUser);
+ }
+
+ // Go tell Permission controller to start asking the user.
+ sendBroadcast(receiver, primaryUser);
+ }
+
+ /**
+ * Cancel a pending report request (because of an explicit call to cancel)
+ */
+ private void cancelReportImpl(IIncidentAuthListener listener) {
+ final int primaryUser = getAndValidateUser();
+ final ComponentName receiver = getApproverComponent(primaryUser);
+ if (primaryUser != UserHandle.USER_NULL && receiver != null) {
+ cancelReportImpl(listener, receiver, primaryUser);
+ }
+ }
+
+ /**
+ * Cancel a pending report request (either because of an explicit call to cancel
+ * by the calling app, or because of a binder death).
+ */
+ private void cancelReportImpl(IIncidentAuthListener listener, ComponentName receiver,
+ int primaryUser) {
+ // First, remove from our list.
+ synchronized (mLock) {
+ removePendingReportRecLocked(listener);
+ }
+ // Second, call back to PermissionController to say it's canceled.
+ sendBroadcast(receiver, primaryUser);
+ }
+
+ /**
+ * Send an extra copy of the broadcast, to tell them that the list has changed
+ * because of an addition or removal. This function is less aggressive than
+ * authorizeReportImpl in logging about failures, because this is for use in
+ * cleanup cases to keep the apps' list in sync with ours.
+ */
+ private void sendBroadcast() {
+ final int primaryUser = getAndValidateUser();
+ if (primaryUser == UserHandle.USER_NULL) {
+ return;
+ }
+ final ComponentName receiver = getApproverComponent(primaryUser);
+ if (receiver == null) {
+ return;
+ }
+ sendBroadcast(receiver, primaryUser);
+ }
+
+ /**
+ * Send the confirmation broadcast.
+ */
+ private void sendBroadcast(ComponentName receiver, int primaryUser) {
+ final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED);
+ intent.setComponent(receiver);
+
+ // Send it to the primary user.
+ mContext.sendBroadcastAsUser(intent, UserHandle.getUserHandleForUid(primaryUser),
+ android.Manifest.permission.APPROVE_INCIDENT_REPORTS);
+ }
+
+ /**
+ * Remove a PendingReportRec keyed by uri, and return it.
+ */
+ private PendingReportRec findAndRemovePendingReportRecLocked(String uriString) {
+ final Uri uri = Uri.parse(uriString);
+ final int id;
+ try {
+ final String idStr = uri.getQueryParameter(IncidentManager.URI_PARAM_ID);
+ id = Integer.parseInt(idStr);
+ } catch (NumberFormatException ex) {
+ Log.w(TAG, "Can't parse id from: " + uriString);
+ return null;
+ }
+ final int size = mPending.size();
+ for (int i = 0; i < size; i++) {
+ final PendingReportRec rec = mPending.get(i);
+ if (rec.id == id) {
+ mPending.remove(i);
+ return rec;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Remove a PendingReportRec keyed by listener.
+ */
+ private void removePendingReportRecLocked(IIncidentAuthListener listener) {
+ final int size = mPending.size();
+ for (int i = 0; i < size; i++) {
+ final PendingReportRec rec = mPending.get(i);
+ if (rec.listener.asBinder() == listener.asBinder()) {
+ Log.i(TAG, " ...Removed PendingReportRec index=" + i + ": " + rec.getUri());
+ mPending.remove(i);
+ }
+ }
+ }
+
+ /**
+ * Just call listener.deny() (wrapping the RemoteException), without try to
+ * add it to the list.
+ */
+ private void denyReportBeforeAddingRec(IIncidentAuthListener listener, String pkg) {
+ try {
+ listener.onReportDenied();
+ } catch (RemoteException ex) {
+ Log.w(TAG, "Failed calling back for denial for " + pkg, ex);
+ }
+ }
+
+ /**
+ * Check whether the current user is the primary user, and return the user id if they are.
+ * Returns UserHandle.USER_NULL if not valid.
+ */
+ private int getAndValidateUser() {
+ // Current user
+ UserInfo currentUser;
+ try {
+ currentUser = ActivityManager.getService().getCurrentUser();
+ } catch (RemoteException ex) {
+ // We're already inside the system process.
+ throw new RuntimeException(ex);
+ }
+
+ // Primary user
+ final UserManager um = UserManager.get(mContext);
+ final UserInfo primaryUser = um.getPrimaryUser();
+
+ // Check that we're using the right user.
+ if (currentUser == null) {
+ Log.w(TAG, "No current user. Nobody to approve the report."
+ + " The report will be denied.");
+ return UserHandle.USER_NULL;
+ }
+ if (primaryUser == null) {
+ Log.w(TAG, "No primary user. Nobody to approve the report."
+ + " The report will be denied.");
+ return UserHandle.USER_NULL;
+ }
+ if (primaryUser.id != currentUser.id) {
+ Log.w(TAG, "Only the primary user can approve bugreports, but they are not"
+ + " the current user. The report will be denied.");
+ return UserHandle.USER_NULL;
+ }
+
+ return primaryUser.id;
+ }
+
+ /**
+ * Return the ComponentName of the BroadcastReceiver that will approve reports.
+ * The system must have zero or one of these installed. We only look on the
+ * system partition. When the broadcast happens, the component will also need
+ * have the APPROVE_INCIDENT_REPORTS permission.
+ */
+ private ComponentName getApproverComponent(int userId) {
+ // Find the one true BroadcastReceiver
+ final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED);
+ final List<ResolveInfo> matches = mPackageManager.queryBroadcastReceiversAsUser(intent,
+ PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
+ if (matches.size() == 1) {
+ return matches.get(0).getComponentInfo().getComponentName();
+ } else {
+ Log.w(TAG, "Didn't find exactly one BroadcastReceiver to handle "
+ + Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED
+ + ". The report will be denied. size="
+ + matches.size() + ": matches=" + matches);
+ return null;
+ }
+ }
+
+ /**
+ * Return whether the package is one of the packages installed for the uid.
+ */
+ private boolean isPackageInUid(int uid, String packageName) {
+ try {
+ mAppOpsManager.checkPackage(uid, packageName);
+ return true;
+ } catch (SecurityException ex) {
+ return false;
+ }
+ }
+}
+
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 669ff2b7bad5..5e7ea05f799c 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -234,6 +234,7 @@ public class InputManagerService extends IInputManager.Stub
private static native void nativeReloadPointerIcons(long ptr);
private static native void nativeSetCustomPointerIcon(long ptr, PointerIcon icon);
private static native void nativeSetPointerCapture(long ptr, boolean detached);
+ private static native boolean nativeCanDispatchToDisplay(long ptr, int deviceId, int displayId);
// Input event injection constants defined in InputDispatcher.h.
private static final int INPUT_EVENT_INJECTION_SUCCEEDED = 0;
@@ -1890,6 +1891,16 @@ public class InputManagerService extends IInputManager.Stub
return new String[0];
}
+ /**
+ * Gets if an input device could dispatch to the given display".
+ * @param deviceId The input device id.
+ * @param displayId The specific display id.
+ * @return True if the device could dispatch to the given display, false otherwise.
+ */
+ public boolean canDispatchToDisplay(int deviceId, int displayId) {
+ return nativeCanDispatchToDisplay(mPtr, deviceId, displayId);
+ }
+
// Native callback.
private int getKeyRepeatTimeout() {
return ViewConfiguration.getKeyRepeatTimeout();
diff --git a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java b/services/core/java/com/android/server/location/ActivityRecognitionProxy.java
index 22fabb2cdd3e..80ab7903cef7 100644
--- a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java
+++ b/services/core/java/com/android/server/location/ActivityRecognitionProxy.java
@@ -24,7 +24,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
-import com.android.internal.os.BackgroundThread;
+import com.android.server.FgThread;
import com.android.server.ServiceWatcher;
/**
@@ -84,7 +84,7 @@ public class ActivityRecognitionProxy {
overlaySwitchResId,
defaultServicePackageNameResId,
initialPackageNameResId,
- BackgroundThread.getHandler()) {
+ FgThread.getHandler()) {
@Override
protected void onBind() {
runOnBinder(ActivityRecognitionProxy.this::initializeService);
diff --git a/services/core/java/com/android/server/location/GeocoderProxy.java b/services/core/java/com/android/server/location/GeocoderProxy.java
index e6f0ed9d14b0..d9602b897303 100644
--- a/services/core/java/com/android/server/location/GeocoderProxy.java
+++ b/services/core/java/com/android/server/location/GeocoderProxy.java
@@ -21,7 +21,7 @@ import android.location.Address;
import android.location.GeocoderParams;
import android.location.IGeocodeProvider;
-import com.android.internal.os.BackgroundThread;
+import com.android.server.FgThread;
import com.android.server.ServiceWatcher;
import java.util.List;
@@ -53,7 +53,7 @@ public class GeocoderProxy {
int initialPackageNamesResId) {
mServiceWatcher = new ServiceWatcher(context, TAG, SERVICE_ACTION, overlaySwitchResId,
defaultServicePackageNameResId, initialPackageNamesResId,
- BackgroundThread.getHandler());
+ FgThread.getHandler());
}
private boolean bind() {
diff --git a/services/core/java/com/android/server/location/GeofenceProxy.java b/services/core/java/com/android/server/location/GeofenceProxy.java
index 38c7d491f706..ce93661a8810 100644
--- a/services/core/java/com/android/server/location/GeofenceProxy.java
+++ b/services/core/java/com/android/server/location/GeofenceProxy.java
@@ -30,7 +30,7 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
-import com.android.internal.os.BackgroundThread;
+import com.android.server.FgThread;
import com.android.server.ServiceWatcher;
/**
@@ -82,7 +82,7 @@ public final class GeofenceProxy {
mContext = context;
mServiceWatcher = new ServiceWatcher(context, TAG, SERVICE_ACTION, overlaySwitchResId,
defaultServicePackageNameResId, initialPackageNamesResId,
- BackgroundThread.getHandler()) {
+ FgThread.getHandler()) {
@Override
protected void onBind() {
runOnBinder(mUpdateGeofenceHardware);
diff --git a/services/core/java/com/android/server/location/LocationProviderProxy.java b/services/core/java/com/android/server/location/LocationProviderProxy.java
index 6b5b1bebd20f..776beb50be62 100644
--- a/services/core/java/com/android/server/location/LocationProviderProxy.java
+++ b/services/core/java/com/android/server/location/LocationProviderProxy.java
@@ -31,8 +31,8 @@ import com.android.internal.location.ILocationProvider;
import com.android.internal.location.ILocationProviderManager;
import com.android.internal.location.ProviderProperties;
import com.android.internal.location.ProviderRequest;
-import com.android.internal.os.BackgroundThread;
import com.android.internal.os.TransferPipe;
+import com.android.server.FgThread;
import com.android.server.LocationManagerService;
import com.android.server.ServiceWatcher;
@@ -105,7 +105,7 @@ public class LocationProviderProxy extends AbstractLocationProvider {
mServiceWatcher = new ServiceWatcher(context, TAG, action, overlaySwitchResId,
defaultServicePackageNameResId, initialPackageNamesResId,
- BackgroundThread.getHandler()) {
+ FgThread.getHandler()) {
@Override
protected void onBind() {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 467b192cef2a..ba187c0884b9 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -198,6 +198,7 @@ import com.android.internal.os.BackgroundThread;
import com.android.internal.os.SomeArgs;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.Preconditions;
@@ -2366,6 +2367,28 @@ public class NotificationManagerService extends SystemService {
}
@Override
+ public boolean shouldHideSilentStatusIcons(String callingPkg) {
+ checkCallerIsSameApp(callingPkg);
+
+ if (isCallerSystemOrPhone()
+ || mListeners.isListenerPackage(callingPkg)) {
+ return mPreferencesHelper.shouldHideSilentStatusIcons();
+ } else {
+ throw new SecurityException("Only available for notification listeners");
+ }
+ }
+
+ @Override
+ public void setHideSilentStatusIcons(boolean hide) {
+ checkCallerIsSystem();
+
+ mPreferencesHelper.setHideSilentStatusIcons(hide);
+ handleSavePolicyFile();
+
+ mListeners.onStatusBarIconsBehaviorChanged(hide);
+ }
+
+ @Override
public int getPackageImportance(String pkg) {
checkCallerIsSystemOrSameApp(pkg);
return mPreferencesHelper.getImportance(pkg, Binder.getCallingUid());
@@ -3633,6 +3656,22 @@ public class NotificationManagerService extends SystemService {
}
@Override
+ public ComponentName getAllowedNotificationAssistantForUser(int userId) {
+ checkCallerIsSystem();
+ List<ComponentName> allowedComponents = mAssistants.getAllowedComponents(userId);
+ if (allowedComponents.size() > 1) {
+ throw new IllegalStateException(
+ "At most one NotificationAssistant: " + allowedComponents.size());
+ }
+ return CollectionUtils.firstOrNull(allowedComponents);
+ }
+
+ @Override
+ public ComponentName getAllowedNotificationAssistant() {
+ return getAllowedNotificationAssistantForUser(getCallingUserHandle().getIdentifier());
+ }
+
+ @Override
public boolean isNotificationListenerAccessGranted(ComponentName listener) {
Preconditions.checkNotNull(listener);
checkCallerIsSystemOrSameApp(listener.getPackageName());
@@ -3700,8 +3739,15 @@ public class NotificationManagerService extends SystemService {
@Override
public void setNotificationAssistantAccessGrantedForUser(ComponentName assistant,
int userId, boolean granted) throws RemoteException {
- Preconditions.checkNotNull(assistant);
checkCallerIsSystemOrShell();
+ if (assistant == null) {
+ ComponentName allowedAssistant = CollectionUtils.firstOrNull(
+ mAssistants.getAllowedComponents(userId));
+ if (allowedAssistant != null) {
+ setNotificationAssistantAccessGrantedForUser(allowedAssistant, userId, false);
+ }
+ return;
+ }
final long identity = Binder.clearCallingIdentity();
try {
if (mAllowedManagedServicePackages.test(assistant.getPackageName())) {
@@ -7242,6 +7288,26 @@ public class NotificationManagerService extends SystemService {
}
}
}
+
+ @Override
+ protected void setPackageOrComponentEnabled(String pkgOrComponent, int userId,
+ boolean isPrimary, boolean enabled) {
+ // Ensures that only one component is enabled at a time
+ if (enabled) {
+ List<ComponentName> allowedComponents = getAllowedComponents(userId);
+ if (!allowedComponents.isEmpty()) {
+ ComponentName currentComponent = CollectionUtils.firstOrNull(allowedComponents);
+ if (currentComponent.flattenToString().equals(pkgOrComponent)) return;
+ try {
+ getBinderService().setNotificationAssistantAccessGrantedForUser(
+ currentComponent, userId, false);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+ }
+ super.setPackageOrComponentEnabled(pkgOrComponent, userId, isPrimary, enabled);
+ }
}
public class NotificationListeners extends ManagedServices {
@@ -7324,6 +7390,20 @@ public class NotificationManagerService extends SystemService {
return mLightTrimListeners.contains(info) ? TRIM_LIGHT : TRIM_FULL;
}
+ public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
+ for (final ManagedServiceInfo info : getServices()) {
+ mHandler.post(() -> {
+ final INotificationListener listener = (INotificationListener) info.service;
+ try {
+ listener.onStatusBarIconsBehaviorChanged(hideSilentStatusIcons);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "unable to notify listener "
+ + "(hideSilentStatusIcons): " + listener, ex);
+ }
+ });
+ }
+ }
+
/**
* asynchronously notify all listeners about a new notification
*
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index 3f0043cecc49..6ed4f5c03171 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -76,6 +76,7 @@ public class PreferencesHelper implements RankingConfig {
private static final String TAG_CHANNEL = "channel";
private static final String TAG_GROUP = "channelGroup";
private static final String TAG_DELEGATE = "delegate";
+ private static final String TAG_STATUS_ICONS = "status_icons";
private static final String ATT_VERSION = "version";
private static final String ATT_NAME = "name";
@@ -89,10 +90,13 @@ public class PreferencesHelper implements RankingConfig {
private static final String ATT_APP_USER_LOCKED_FIELDS = "app_user_locked_fields";
private static final String ATT_ENABLED = "enabled";
private static final String ATT_USER_ALLOWED = "allowed";
+ private static final String ATT_HIDE_SILENT = "hide_silent";
private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT;
private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE;
private static final int DEFAULT_IMPORTANCE = NotificationManager.IMPORTANCE_UNSPECIFIED;
+ @VisibleForTesting
+ static final boolean DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS = false;
private static final boolean DEFAULT_SHOW_BADGE = true;
private static final boolean DEFAULT_ALLOW_BUBBLE = true;
private static final boolean DEFAULT_OEM_LOCKED_IMPORTANCE = false;
@@ -124,6 +128,7 @@ public class PreferencesHelper implements RankingConfig {
private SparseBooleanArray mBadgingEnabled;
private boolean mAreChannelsBypassingDnd;
+ private boolean mHideSilentStatusBarIcons;
public PreferencesHelper(Context context, PackageManager pm, RankingHandler rankingHandler,
ZenModeHelper zenHelper) {
@@ -143,9 +148,8 @@ public class PreferencesHelper implements RankingConfig {
String tag = parser.getName();
if (!TAG_RANKING.equals(tag)) return;
synchronized (mPackagePreferences) {
- // Clobber groups and channels with the xml, but don't delete other data that wasn't present
-
- // at the time of serialization.
+ // Clobber groups and channels with the xml, but don't delete other data that wasn't
+ // present at the time of serialization.
mRestoredWithoutUids.clear();
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
tag = parser.getName();
@@ -153,7 +157,10 @@ public class PreferencesHelper implements RankingConfig {
return;
}
if (type == XmlPullParser.START_TAG) {
- if (TAG_PACKAGE.equals(tag)) {
+ if (TAG_STATUS_ICONS.equals(tag)) {
+ mHideSilentStatusBarIcons = XmlUtils.readBooleanAttribute(
+ parser, ATT_HIDE_SILENT, DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS);
+ } else if (TAG_PACKAGE.equals(tag)) {
int uid = XmlUtils.readIntAttribute(parser, ATT_UID, UNKNOWN_UID);
String name = parser.getAttributeValue(null, ATT_NAME);
if (!TextUtils.isEmpty(name)) {
@@ -375,6 +382,11 @@ public class PreferencesHelper implements RankingConfig {
public void writeXml(XmlSerializer out, boolean forBackup) throws IOException {
out.startTag(null, TAG_RANKING);
out.attribute(null, ATT_VERSION, Integer.toString(XML_VERSION));
+ if (mHideSilentStatusBarIcons != DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS) {
+ out.startTag(null, TAG_STATUS_ICONS);
+ out.attribute(null, ATT_HIDE_SILENT, String.valueOf(mHideSilentStatusBarIcons));
+ out.endTag(null, TAG_STATUS_ICONS);
+ }
synchronized (mPackagePreferences) {
final int N = mPackagePreferences.size();
@@ -781,6 +793,14 @@ public class PreferencesHelper implements RankingConfig {
}
}
+ public boolean shouldHideSilentStatusIcons() {
+ return mHideSilentStatusBarIcons;
+ }
+
+ public void setHideSilentStatusIcons(boolean hide) {
+ mHideSilentStatusBarIcons = hide;
+ }
+
public void lockChannelsForOEM(String[] appOrChannelList) {
if (appOrChannelList == null) {
return;
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index c2ac27a5b737..62c4815a7de0 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -34,9 +34,11 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ILauncherApps;
import android.content.pm.IOnAppsChangedListener;
+import android.content.pm.IPackageInstallerCallback;
import android.content.pm.LauncherApps;
import android.content.pm.LauncherApps.ShortcutQuery;
import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller.SessionInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
@@ -56,6 +58,7 @@ import android.os.IInterface;
import android.os.ParcelFileDescriptor;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManagerInternal;
@@ -153,6 +156,8 @@ public class LauncherAppsService extends SystemService {
private final Object mVouchedSignaturesLocked = new Object();
+ private PackageInstallerService mPackageInstallerService;
+
public LauncherAppsImpl(Context context) {
mContext = context;
mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
@@ -204,8 +209,7 @@ public class LauncherAppsService extends SystemService {
}
/*
- * @see android.content.pm.ILauncherApps#addOnAppsChangedListener(
- * android.content.pm.IOnAppsChangedListener)
+ * @see android.content.pm.ILauncherApps#addOnAppsChangedListener
*/
@Override
public void addOnAppsChangedListener(String callingPackage, IOnAppsChangedListener listener)
@@ -228,8 +232,7 @@ public class LauncherAppsService extends SystemService {
}
/*
- * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener(
- * android.content.pm.IOnAppsChangedListener)
+ * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener
*/
@Override
public void removeOnAppsChangedListener(IOnAppsChangedListener listener)
@@ -246,6 +249,44 @@ public class LauncherAppsService extends SystemService {
}
/**
+ * @see android.content.pm.ILauncherApps#registerPackageInstallerCallback
+ */
+ @Override
+ public void registerPackageInstallerCallback(String callingPackage,
+ IPackageInstallerCallback callback) {
+ verifyCallingPackage(callingPackage);
+ UserHandle callingIdUserHandle = new UserHandle(getCallingUserId());
+ getPackageInstallerService().registerCallback(callback, eventUserId ->
+ isEnabledProfileOf(callingIdUserHandle,
+ new UserHandle(eventUserId), "shouldReceiveEvent"));
+ }
+
+ @Override
+ public ParceledListSlice<SessionInfo> getAllSessions(String callingPackage) {
+ verifyCallingPackage(callingPackage);
+ List<SessionInfo> sessionInfos = new ArrayList<>();
+ int[] userIds = mUm.getEnabledProfileIds(getCallingUserId());
+ long token = Binder.clearCallingIdentity();
+ try {
+ for (int userId : userIds) {
+ sessionInfos.addAll(getPackageInstallerService().getAllSessions(userId)
+ .getList());
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ return new ParceledListSlice<>(sessionInfos);
+ }
+
+ private PackageInstallerService getPackageInstallerService() {
+ if (mPackageInstallerService == null) {
+ mPackageInstallerService = ((PackageInstallerService) ((PackageManagerService)
+ ServiceManager.getService("package")).getPackageInstaller());
+ }
+ return mPackageInstallerService;
+ }
+
+ /**
* Register a receiver to watch for package broadcasts
*/
private void startWatchingPackageBroadcasts() {
@@ -430,6 +471,9 @@ public class LauncherAppsService extends SystemService {
if (!mVouchedSignaturesByUser.containsKey(user)) {
initVouchedSignatures(user);
}
+ if (isManagedProfileAdmin(user, appInfo.packageName)) {
+ return false;
+ }
if (mVouchProviders.contains(appInfo.packageName)) {
// If it's a vouching packages then we must show hidden app
return true;
@@ -453,6 +497,24 @@ public class LauncherAppsService extends SystemService {
return true;
}
+ private boolean isManagedProfileAdmin(UserHandle user, String packageName) {
+ final List<UserInfo> userInfoList = mUm.getProfiles(user.getIdentifier());
+ for (int i = 0; i < userInfoList.size(); i++) {
+ UserInfo userInfo = userInfoList.get(i);
+ if (!userInfo.isManagedProfile()) {
+ continue;
+ }
+ ComponentName componentName = mDpm.getProfileOwnerAsUser(userInfo.getUserHandle());
+ if (componentName == null) {
+ continue;
+ }
+ if (componentName.getPackageName().equals(packageName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
@VisibleForTesting
static String computePackageCertDigest(Signature signature) {
MessageDigest messageDigest;
@@ -848,6 +910,29 @@ public class LauncherAppsService extends SystemService {
}
@Override
+ public void startSessionDetailsActivityAsUser(IApplicationThread caller,
+ String callingPackage, SessionInfo sessionInfo, Rect sourceBounds,
+ Bundle opts, UserHandle userHandle) throws RemoteException {
+ int userId = userHandle.getIdentifier();
+ if (!canAccessProfile(userId, "Cannot start details activity")) {
+ return;
+ }
+
+ Intent i = new Intent(Intent.ACTION_VIEW)
+ .setData(new Uri.Builder()
+ .scheme("market")
+ .authority("details")
+ .appendQueryParameter("id", sessionInfo.appPackageName)
+ .build())
+ .putExtra(Intent.EXTRA_REFERRER, new Uri.Builder().scheme("android-app")
+ .authority(callingPackage).build());
+ i.setSourceBounds(sourceBounds);
+
+ mActivityTaskManagerInternal.startActivityAsUser(caller, callingPackage, i, opts,
+ userId);
+ }
+
+ @Override
public void startActivityAsUser(IApplicationThread caller, String callingPackage,
ComponentName component, Rect sourceBounds,
Bundle opts, UserHandle user) throws RemoteException {
diff --git a/services/core/java/com/android/server/pm/OWNERS b/services/core/java/com/android/server/pm/OWNERS
index 60d792530101..33b8641c145e 100644
--- a/services/core/java/com/android/server/pm/OWNERS
+++ b/services/core/java/com/android/server/pm/OWNERS
@@ -51,6 +51,8 @@ per-file UserManagerService.java = omakoto@google.com
per-file UserManagerService.java = yamasani@google.com
per-file UserRestrictionsUtils.java = omakoto@google.com
per-file UserRestrictionsUtils.java = yamasani@google.com
+per-file UserRestrictionsUtils.java = rubinxu@google.com
+per-file UserRestrictionsUtils.java = sandness@google.com
# security
per-file KeySetHandle.java = cbrubaker@google.com
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 146a2f3d8433..a3e0d8db8ad5 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -59,7 +59,6 @@ import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.SELinux;
-import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
import android.system.ErrnoException;
@@ -107,6 +106,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Random;
+import java.util.function.IntPredicate;
/** The service responsible for installing packages. */
public class PackageInstallerService extends IPackageInstaller.Stub implements
@@ -804,7 +804,14 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
public void registerCallback(IPackageInstallerCallback callback, int userId) {
mPermissionManager.enforceCrossUserPermission(
Binder.getCallingUid(), userId, true, false, "registerCallback");
- mCallbacks.register(callback, userId);
+ registerCallback(callback, eventUserId -> userId == eventUserId);
+ }
+
+ /**
+ * Assume permissions already checked and caller's identity cleared
+ */
+ public void registerCallback(IPackageInstallerCallback callback, IntPredicate userCheck) {
+ mCallbacks.register(callback, userCheck);
}
@Override
@@ -1026,8 +1033,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
super(looper);
}
- public void register(IPackageInstallerCallback callback, int userId) {
- mCallbacks.register(callback, new UserHandle(userId));
+ public void register(IPackageInstallerCallback callback, IntPredicate userCheck) {
+ mCallbacks.register(callback, userCheck);
}
public void unregister(IPackageInstallerCallback callback) {
@@ -1040,9 +1047,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
final int n = mCallbacks.beginBroadcast();
for (int i = 0; i < n; i++) {
final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
- final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
- // TODO: dispatch notifications for slave profiles
- if (userId == user.getIdentifier()) {
+ final IntPredicate userCheck = (IntPredicate) mCallbacks.getBroadcastCookie(i);
+ if (userCheck.test(userId)) {
try {
invokeCallback(callback, msg);
} catch (RemoteException ignored) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 494ec3ff67aa..de0849fa9951 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -473,6 +473,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
final SessionInfo info = new SessionInfo();
synchronized (mLock) {
info.sessionId = sessionId;
+ info.userId = userId;
info.installerPackageName = mInstallerPackageName;
info.resolvedBaseCodePath = (mResolvedBaseFile != null) ?
mResolvedBaseFile.getAbsolutePath() : null;
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 6f1eeeb7de7a..dc18dfcf8613 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -61,6 +61,10 @@ import android.content.pm.dex.DexMetadataHelper;
import android.content.pm.dex.ISnapshotRuntimeProfileCallback;
import android.content.res.AssetManager;
import android.content.res.Resources;
+import android.content.rollback.IRollbackManager;
+import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.RollbackInfo;
+import android.content.rollback.RollbackManager;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
@@ -263,6 +267,8 @@ class PackageManagerShellCommand extends ShellCommand {
return getStagedSessions();
case "uninstall-system-updates":
return uninstallSystemUpdates();
+ case "rollback-app":
+ return runRollbackApp();
default: {
String nextArg = getNextArg();
if (nextArg == null) {
@@ -348,6 +354,55 @@ class PackageManagerShellCommand extends ShellCommand {
return 1;
}
+ private int runRollbackApp() {
+ final PrintWriter pw = getOutPrintWriter();
+
+ final String packageName = getNextArgRequired();
+ if (packageName == null) {
+ pw.println("Error: package name not specified");
+ return 1;
+ }
+
+ final LocalIntentReceiver receiver = new LocalIntentReceiver();
+ try {
+ IRollbackManager rm = IRollbackManager.Stub.asInterface(
+ ServiceManager.getService(Context.ROLLBACK_SERVICE));
+
+ RollbackInfo rollback = null;
+ for (RollbackInfo r : (List<RollbackInfo>) rm.getAvailableRollbacks().getList()) {
+ for (PackageRollbackInfo info : r.getPackages()) {
+ if (packageName.equals(info.getPackageName())) {
+ rollback = r;
+ break;
+ }
+ }
+ }
+
+ if (rollback == null) {
+ pw.println("No available rollbacks for: " + packageName);
+ return 1;
+ }
+
+ rm.commitRollback(rollback.getRollbackId(),
+ ParceledListSlice.<VersionedPackage>emptyList(),
+ "com.android.shell", receiver.getIntentSender());
+ } catch (RemoteException re) {
+ // Cannot happen.
+ }
+
+ final Intent result = receiver.getResult();
+ final int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
+ RollbackManager.STATUS_FAILURE);
+ if (status == RollbackManager.STATUS_SUCCESS) {
+ pw.println("Success");
+ return 0;
+ } else {
+ pw.println("Failure ["
+ + result.getStringExtra(RollbackManager.EXTRA_STATUS_MESSAGE) + "]");
+ return 1;
+ }
+ }
+
private void setParamsSize(InstallParams params, String inPath) {
if (params.sessionParams.sizeBytes == -1 && !STDIN_PATH.equals(inPath)) {
final ParcelFileDescriptor fd = openFileForSystem(inPath, "r");
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 4f20590a47ff..d0f192d597c6 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -1109,14 +1109,7 @@ public class UserManagerService extends IUserManager.Stub {
@Override
public int getManagedProfileBadge(@UserIdInt int userId) {
- int callingUserId = UserHandle.getCallingUserId();
- if (callingUserId != userId && !hasManageUsersPermission()) {
- if (!isSameProfileGroupNoChecks(callingUserId, userId)) {
- throw new SecurityException(
- "You need MANAGE_USERS permission to: check if specified user a " +
- "managed profile outside your profile group");
- }
- }
+ checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "getManagedProfileBadge");
synchronized (mUsersLock) {
UserInfo userInfo = getUserInfoLU(userId);
return userInfo != null ? userInfo.profileBadge : 0;
@@ -1125,14 +1118,7 @@ public class UserManagerService extends IUserManager.Stub {
@Override
public boolean isManagedProfile(int userId) {
- int callingUserId = UserHandle.getCallingUserId();
- if (callingUserId != userId && !hasManageUsersPermission()) {
- if (!isSameProfileGroupNoChecks(callingUserId, userId)) {
- throw new SecurityException(
- "You need MANAGE_USERS permission to: check if specified user a " +
- "managed profile outside your profile group");
- }
- }
+ checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isManagedProfile");
synchronized (mUsersLock) {
UserInfo userInfo = getUserInfoLU(userId);
return userInfo != null && userInfo.isManagedProfile();
diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index 7ac7395e1f99..abbddf380e57 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -16,7 +16,7 @@
package com.android.server.pm.dex;
-import static android.provider.DeviceConfig.FsiBoot;
+import static android.provider.DeviceConfig.DexBoot;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo;
@@ -710,8 +710,8 @@ public class DexManager {
return isPackageSelectedToRunOobInternal(
SystemProperties.getBoolean(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB, false),
SystemProperties.get(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB_LIST, "ALL"),
- DeviceConfig.getProperty(FsiBoot.NAMESPACE, FsiBoot.OOB_ENABLED),
- DeviceConfig.getProperty(FsiBoot.NAMESPACE, FsiBoot.OOB_WHITELIST),
+ DeviceConfig.getProperty(DexBoot.NAMESPACE, DexBoot.PRIV_APPS_OOB_ENABLED),
+ DeviceConfig.getProperty(DexBoot.NAMESPACE, DexBoot.PRIV_APPS_OOB_WHITELIST),
packageNamesInSameProcess);
}
diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java
index 03ec57b45acf..d72270e3f36d 100644
--- a/services/core/java/com/android/server/role/RoleManagerService.java
+++ b/services/core/java/com/android/server/role/RoleManagerService.java
@@ -52,6 +52,7 @@ import android.os.UserManagerInternal;
import android.service.sms.FinancialSmsService;
import android.telephony.IFinancialSmsCallback;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.PackageUtils;
import android.util.Slog;
@@ -145,6 +146,9 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
mAppOpsManager = context.getSystemService(AppOpsManager.class);
+ LocalServices.addService(RoleManagerServiceInternal.class,
+ new RoleManagerServiceInternalImpl());
+
registerUserRemovedReceiver();
}
@@ -382,6 +386,19 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
}
}
+ /**
+ * Get all roles and packages hold them.
+ *
+ * @param user The user to query to roles for
+ *
+ * @return The roles and their holders
+ */
+ @NonNull
+ private ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) {
+ RoleUserState userState = getOrCreateUserState(user.getIdentifier());
+ return userState.getRoleHolders();
+ }
+
private class Stub extends IRoleManager.Stub {
@Override
@@ -676,4 +693,16 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
}
}
}
+
+ /**
+ * Entry point for internal calls into role manager
+ */
+ private final class RoleManagerServiceInternalImpl extends RoleManagerServiceInternal {
+
+ @NonNull
+ @Override
+ public ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) {
+ return RoleManagerService.this.getRoleHoldersAsUser(user);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/role/RoleManagerServiceInternal.java b/services/core/java/com/android/server/role/RoleManagerServiceInternal.java
new file mode 100644
index 000000000000..3afc3f731eb9
--- /dev/null
+++ b/services/core/java/com/android/server/role/RoleManagerServiceInternal.java
@@ -0,0 +1,38 @@
+/*
+ * 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.role;
+
+import android.annotation.NonNull;
+import android.os.UserHandle;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+
+/**
+ * Internal calls into {@link RoleManagerService}
+ */
+public abstract class RoleManagerServiceInternal {
+ /**
+ * Get all roles and packages hold them.
+ *
+ * @param user The user to query to roles for
+ *
+ * @return The roles and their holders
+ */
+ @NonNull
+ public abstract ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(
+ @NonNull UserHandle user);
+}
diff --git a/services/core/java/com/android/server/role/RoleUserState.java b/services/core/java/com/android/server/role/RoleUserState.java
index 02dcc4945664..bc68dded2dfe 100644
--- a/services/core/java/com/android/server/role/RoleUserState.java
+++ b/services/core/java/com/android/server/role/RoleUserState.java
@@ -376,7 +376,7 @@ public class RoleUserState {
version = mVersion;
packagesHash = mPackagesHash;
- roles = snapshotRolesLocked();
+ roles = getRoleHolders();
}
AtomicFile atomicFile = new AtomicFile(getFile(mUserId), "roles-" + mUserId);
@@ -541,7 +541,7 @@ public class RoleUserState {
version = mVersion;
packagesHash = mPackagesHash;
- roles = snapshotRolesLocked();
+ roles = getRoleHolders();
}
long fieldToken = dumpOutputStream.start(fieldName, fieldId);
@@ -570,17 +570,24 @@ public class RoleUserState {
dumpOutputStream.end(fieldToken);
}
- @GuardedBy("mLock")
- private ArrayMap<String, ArraySet<String>> snapshotRolesLocked() {
- ArrayMap<String, ArraySet<String>> roles = new ArrayMap<>();
- for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) {
- String roleName = mRoles.keyAt(i);
- ArraySet<String> roleHolders = mRoles.valueAt(i);
-
- roleHolders = new ArraySet<>(roleHolders);
- roles.put(roleName, roleHolders);
+ /**
+ * Get the roles and their holders.
+ *
+ * @return A copy of the roles and their holders
+ */
+ @NonNull
+ public ArrayMap<String, ArraySet<String>> getRoleHolders() {
+ synchronized (mLock) {
+ ArrayMap<String, ArraySet<String>> roles = new ArrayMap<>();
+ for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) {
+ String roleName = mRoles.keyAt(i);
+ ArraySet<String> roleHolders = mRoles.valueAt(i);
+
+ roleHolders = new ArraySet<>(roleHolders);
+ roles.put(roleName, roleHolders);
+ }
+ return roles;
}
- return roles;
}
/**
diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
new file mode 100644
index 000000000000..8dd076028b43
--- /dev/null
+++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
@@ -0,0 +1,236 @@
+/*
+ * 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.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;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.pm.Installer;
+import com.android.server.pm.Installer.InstallerException;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Encapsulates the logic for initiating userdata snapshots and rollbacks via installd.
+ */
+@VisibleForTesting
+// TODO(narayan): Reason about the failure scenarios that involve one or more IPCs to installd
+// failing. We need to decide what course of action to take if calls to snapshotAppData or
+// restoreAppDataSnapshot fail.
+public class AppDataRollbackHelper {
+ private static final String TAG = "RollbackManager";
+
+ private final Installer mInstaller;
+
+ public AppDataRollbackHelper(Installer installer) {
+ mInstaller = installer;
+ }
+
+ /**
+ * Creates an app data snapshot for a specified {@code packageName} for {@code installedUsers},
+ * a specified set of users for whom the package is installed.
+ *
+ * @return a list of users for which the snapshot is pending, usually because data for one or
+ * more users is still credential locked.
+ */
+ public IntArray snapshotAppData(String packageName, int[] installedUsers) {
+ final IntArray pendingBackups = new IntArray();
+ for (int user : installedUsers) {
+ final int storageFlags;
+ if (isUserCredentialLocked(user)) {
+ // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy
+ // across app user data until the user unlocks their device.
+ Log.v(TAG, "User: " + user + " isn't unlocked, skipping CE userdata backup.");
+ storageFlags = Installer.FLAG_STORAGE_DE;
+ pendingBackups.add(user);
+ } else {
+ storageFlags = Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE;
+ }
+
+ try {
+ mInstaller.snapshotAppData(packageName, user, storageFlags);
+ } catch (InstallerException ie) {
+ Log.e(TAG, "Unable to create app data snapshot for: " + packageName
+ + ", userId: " + user, ie);
+ }
+ }
+
+ return pendingBackups;
+ }
+
+ /**
+ * Restores an app data snapshot for a specified package ({@code packageName},
+ * {@code rollbackData}) for a specified {@code userId}.
+ *
+ * @return {@code true} iff. a change to the {@code rollbackData} has been made. Changes to
+ * {@code rollbackData} are restricted to the removal or addition of {@code userId} to
+ * the list of pending backups or restores.
+ */
+ public boolean restoreAppData(String packageName, RollbackData rollbackData,
+ int userId, int appId, long ceDataInode, String seInfo) {
+ if (rollbackData == null) {
+ return false;
+ }
+
+ if (!rollbackData.inProgress) {
+ Log.e(TAG, "Request to restore userData for: " + packageName
+ + ", but no rollback in progress.");
+ return false;
+ }
+
+ PackageRollbackInfo packageInfo = RollbackManagerServiceImpl.getPackageRollbackInfo(
+ rollbackData, packageName);
+ int storageFlags = Installer.FLAG_STORAGE_DE;
+
+ final IntArray pendingBackups = packageInfo.getPendingBackups();
+ final List<RestoreInfo> pendingRestores = packageInfo.getPendingRestores();
+ boolean changedRollbackData = false;
+
+ // If we still have a userdata backup pending for this user, it implies that the user
+ // hasn't unlocked their device between the point of backup and the point of restore,
+ // so the data cannot have changed. We simply skip restoring CE data in this case.
+ if (pendingBackups != null && pendingBackups.indexOf(userId) != -1) {
+ pendingBackups.remove(pendingBackups.indexOf(userId));
+ changedRollbackData = true;
+ } else {
+ // There's no pending CE backup for this user, which means that we successfully
+ // managed to backup data for the user, which means we seek to restore it
+ if (isUserCredentialLocked(userId)) {
+ // We've encountered a user that hasn't unlocked on a FBE device, so we can't
+ // copy across app user data until the user unlocks their device.
+ pendingRestores.add(new RestoreInfo(userId, appId, seInfo));
+ changedRollbackData = true;
+ } else {
+ // This user has unlocked, we can proceed to restore both CE and DE data.
+ storageFlags = storageFlags | Installer.FLAG_STORAGE_CE;
+ }
+ }
+
+ try {
+ mInstaller.restoreAppDataSnapshot(packageName, appId, ceDataInode,
+ seInfo, userId, storageFlags);
+ } catch (InstallerException ie) {
+ Log.e(TAG, "Unable to restore app data snapshot: " + packageName, ie);
+ }
+
+ return changedRollbackData;
+ }
+
+ /**
+ * Computes the list of pending backups and restores for {@code userId} given lists of
+ * available and recent rollbacks. Packages pending backup for the given user are added
+ * to {@code pendingBackups} and packages pending restore are added to {@code pendingRestores}
+ * along with their corresponding {@code RestoreInfo}.
+ *
+ * @return the list of {@code RollbackData} that have been modified during this computation.
+ */
+ public List<RollbackData> computePendingBackupsAndRestores(int userId,
+ ArrayList<String> pendingBackupPackages, Map<String, RestoreInfo> pendingRestores,
+ List<RollbackData> availableRollbacks, List<RollbackInfo> recentRollbacks) {
+ List<RollbackData> rd = new ArrayList<>();
+ // First check with the list of available rollbacks to see whether there are any
+ // pending backup operations that we've not managed to execute.
+ for (RollbackData data : availableRollbacks) {
+ for (PackageRollbackInfo info : data.packages) {
+ final IntArray pendingBackupUsers = info.getPendingBackups();
+ if (pendingBackupUsers != null) {
+ final int idx = pendingBackupUsers.indexOf(userId);
+ if (idx != -1) {
+ pendingBackupPackages.add(info.getPackageName());
+ pendingBackupUsers.remove(idx);
+ if (rd.indexOf(data) == -1) {
+ rd.add(data);
+ }
+ }
+ }
+ }
+ }
+
+ // Then check with the list of recently executed rollbacks to see whether there are
+ // any rollback operations
+ for (RollbackInfo data : recentRollbacks) {
+ for (PackageRollbackInfo info : data.getPackages()) {
+ final RestoreInfo ri = info.getRestoreInfo(userId);
+ if (ri != null) {
+ if (pendingBackupPackages.contains(info.getPackageName())) {
+ // This implies that the user hasn't unlocked their device between
+ // the request to backup data for this user and the request to restore
+ // it, so we do nothing here.
+ pendingBackupPackages.remove(info.getPackageName());
+ } else {
+ pendingRestores.put(info.getPackageName(), ri);
+ }
+
+ info.removeRestoreInfo(ri);
+ }
+ }
+ }
+
+ return rd;
+ }
+
+ /**
+ * Commits the list of pending backups and restores for a given {@code userId}.
+ */
+ public void commitPendingBackupAndRestoreForUser(int userId,
+ ArrayList<String> pendingBackups, Map<String, RestoreInfo> pendingRestores) {
+ if (!pendingBackups.isEmpty()) {
+ for (String packageName : pendingBackups) {
+ try {
+ mInstaller.snapshotAppData(packageName, userId, Installer.FLAG_STORAGE_CE);
+ } catch (InstallerException ie) {
+ Log.e(TAG, "Unable to create app data snapshot for: " + packageName, ie);
+ }
+ }
+ }
+
+ // TODO(narayan): Should we perform the restore before the backup for packages that have
+ // both backups and restores pending ? We could get into this case if we have a pending
+ // restore from a rollback + a snapshot request from a new restore.
+ if (!pendingRestores.isEmpty()) {
+ for (String packageName : pendingRestores.keySet()) {
+ try {
+ final RestoreInfo ri = pendingRestores.get(packageName);
+
+ // TODO(narayan): Verify that the user of "0" for ceDataInode is accurate
+ // here. We know that the user has unlocked (and that their CE data is
+ // available) so we shouldn't need to resort to the fallback path.
+ mInstaller.restoreAppDataSnapshot(packageName, ri.appId,
+ 0 /* ceDataInode */, ri.seInfo, userId, Installer.FLAG_STORAGE_CE);
+ } catch (InstallerException ie) {
+ Log.e(TAG, "Unable to restore app data snapshot for: " + packageName, ie);
+ }
+ }
+ }
+ }
+
+ /**
+ * @return {@code true} iff. {@code userId} is locked on an FBE device.
+ */
+ @VisibleForTesting
+ public boolean isUserCredentialLocked(int userId) {
+ return StorageManager.isFileEncryptedNativeOrEmulated()
+ && !StorageManager.isUserKeyUnlocked(userId);
+ }
+}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerService.java b/services/core/java/com/android/server/rollback/RollbackManagerService.java
index 4b5e76497f62..ba6cdddb4cc8 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerService.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerService.java
@@ -39,4 +39,9 @@ public final class RollbackManagerService extends SystemService {
mService = new RollbackManagerServiceImpl(getContext());
publishBinderService(Context.ROLLBACK_SERVICE, mService);
}
+
+ @Override
+ public void onUnlockUser(int user) {
+ mService.onUnlockUser(user);
+ }
}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 289618eb133c..5eb137b4c50c 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -31,6 +31,7 @@ import android.content.pm.ParceledListSlice;
import android.content.pm.VersionedPackage;
import android.content.rollback.IRollbackManager;
import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.PackageRollbackInfo.RestoreInfo;
import android.content.rollback.RollbackInfo;
import android.content.rollback.RollbackManager;
import android.os.Binder;
@@ -39,14 +40,13 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.ParcelFileDescriptor;
import android.os.Process;
-import android.os.storage.StorageManager;
+import android.util.IntArray;
import android.util.Log;
import android.util.SparseBooleanArray;
import com.android.internal.annotations.GuardedBy;
import com.android.server.LocalServices;
import com.android.server.pm.Installer;
-import com.android.server.pm.Installer.InstallerException;
import com.android.server.pm.PackageManagerServiceUtils;
import java.io.File;
@@ -111,6 +111,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
private final HandlerThread mHandlerThread;
private final Installer mInstaller;
private final RollbackPackageHealthObserver mPackageHealthObserver;
+ private final AppDataRollbackHelper mUserdataHelper;
RollbackManagerServiceImpl(Context context) {
mContext = context;
@@ -124,6 +125,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
mRollbackStore = new RollbackStore(new File(Environment.getDataDirectory(), "rollback"));
mPackageHealthObserver = new RollbackPackageHealthObserver(mContext);
+ mUserdataHelper = new AppDataRollbackHelper(mInstaller);
// Kick off loading of the rollback data from strorage in a background
// thread.
@@ -424,6 +426,35 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
}
+ void onUnlockUser(int userId) {
+ getHandler().post(() -> {
+ final ArrayList<String> pendingBackupPackages = new ArrayList<>();
+ final Map<String, RestoreInfo> pendingRestorePackages = new HashMap<>();
+ final List<RollbackData> changed;
+ synchronized (mLock) {
+ ensureRollbackDataLoadedLocked();
+ changed = mUserdataHelper.computePendingBackupsAndRestores(userId,
+ pendingBackupPackages, pendingRestorePackages, mAvailableRollbacks,
+ mRecentlyExecutedRollbacks);
+ }
+
+ mUserdataHelper.commitPendingBackupAndRestoreForUser(userId,
+ pendingBackupPackages, pendingRestorePackages);
+
+ for (RollbackData rd : changed) {
+ try {
+ mRollbackStore.saveAvailableRollback(rd);
+ } catch (IOException ioe) {
+ Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe);
+ }
+ }
+
+ synchronized (mLock) {
+ mRollbackStore.saveRecentlyExecutedRollbacks(mRecentlyExecutedRollbacks);
+ }
+ });
+ }
+
/**
* Load rollback data from storage if it has not already been loaded.
* After calling this funciton, mAvailableRollbacks and
@@ -533,6 +564,20 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// 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);
}
@@ -701,27 +746,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
VersionedPackage installedVersion = new VersionedPackage(packageName,
installedPackage.getLongVersionCode());
- for (int user : installedUsers) {
- final int storageFlags;
- if (StorageManager.isFileEncryptedNativeOrEmulated()
- && !StorageManager.isUserKeyUnlocked(user)) {
- // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy
- // across app user data until the user unlocks their device.
- Log.e(TAG, "User: " + user + " isn't unlocked, skipping CE userdata backup.");
- storageFlags = Installer.FLAG_STORAGE_DE;
- } else {
- storageFlags = Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE;
- }
-
- try {
- mInstaller.snapshotAppData(packageName, user, storageFlags);
- } catch (InstallerException ie) {
- Log.e(TAG, "Unable to create app data snapshot for: " + packageName, ie);
- }
- }
- PackageRollbackInfo info = new PackageRollbackInfo(newVersion, installedVersion);
+ final IntArray pendingBackups = mUserdataHelper.snapshotAppData(packageName,
+ installedUsers);
+ PackageRollbackInfo info = new PackageRollbackInfo(newVersion, installedVersion,
+ pendingBackups, new ArrayList<>());
RollbackData data;
try {
synchronized (mLock) {
@@ -760,40 +790,24 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
getHandler().post(() -> {
- PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
final RollbackData rollbackData = getRollbackForPackage(packageName);
- if (rollbackData == null) {
- pmi.finishPackageInstall(token, false);
- return;
- }
-
- if (!rollbackData.inProgress) {
- Log.e(TAG, "Request to restore userData for: " + packageName
- + ", but no rollback in progress.");
- pmi.finishPackageInstall(token, false);
- return;
- }
-
- final int storageFlags;
- if (StorageManager.isFileEncryptedNativeOrEmulated()
- && !StorageManager.isUserKeyUnlocked(userId)) {
- // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy
- // across app user data until the user unlocks their device.
- Log.e(TAG, "User: " + userId + " isn't unlocked, skipping CE userdata restore.");
-
- storageFlags = Installer.FLAG_STORAGE_DE;
- } else {
- storageFlags = Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE;
- }
+ final boolean changedRollbackData = mUserdataHelper.restoreAppData(packageName,
+ rollbackData, userId, appId, ceDataInode, seInfo);
+ final PackageManagerInternal pmi = LocalServices.getService(
+ PackageManagerInternal.class);
+ pmi.finishPackageInstall(token, false);
- try {
- mInstaller.restoreAppDataSnapshot(packageName, appId, ceDataInode,
- seInfo, userId, storageFlags);
- } catch (InstallerException ie) {
- Log.e(TAG, "Unable to restore app data snapshot: " + packageName, ie);
+ // We've updated metadata about this rollback, so save it to flash.
+ if (changedRollbackData) {
+ try {
+ mRollbackStore.saveAvailableRollback(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);
+ }
}
-
- pmi.finishPackageInstall(token, false);
});
}
@@ -900,10 +914,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
ensureRollbackDataLoadedLocked();
for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
RollbackData data = mAvailableRollbacks.get(i);
- for (PackageRollbackInfo info : data.packages) {
- if (info.getPackageName().equals(packageName)) {
- return data;
- }
+ if (getPackageRollbackInfo(data, packageName) != null) {
+ return data;
}
}
}
@@ -926,6 +938,22 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
}
}
+
+ return null;
+ }
+
+ /**
+ * Returns the {@code PackageRollbackInfo} associated with {@code packageName} from
+ * a specified {@code RollbackData}.
+ */
+ static PackageRollbackInfo getPackageRollbackInfo(RollbackData data,
+ String packageName) {
+ for (PackageRollbackInfo info : data.packages) {
+ if (info.getPackageName().equals(packageName)) {
+ return info;
+ }
+ }
+
return null;
}
diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
index 28801038ebd1..b3cc6deb2810 100644
--- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
+++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
@@ -19,6 +19,7 @@ package com.android.server.rollback;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInstaller;
+import android.content.pm.VersionedPackage;
import android.content.rollback.PackageRollbackInfo;
import android.content.rollback.RollbackInfo;
import android.content.rollback.RollbackManager;
@@ -41,12 +42,10 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
private static final String TAG = "RollbackPackageHealthObserver";
private static final String NAME = "rollback-observer";
private Context mContext;
- private RollbackManager mRollbackManager;
private Handler mHandler;
RollbackPackageHealthObserver(Context context) {
mContext = context;
- mRollbackManager = mContext.getSystemService(RollbackManager.class);
HandlerThread handlerThread = new HandlerThread("RollbackPackageHealthObserver");
handlerThread.start();
mHandler = handlerThread.getThreadHandler();
@@ -54,8 +53,10 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
}
@Override
- public int onHealthCheckFailed(String packageName) {
- RollbackInfo rollback = getAvailableRollback(packageName);
+ public int onHealthCheckFailed(String packageName, long versionCode) {
+ RollbackInfo rollback =
+ getAvailableRollback(mContext.getSystemService(RollbackManager.class),
+ packageName, versionCode);
if (rollback == null) {
// Don't handle the notification, no rollbacks available for the package
return PackageHealthObserverImpact.USER_IMPACT_NONE;
@@ -65,8 +66,9 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
}
@Override
- public boolean execute(String packageName) {
- RollbackInfo rollback = getAvailableRollback(packageName);
+ public boolean execute(String packageName, long versionCode) {
+ RollbackManager rollbackManager = mContext.getSystemService(RollbackManager.class);
+ RollbackInfo rollback = getAvailableRollback(rollbackManager, packageName, versionCode);
if (rollback == null) {
// Expected a rollback to be available, what happened?
return false;
@@ -86,12 +88,9 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
});
// TODO(zezeozue): Log initiated metrics
- // TODO: Pass the package as a cause package instead of using
- // Collections.emptyList once the version of the failing package is
- // easily available.
mHandler.post(() ->
- mRollbackManager.commitRollback(rollback.getRollbackId(),
- Collections.emptyList(),
+ rollbackManager.commitRollback(rollback.getRollbackId(),
+ Collections.singletonList(new VersionedPackage(packageName, versionCode)),
rollbackReceiver.getIntentSender()));
// Assume rollback executed successfully
return true;
@@ -110,11 +109,13 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
PackageWatchdog.getInstance(mContext).startObservingHealth(this, packages, durationMs);
}
- private RollbackInfo getAvailableRollback(String packageName) {
- for (RollbackInfo rollback : mRollbackManager.getAvailableRollbacks()) {
+ private RollbackInfo getAvailableRollback(RollbackManager rollbackManager,
+ String packageName, long versionCode) {
+ for (RollbackInfo rollback : rollbackManager.getAvailableRollbacks()) {
for (PackageRollbackInfo packageRollback : rollback.getPackages()) {
- if (packageName.equals(packageRollback.getPackageName())) {
- // TODO(zezeozue): Only rollback if rollback version == failed package version
+ if (packageName.equals(packageRollback.getPackageName())
+ && packageRollback.getVersionRolledBackFrom().getVersionCode()
+ == versionCode) {
return rollback;
}
}
diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java
index 98ebb0943f43..c70f47dc5ed3 100644
--- a/services/core/java/com/android/server/rollback/RollbackStore.java
+++ b/services/core/java/com/android/server/rollback/RollbackStore.java
@@ -16,9 +16,12 @@
package com.android.server.rollback;
+import android.annotation.NonNull;
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.Log;
import libcore.io.IoUtils;
@@ -99,6 +102,64 @@ class RollbackStore {
}
/**
+ * Converts an {@code JSONArray} of integers to an {@code IntArray}.
+ */
+ private static @NonNull IntArray convertToIntArray(@NonNull JSONArray jsonArray)
+ throws JSONException {
+ if (jsonArray.length() == 0) {
+ return new IntArray();
+ }
+
+ final int[] ret = new int[jsonArray.length()];
+ for (int i = 0; i < ret.length; ++i) {
+ ret[i] = jsonArray.getInt(i);
+ }
+
+ return IntArray.wrap(ret);
+ }
+
+ /**
+ * Converts an {@code IntArray} into an {@code JSONArray} of integers.
+ */
+ private static @NonNull JSONArray convertToJsonArray(@NonNull IntArray intArray) {
+ JSONArray jsonArray = new JSONArray();
+ for (int i = 0; i < intArray.size(); ++i) {
+ jsonArray.put(intArray.get(i));
+ }
+
+ return jsonArray;
+ }
+
+ private static @NonNull JSONArray convertToJsonArray(@NonNull List<RestoreInfo> list)
+ throws JSONException {
+ JSONArray jsonArray = new JSONArray();
+ for (RestoreInfo ri : list) {
+ JSONObject jo = new JSONObject();
+ jo.put("userId", ri.userId);
+ jo.put("appId", ri.appId);
+ jo.put("seInfo", ri.seInfo);
+ jsonArray.put(jo);
+ }
+
+ return jsonArray;
+ }
+
+ private static @NonNull ArrayList<RestoreInfo> convertToRestoreInfoArray(
+ @NonNull JSONArray array) throws JSONException {
+ ArrayList<RestoreInfo> restoreInfos = new ArrayList<>();
+
+ for (int i = 0; i < array.length(); ++i) {
+ JSONObject jo = array.getJSONObject(i);
+ restoreInfos.add(new RestoreInfo(
+ jo.getInt("userId"),
+ jo.getInt("appId"),
+ jo.getString("seInfo")));
+ }
+
+ return restoreInfos;
+ }
+
+ /**
* Reads the list of recently executed rollbacks from persistent storage.
*/
List<RollbackInfo> loadRecentlyExecutedRollbacks() {
@@ -239,6 +300,12 @@ class RollbackStore {
JSONObject json = new JSONObject();
json.put("versionRolledBackFrom", toJson(info.getVersionRolledBackFrom()));
json.put("versionRolledBackTo", toJson(info.getVersionRolledBackTo()));
+
+ IntArray pendingBackups = info.getPendingBackups();
+ List<RestoreInfo> pendingRestores = info.getPendingRestores();
+ json.put("pendingBackups", convertToJsonArray(pendingBackups));
+ json.put("pendingRestores", convertToJsonArray(pendingRestores));
+
return json;
}
@@ -247,7 +314,14 @@ class RollbackStore {
json.getJSONObject("versionRolledBackFrom"));
VersionedPackage versionRolledBackTo = versionedPackageFromJson(
json.getJSONObject("versionRolledBackTo"));
- return new PackageRollbackInfo(versionRolledBackFrom, versionRolledBackTo);
+
+ final IntArray pendingBackups = convertToIntArray(
+ json.getJSONArray("pendingBackups"));
+ final ArrayList<RestoreInfo> pendingRestores = convertToRestoreInfoArray(
+ json.getJSONArray("pendingRestores"));
+
+ return new PackageRollbackInfo(versionRolledBackFrom, versionRolledBackTo,
+ pendingBackups, pendingRestores);
}
private JSONArray versionedPackagesToJson(List<VersionedPackage> packages)
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index c6d2870a24c9..2be78fe32f68 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -23,6 +23,7 @@ import static com.android.server.am.MemoryStatUtil.readCmdlineFromProcfs;
import static com.android.server.am.MemoryStatUtil.readMemoryStatFromProcfs;
import static com.android.server.am.MemoryStatUtil.readRssHighWaterMarkFromProcfs;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
@@ -83,6 +84,7 @@ import android.os.storage.StorageManager;
import android.telephony.ModemActivityInfo;
import android.telephony.TelephonyManager;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Log;
import android.util.Slog;
import android.util.StatsLog;
@@ -112,6 +114,7 @@ import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.SystemServiceManager;
import com.android.server.am.MemoryStatUtil.MemoryStat;
+import com.android.server.role.RoleManagerServiceInternal;
import com.android.server.storage.DiskStatsFileLogger;
import com.android.server.storage.DiskStatsLoggingService;
@@ -1781,6 +1784,60 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
}
/**
+ * Add a RoleHolder atom for each package that holds a role.
+ *
+ * @param elapsedNanos the time since boot
+ * @param wallClockNanos the time on the clock
+ * @param pulledData the data sink to write to
+ */
+ private void pullRoleHolders(long elapsedNanos, final long wallClockNanos,
+ @NonNull List<StatsLogEventWrapper> pulledData) {
+ long callingToken = Binder.clearCallingIdentity();
+ try {
+ PackageManager pm = mContext.getPackageManager();
+ RoleManagerServiceInternal rm =
+ LocalServices.getService(RoleManagerServiceInternal.class);
+
+ List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
+
+ int numUsers = users.size();
+ for (int userNum = 0; userNum < numUsers; userNum++) {
+ UserHandle user = users.get(userNum).getUserHandle();
+
+ ArrayMap<String, ArraySet<String>> roles = rm.getRoleHoldersAsUser(user);
+
+ int numRoles = roles.size();
+ for (int roleNum = 0; roleNum < numRoles; roleNum++) {
+ String roleName = roles.keyAt(roleNum);
+ ArraySet<String> holders = roles.valueAt(roleNum);
+
+ int numHolders = holders.size();
+ for (int holderNum = 0; holderNum < numHolders; holderNum++) {
+ String holderName = holders.valueAt(holderNum);
+
+ PackageInfo pkg;
+ try {
+ pkg = pm.getPackageInfoAsUser(holderName, 0, user.getIdentifier());
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "Role holder " + holderName + " not found");
+ return;
+ }
+
+ StatsLogEventWrapper e = new StatsLogEventWrapper(StatsLog.ROLE_HOLDER,
+ elapsedNanos, wallClockNanos);
+ e.writeInt(pkg.applicationInfo.uid);
+ e.writeString(holderName);
+ e.writeString(roleName);
+ pulledData.add(e);
+ }
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingToken);
+ }
+ }
+
+ /**
* Pulls various data.
*/
@Override // Binder call
@@ -1954,6 +2011,10 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
pullDebugFailingElapsedClock(tagId, elapsedNanos, wallClockNanos, ret);
break;
}
+ case StatsLog.ROLE_HOLDER: {
+ pullRoleHolders(elapsedNanos, wallClockNanos, ret);
+ break;
+ }
default:
Slog.w(TAG, "No such tagId data as " + tagId);
return null;
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index b0ef8a0d4209..071dde74f103 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -2243,12 +2243,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
synchronized (mLock) {
mInAmbientMode = inAmbientMode;
final WallpaperData data = mWallpaperMap.get(mCurrentUserId);
- final boolean hasConnection = data != null && data.connection != null;
- final WallpaperInfo info = hasConnection ? data.connection.mInfo : null;
-
// The wallpaper info is null for image wallpaper, also use the engine in this case.
- if (hasConnection && (info == null && isAodImageWallpaperEnabled()
- || info != null && info.supportsAmbientMode())) {
+ if (data != null && data.connection != null && (data.connection.mInfo == null
+ || data.connection.mInfo.supportsAmbientMode())) {
// TODO(multi-display) Extends this method with specific display.
engine = data.connection.getDisplayConnectorOrCreate(DEFAULT_DISPLAY).mEngine;
} else {
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index b23dcb33720f..16c44aa3220f 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -148,7 +148,6 @@ import android.util.EventLog;
import android.util.IntArray;
import android.util.Log;
import android.util.Slog;
-import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
@@ -377,8 +376,6 @@ class ActivityStack extends ConfigurationContainer {
/** Stores the override windowing-mode from before a transient mode change (eg. split) */
private int mRestoreOverrideWindowingMode = WINDOWING_MODE_UNDEFINED;
- private final SparseArray<Rect> mTmpBounds = new SparseArray<>();
- private final SparseArray<Rect> mTmpInsetBounds = new SparseArray<>();
private final Rect mTmpRect = new Rect();
private final Rect mTmpRect2 = new Rect();
private final Rect mTmpRect3 = new Rect();
@@ -4668,6 +4665,14 @@ class ActivityStack extends ConfigurationContainer {
removeHistoryRecordsForAppLocked(mStackSupervisor.mFinishingActivities, app,
"mFinishingActivities");
+ final boolean isProcessRemoved = app.isRemoved();
+ if (isProcessRemoved) {
+ // The package of the died process should be force-stopped, so make its activities as
+ // finishing to prevent the process from being started again if the next top (or being
+ // visible) activity also resides in the same process.
+ app.makeFinishingForProcessRemoved();
+ }
+
boolean hasVisibleActivities = false;
// Clean out the history list.
@@ -4720,7 +4725,7 @@ class ActivityStack extends ConfigurationContainer {
+ " stateNotNeeded=" + r.stateNotNeeded
+ " finishing=" + r.finishing
+ " state=" + r.getState() + " callers=" + Debug.getCallers(5));
- if (!r.finishing) {
+ if (!r.finishing || isProcessRemoved) {
Slog.w(TAG, "Force removing " + r + ": app died, no saved state");
EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
r.mUserId, System.identityHashCode(r),
@@ -4992,22 +4997,11 @@ class ActivityStack extends ConfigurationContainer {
// Update override configurations of all tasks in the stack.
final Rect taskBounds = tempTaskBounds != null ? tempTaskBounds : bounds;
- mTmpBounds.clear();
- mTmpInsetBounds.clear();
-
for (int i = mTaskHistory.size() - 1; i >= 0; i--) {
final TaskRecord task = mTaskHistory.get(i);
if (task.isResizeable()) {
task.updateOverrideConfiguration(taskBounds, tempTaskInsetBounds);
}
-
- if (task.hasDisplayedBounds()) {
- mTmpBounds.put(task.taskId, task.getDisplayedBounds());
- mTmpInsetBounds.put(task.taskId, task.getRequestedOverrideBounds());
- } else {
- mTmpBounds.put(task.taskId, task.getRequestedOverrideBounds());
- mTmpInsetBounds.put(task.taskId, null);
- }
}
setBounds(bounds);
@@ -5125,12 +5119,6 @@ class ActivityStack extends ConfigurationContainer {
}
didSomething = true;
Slog.i(TAG, " Force finishing activity " + r);
- if (sameComponent) {
- if (r.hasProcess()) {
- r.app.setRemoved(true);
- }
- r.app = null;
- }
lastTask = r.getTaskRecord();
finishActivityLocked(r, Activity.RESULT_CANCELED, null, "force-stop",
true);
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 95a6f71fc44b..d1cd1dbe18bc 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -926,6 +926,10 @@ class ActivityStarter {
if (callerApp != null && callerApp.hasForegroundActivities()) {
return false;
}
+ // don't abort if the callerApp is instrumenting with background activity starts privileges
+ if (callerApp != null && callerApp.isInstrumentingWithBackgroundActivityStartPrivileges()) {
+ return false;
+ }
// don't abort if the callingUid is in the foreground or is a persistent system process
final int callingUidProcState = mService.getUidStateLocked(callingUid);
final boolean callingUidHasAnyVisibleWindow =
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 5fabde45db55..09ef4b95e66b 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -349,6 +349,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
/* Global service lock used by the package the owns this service. */
final WindowManagerGlobalLock mGlobalLock = new WindowManagerGlobalLock();
+ /**
+ * It is the same instance as {@link mGlobalLock}, just declared as a type that the
+ * locked-region-code-injection does't recognize it. It is used to skip wrapping priority
+ * booster for places that are already in the scope of another booster (e.g. computing oom-adj).
+ *
+ * @see WindowManagerThreadPriorityBooster
+ */
+ final Object mGlobalLockWithoutBoost = mGlobalLock;
ActivityStackSupervisor mStackSupervisor;
RootActivityContainer mRootActivityContainer;
WindowManagerService mWindowManager;
@@ -6837,7 +6845,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override
public WindowProcessController getTopApp() {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
final ActivityRecord top = mRootActivityContainer.getTopResumedActivity();
return top != null ? top.app : null;
}
@@ -6845,7 +6853,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override
public void rankTaskLayersIfNeeded() {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
if (mRootActivityContainer != null) {
mRootActivityContainer.rankTaskLayersIfNeeded();
}
@@ -6889,28 +6897,28 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override
public void onUidActive(int uid, int procState) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
mActiveUids.put(uid, procState);
}
}
@Override
public void onUidInactive(int uid) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
mActiveUids.remove(uid);
}
}
@Override
public void onActiveUidsCleared() {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
mActiveUids.clear();
}
}
@Override
public void onUidProcStateChanged(int uid, int procState) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
if (mActiveUids.get(uid) != null) {
mActiveUids.put(uid, procState);
}
@@ -6919,14 +6927,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override
public void onUidAddedToPendingTempWhitelist(int uid, String tag) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
mPendingTempWhitelist.put(uid, tag);
}
}
@Override
public void onUidRemovedFromPendingTempWhitelist(int uid) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
mPendingTempWhitelist.remove(uid);
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 3426ba611c86..080f9651f86b 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -29,6 +29,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.INVALID_DISPLAY;
import static android.view.InsetsState.TYPE_IME;
import static android.view.Surface.ROTATION_0;
import static android.view.Surface.ROTATION_180;
@@ -43,6 +44,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
import static android.view.WindowManager.LayoutParams.NEEDS_MENU_SET_TRUE;
import static android.view.WindowManager.LayoutParams.NEEDS_MENU_UNSET;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
@@ -140,9 +142,11 @@ import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.Region.Op;
import android.hardware.display.DisplayManagerInternal;
+import android.os.Binder;
import android.os.Debug;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
@@ -157,6 +161,7 @@ import android.view.DisplayInfo;
import android.view.Gravity;
import android.view.InputChannel;
import android.view.InputDevice;
+import android.view.InputWindowHandle;
import android.view.InsetsState.InternalInsetType;
import android.view.MagnificationSpec;
import android.view.RemoteAnimationDefinition;
@@ -515,6 +520,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
private final InsetsStateController mInsetsStateController;
+ private SurfaceControl mParentSurfaceControl;
+ private InputWindowHandle mPortalWindowHandle;
+
// Last systemUiVisibility we received from status bar.
private int mLastStatusBarVisibility = 0;
// Last systemUiVisibility we dispatched to windows.
@@ -1657,35 +1665,42 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
final int len = devices != null ? devices.length : 0;
for (int i = 0; i < len; i++) {
InputDevice device = devices[i];
- if (!device.isVirtual()) {
- final int sources = device.getSources();
- final int presenceFlag = device.isExternal() ?
- WindowManagerPolicy.PRESENCE_EXTERNAL :
- WindowManagerPolicy.PRESENCE_INTERNAL;
-
- // TODO(multi-display): Configure on per-display basis.
- if (mWmService.mIsTouchDevice) {
- if ((sources & InputDevice.SOURCE_TOUCHSCREEN) ==
- InputDevice.SOURCE_TOUCHSCREEN) {
- config.touchscreen = Configuration.TOUCHSCREEN_FINGER;
- }
- } else {
- config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;
- }
+ // Ignore virtual input device.
+ if (device.isVirtual()) {
+ continue;
+ }
- if ((sources & InputDevice.SOURCE_TRACKBALL) == InputDevice.SOURCE_TRACKBALL) {
- config.navigation = Configuration.NAVIGATION_TRACKBALL;
- navigationPresence |= presenceFlag;
- } else if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD
- && config.navigation == Configuration.NAVIGATION_NONAV) {
- config.navigation = Configuration.NAVIGATION_DPAD;
- navigationPresence |= presenceFlag;
- }
+ // Check if input device can dispatch events to current display.
+ // If display type is virtual, will follow the default display.
+ if (!mWmService.mInputManager.canDispatchToDisplay(device.getId(),
+ displayInfo.type == Display.TYPE_VIRTUAL ? DEFAULT_DISPLAY : mDisplayId)) {
+ continue;
+ }
- if (device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
- config.keyboard = Configuration.KEYBOARD_QWERTY;
- keyboardPresence |= presenceFlag;
+ final int sources = device.getSources();
+ final int presenceFlag = device.isExternal()
+ ? WindowManagerPolicy.PRESENCE_EXTERNAL : WindowManagerPolicy.PRESENCE_INTERNAL;
+
+ if (mWmService.mIsTouchDevice) {
+ if ((sources & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) {
+ config.touchscreen = Configuration.TOUCHSCREEN_FINGER;
}
+ } else {
+ config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;
+ }
+
+ if ((sources & InputDevice.SOURCE_TRACKBALL) == InputDevice.SOURCE_TRACKBALL) {
+ config.navigation = Configuration.NAVIGATION_TRACKBALL;
+ navigationPresence |= presenceFlag;
+ } else if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD
+ && config.navigation == Configuration.NAVIGATION_NONAV) {
+ config.navigation = Configuration.NAVIGATION_DPAD;
+ navigationPresence |= presenceFlag;
+ }
+
+ if (device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
+ config.keyboard = Configuration.KEYBOARD_QWERTY;
+ keyboardPresence |= presenceFlag;
}
}
@@ -2410,10 +2425,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
win.getTouchableRegion(mTmpRegion);
mTouchExcludeRegion.op(mTmpRegion, Region.Op.UNION);
}
- for (int i = mTapExcludeProvidingWindows.size() - 1; i >= 0; i--) {
- final WindowState win = mTapExcludeProvidingWindows.valueAt(i);
- win.amendTapExcludeRegion(mTouchExcludeRegion);
- }
+ amendWindowTapExcludeRegion(mTouchExcludeRegion);
// TODO(multi-display): Support docked stacks on secondary displays.
if (mDisplayId == DEFAULT_DISPLAY && getSplitScreenPrimaryStack() != null) {
mDividerControllerLocked.getTouchRegion(mTmpRect);
@@ -2425,6 +2437,18 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
}
}
+ /**
+ * Union the region with all the tap exclude region provided by windows on this display.
+ *
+ * @param inOutRegion The region to be amended.
+ */
+ void amendWindowTapExcludeRegion(Region inOutRegion) {
+ for (int i = mTapExcludeProvidingWindows.size() - 1; i >= 0; i--) {
+ final WindowState win = mTapExcludeProvidingWindows.valueAt(i);
+ win.amendTapExcludeRegion(inOutRegion);
+ }
+ }
+
@Override
void switchUser() {
super.switchUser();
@@ -3586,6 +3610,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
private void updateBounds() {
calculateBounds(mDisplayInfo, mTmpBounds);
setBounds(mTmpBounds);
+ if (mPortalWindowHandle != null && mParentSurfaceControl != null) {
+ mPortalWindowHandle.touchableRegion.getBounds(mTmpRect);
+ if (!mTmpBounds.equals(mTmpRect)) {
+ mPortalWindowHandle.touchableRegion.set(mTmpBounds);
+ mPendingTransaction.setInputWindowInfo(mParentSurfaceControl, mPortalWindowHandle);
+ }
+ }
}
// Determines the current display bounds based on the current state
@@ -4830,15 +4861,43 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
|| mWmService.mForceDesktopModeOnExternalDisplays;
}
- /**
+ /**
* Re-parent the DisplayContent's top surfaces, {@link #mWindowingLayer} and
* {@link #mOverlayLayer} to the specified surfaceControl.
*
- * @param surfaceControlHandle The new SurfaceControl, where the DisplayContent's
- * surfaces will be re-parented to.
+ * @param sc The new SurfaceControl, where the DisplayContent's surfaces will be re-parented to.
*/
void reparentDisplayContent(SurfaceControl sc) {
- mPendingTransaction.reparent(mWindowingLayer, sc)
- .reparent(mOverlayLayer, sc);
+ mParentSurfaceControl = sc;
+ if (mPortalWindowHandle == null) {
+ mPortalWindowHandle = createPortalWindowHandle(sc.toString());
+ }
+ mPendingTransaction.setInputWindowInfo(sc, mPortalWindowHandle)
+ .reparent(mWindowingLayer, sc).reparent(mOverlayLayer, sc);
+ }
+
+ /**
+ * Create a portal window handle for input. This window transports any touch to the display
+ * indicated by {@link InputWindowHandle#portalToDisplayId} if the touch hits this window.
+ *
+ * @param name The name of the portal window handle.
+ * @return the new portal window handle.
+ */
+ private InputWindowHandle createPortalWindowHandle(String name) {
+ // Let surface flinger to set the display ID of this input window handle because we don't
+ // know which display the parent surface control is on.
+ final InputWindowHandle portalWindowHandle = new InputWindowHandle(
+ null /* inputApplicationHandle */, null /* clientWindow */, INVALID_DISPLAY);
+ portalWindowHandle.name = name;
+ portalWindowHandle.token = new Binder();
+ portalWindowHandle.layoutParamsFlags =
+ FLAG_SPLIT_TOUCH | FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL;
+ getBounds(mTmpBounds);
+ portalWindowHandle.touchableRegion.set(mTmpBounds);
+ portalWindowHandle.scaleFactor = 1f;
+ portalWindowHandle.ownerPid = Process.myPid();
+ portalWindowHandle.ownerUid = Process.myUid();
+ portalWindowHandle.portalToDisplayId = mDisplayId;
+ return portalWindowHandle;
}
}
diff --git a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java
index cbc936f2f1d7..0a4ab67f033d 100644
--- a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java
+++ b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java
@@ -49,7 +49,9 @@ class TapExcludeRegionHolder {
void amendRegion(Region region, Rect boundingRegion) {
for (int i = mTapExcludeRects.size() - 1; i>= 0 ; --i) {
final Rect rect = mTapExcludeRects.valueAt(i);
- rect.intersect(boundingRegion);
+ if (boundingRegion != null) {
+ rect.intersect(boundingRegion);
+ }
region.union(rect);
}
}
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index c88b0e50218a..59549e02db8f 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -66,7 +66,6 @@ import android.os.RemoteException;
import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Slog;
-import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
@@ -186,33 +185,6 @@ public class TaskStack extends WindowContainer<Task> implements
return mChildren.get(mChildren.size() - 1);
}
- /**
- * Set the bounds of the stack and its containing tasks.
- * @param stackBounds New stack bounds. Passing in null sets the bounds to fullscreen.
- * @param taskBounds Bounds for individual tasks, keyed by task id.
- * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id.
- * @return True if the stack bounds was changed.
- * */
- boolean setBounds(
- Rect stackBounds, SparseArray<Rect> taskBounds, SparseArray<Rect> taskTempInsetBounds) {
- setBounds(stackBounds);
-
- // Update bounds of containing tasks.
- for (int taskNdx = mChildren.size() - 1; taskNdx >= 0; --taskNdx) {
- final Task task = mChildren.get(taskNdx);
- final Rect insetBounds =
- taskTempInsetBounds != null ? taskTempInsetBounds.get(task.mTaskId) : null;
- if (insetBounds != null) {
- task.setBounds(insetBounds);
- task.setOverrideDisplayedBounds(taskBounds.get(task.mTaskId));
- } else {
- task.setBounds(taskBounds.get(task.mTaskId));
- task.setOverrideDisplayedBounds(null);
- }
- }
- return true;
- }
-
void prepareFreezingTaskBounds() {
for (int taskNdx = mChildren.size() - 1; taskNdx >= 0; --taskNdx) {
final Task task = mChildren.get(taskNdx);
@@ -799,23 +771,6 @@ public class TaskStack extends WindowContainer<Task> implements
}
/**
- * Re-sizes a stack and its containing tasks.
- *
- * @param bounds New stack bounds. Passing in null sets the bounds to fullscreen.
- * @param taskBounds Bounds for tasks in the resized stack, keyed by task id.
- * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id.
- */
- void resize(Rect bounds, SparseArray<Rect> taskBounds,
- SparseArray<Rect> taskTempInsetBounds) {
- // We might trigger a configuration change. Save the current task bounds for freezing.
- prepareFreezingTaskBounds();
- if (setBounds(bounds, taskBounds, taskTempInsetBounds) && isVisible()) {
- getDisplayContent().setLayoutNeeded();
- mWmService.mWindowPlacerLocked.performSurfacePlacement();
- }
- }
-
- /**
* Calculate an amount by which to expand the stack bounds in each direction.
* Used to make room for shadows in the pinned windowing mode.
*/
diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
index 2e5df45f9080..dd94af657039 100644
--- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
+++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
@@ -70,6 +70,18 @@ public class TaskTapPointerEventListener implements PointerEventListener {
// method target window will lose the focus.
return;
}
+ final Region windowTapExcludeRegion = Region.obtain();
+ mDisplayContent.amendWindowTapExcludeRegion(windowTapExcludeRegion);
+ if (windowTapExcludeRegion.contains(x, y)) {
+ windowTapExcludeRegion.recycle();
+ // The user is tapping on the window tap exclude region. We don't move this
+ // display to top. A window tap exclude region, for example, may be set by an
+ // ActivityView, and the region would match the bounds of both the ActivityView
+ // and the virtual display in it. In this case, we would take the tap that is on
+ // the embedded virtual display instead of this display.
+ return;
+ }
+ windowTapExcludeRegion.recycle();
WindowContainer parent = mDisplayContent.getParent();
if (parent != null && parent.getTopChild() != mDisplayContent) {
parent.positionChildAt(WindowContainer.POSITION_TOP, mDisplayContent,
@@ -81,9 +93,6 @@ public class TaskTapPointerEventListener implements PointerEventListener {
@Override
public void onPointerEvent(MotionEvent motionEvent) {
- if (motionEvent.getDisplayId() != getDisplayId()) {
- return;
- }
switch (motionEvent.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
final int x = (int) motionEvent.getX();
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 752c24e7edb6..975e62a44b0a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -6532,8 +6532,13 @@ public class WindowManagerService extends IWindowManager.Stub
/**
* Update a tap exclude region with a rectangular area in the window identified by the provided
- * id. Touches on this region will not switch focus to this window. Passing an empty rect will
- * remove the area from the exclude region of this window.
+ * id. Touches down on this region will not:
+ * <ol>
+ * <li>Switch focus to this window.</li>
+ * <li>Move the display of this window to top.</li>
+ * <li>Send the touch events to this window.</li>
+ * </ol>
+ * Passing an empty rect will remove the area from the exclude region of this window.
*/
void updateTapExcludeRegion(IWindow client, int regionId, int left, int top, int width,
int height) {
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 07f26b4c70bb..8da39b60150a 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -138,6 +138,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
private volatile boolean mDebugging;
// Active instrumentation running in process?
private volatile boolean mInstrumenting;
+ // Active instrumentation with background activity starts privilege running in process?
+ private volatile boolean mInstrumentingWithBackgroundActivityStartPrivileges;
// This process it perceptible by the user.
private volatile boolean mPerceptible;
// Set to true when process was launched with a wrapper attached
@@ -370,6 +372,23 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
return mInstrumenting;
}
+ /**
+ * {@see isInstrumentingWithBackgroundActivityStartPrivileges}
+ */
+ public void setInstrumentingWithBackgroundActivityStartPrivileges(
+ boolean instrumentingWithBackgroundActivityStartPrivileges) {
+ mInstrumentingWithBackgroundActivityStartPrivileges =
+ instrumentingWithBackgroundActivityStartPrivileges;
+ }
+
+ /**
+ * @return true if the instrumentation was started by a holder of
+ * START_ACTIVITIES_FROM_BACKGROUND permission
+ */
+ boolean isInstrumentingWithBackgroundActivityStartPrivileges() {
+ return mInstrumentingWithBackgroundActivityStartPrivileges;
+ }
+
public void setPerceptible(boolean perceptible) {
mPerceptible = perceptible;
}
@@ -394,13 +413,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
public void addPackage(String packageName) {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
mPkgList.add(packageName);
}
}
public void clearPackageList() {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
mPkgList.clear();
}
}
@@ -416,20 +435,24 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
mActivities.remove(r);
}
- public void clearActivities() {
- synchronized (mAtm.mGlobalLock) {
- mActivities.clear();
+ void makeFinishingForProcessRemoved() {
+ for (int i = mActivities.size() - 1; i >= 0; --i) {
+ mActivities.get(i).makeFinishingLocked();
}
}
+ void clearActivities() {
+ mActivities.clear();
+ }
+
public boolean hasActivities() {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
return !mActivities.isEmpty();
}
}
public boolean hasVisibleActivities() {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
for (int i = mActivities.size() - 1; i >= 0; --i) {
final ActivityRecord r = mActivities.get(i);
if (r.visible) {
@@ -441,7 +464,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
public boolean hasActivitiesOrRecentTasks() {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
return !mActivities.isEmpty() || !mRecentTasks.isEmpty();
}
}
@@ -456,15 +479,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
}
- public void finishActivities() {
- synchronized (mAtm.mGlobalLock) {
- ArrayList<ActivityRecord> activities = new ArrayList<>(mActivities);
- for (int i = 0; i < activities.size(); i++) {
- final ActivityRecord r = activities.get(i);
- if (!r.finishing && r.isInStackLocked()) {
- r.getActivityStack().finishActivityLocked(r, Activity.RESULT_CANCELED,
- null, "finish-heavy", true);
- }
+ void finishActivities() {
+ ArrayList<ActivityRecord> activities = new ArrayList<>(mActivities);
+ for (int i = 0; i < activities.size(); i++) {
+ final ActivityRecord r = activities.get(i);
+ if (!r.finishing && r.isInStackLocked()) {
+ r.getActivityStack().finishActivityLocked(r, Activity.RESULT_CANCELED,
+ null, "finish-heavy", true);
}
}
}
@@ -525,15 +546,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
- public void updateIntentForHeavyWeightActivity(Intent intent) {
- synchronized (mAtm.mGlobalLock) {
- if (mActivities.isEmpty()) {
- return;
- }
- ActivityRecord hist = mActivities.get(0);
- intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, hist.packageName);
- intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, hist.getTaskRecord().taskId);
+ void updateIntentForHeavyWeightActivity(Intent intent) {
+ if (mActivities.isEmpty()) {
+ return;
}
+ ActivityRecord hist = mActivities.get(0);
+ intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, hist.packageName);
+ intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, hist.getTaskRecord().taskId);
}
boolean shouldKillProcessForRemovedTask(TaskRecord tr) {
@@ -603,7 +622,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
public int computeOomAdjFromActivities(int minTaskLayer, ComputeOomAdjCallback callback) {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
final int activitiesSize = mActivities.size();
for (int j = 0; j < activitiesSize; j++) {
final ActivityRecord r = mActivities.get(j);
@@ -693,12 +712,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
mAtm.mH.sendMessage(m);
}
- void setRemoved(boolean removed) {
- if (mListener == null) return;
- // Posting on handler so WM lock isn't held when we call into AM.
- final Message m = PooledLambda.obtainMessage(
- WindowProcessListener::setRemoved, mListener, removed);
- mAtm.mH.sendMessage(m);
+ boolean isRemoved() {
+ return mListener == null ? false : mListener.isRemoved();
}
void clearWaitingToKill() {
@@ -840,18 +855,16 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
public boolean hasRecentTasks() {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
return !mRecentTasks.isEmpty();
}
}
- public void clearRecentTasks() {
- synchronized (mAtm.mGlobalLock) {
- for (int i = mRecentTasks.size() - 1; i >= 0; i--) {
- mRecentTasks.get(i).clearRootProcess();
- }
- mRecentTasks.clear();
+ void clearRecentTasks() {
+ for (int i = mRecentTasks.size() - 1; i >= 0; i--) {
+ mRecentTasks.get(i).clearRootProcess();
}
+ mRecentTasks.clear();
}
public void appEarlyNotResponding(String annotation, Runnable killAppCallback) {
@@ -905,19 +918,19 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
public void onTopProcChanged() {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
mAtm.mVrController.onTopProcChangedLocked(this);
}
}
public boolean isHomeProcess() {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
return this == mAtm.mHomeProcess;
}
}
public boolean isPreviousProcess() {
- synchronized (mAtm.mGlobalLock) {
+ synchronized (mAtm.mGlobalLockWithoutBoost) {
return this == mAtm.mPreviousProcess;
}
}
diff --git a/services/core/java/com/android/server/wm/WindowProcessListener.java b/services/core/java/com/android/server/wm/WindowProcessListener.java
index bce5e2dfeb44..d732e4e8f341 100644
--- a/services/core/java/com/android/server/wm/WindowProcessListener.java
+++ b/services/core/java/com/android/server/wm/WindowProcessListener.java
@@ -44,8 +44,11 @@ public interface WindowProcessListener {
void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru,
boolean activityChange, boolean updateOomAdj);
- /** Set process package been removed from device. */
- void setRemoved(boolean removed);
+ /**
+ * Returns true if the process is removed and we should completely clean up the related records
+ * belonging to this process.
+ */
+ boolean isRemoved();
/** Returns the total time (in milliseconds) spent executing in both user and system code. */
long getCpuTime();
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 4f120100693a..62e7200ef112 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -536,7 +536,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
private final Point mSurfacePosition = new Point();
/**
- * A region inside of this window to be excluded from touch-related focus switches.
+ * A region inside of this window to be excluded from touch.
*/
private TapExcludeRegionHolder mTapExcludeRegionHolder;
@@ -2168,6 +2168,24 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
region.set(mTmpRect);
cropRegionToStackBoundsIfNeeded(region);
+ subtractTouchExcludeRegionIfNeeded(region);
+ } else if (modal && mTapExcludeRegionHolder != null) {
+ final Region touchExcludeRegion = Region.obtain();
+ amendTapExcludeRegion(touchExcludeRegion);
+ if (!touchExcludeRegion.isEmpty()) {
+ // Remove touch modal because there are some areas that cannot be touched.
+ flags |= FLAG_NOT_TOUCH_MODAL;
+ // Give it a large touchable region at first because it was touch modal. The window
+ // might be moved on the display, so the touchable region should be large enough to
+ // ensure it covers the whole display, no matter where it is moved.
+ getDisplayContent().getBounds(mTmpRect);
+ final int dw = mTmpRect.width();
+ final int dh = mTmpRect.height();
+ region.set(-dw, -dh, dw + dw, dh + dh);
+ // Subtract the area that cannot be touched.
+ region.op(touchExcludeRegion, Region.Op.DIFFERENCE);
+ }
+ touchExcludeRegion.recycle();
} else {
// Not modal or full screen modal
getTouchableRegion(region);
@@ -2837,6 +2855,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
}
cropRegionToStackBoundsIfNeeded(outRegion);
+ subtractTouchExcludeRegionIfNeeded(outRegion);
}
private void cropRegionToStackBoundsIfNeeded(Region region) {
@@ -2855,6 +2874,22 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
/**
+ * If this window has areas that cannot be touched, we subtract those areas from its touchable
+ * region.
+ */
+ private void subtractTouchExcludeRegionIfNeeded(Region touchableRegion) {
+ if (mTapExcludeRegionHolder == null) {
+ return;
+ }
+ final Region touchExcludeRegion = Region.obtain();
+ amendTapExcludeRegion(touchExcludeRegion);
+ if (!touchExcludeRegion.isEmpty()) {
+ touchableRegion.op(touchExcludeRegion, Region.Op.DIFFERENCE);
+ }
+ touchExcludeRegion.recycle();
+ }
+
+ /**
* Report a focus change. Must be called with no locks held, and consistently
* from the same serialized thread (such as dispatched from a handler).
*/
@@ -4728,11 +4763,25 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mTapExcludeRegionHolder.updateRegion(regionId, left, top, width, height);
// Trigger touch exclude region update on current display.
currentDisplay.updateTouchExcludeRegion();
+ // Trigger touchable region update for this window.
+ currentDisplay.getInputMonitor().updateInputWindowsLw(true /* force */);
}
- /** Union the region with current tap exclude region that this window provides. */
+ /**
+ * Union the region with current tap exclude region that this window provides.
+ *
+ * @param region The region to be amended. It is on the screen coordinates.
+ */
void amendTapExcludeRegion(Region region) {
- mTapExcludeRegionHolder.amendRegion(region, getBounds());
+ final Region tempRegion = Region.obtain();
+ mTmpRect.set(mWindowFrames.mFrame);
+ mTmpRect.offsetTo(0, 0);
+ mTapExcludeRegionHolder.amendRegion(tempRegion, mTmpRect);
+ // The region held by the holder is on the window coordinates. We need to translate it to
+ // the screen coordinates.
+ tempRegion.translate(mWindowFrames.mFrame.left, mWindowFrames.mFrame.top);
+ region.op(tempRegion, Region.Op.UNION);
+ tempRegion.recycle();
}
@Override
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index ff0b0d6f6eaf..33317b554988 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -1652,6 +1652,13 @@ static void nativeSetCustomPointerIcon(JNIEnv* env, jclass /* clazz */,
im->setCustomPointerIcon(spriteIcon);
}
+static jboolean nativeCanDispatchToDisplay(JNIEnv* env, jclass /* clazz */, jlong ptr,
+ jint deviceId, jint displayId) {
+
+ NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
+ return im->getInputManager()->getReader()->canDispatchToDisplay(deviceId, displayId);
+}
+
// ----------------------------------------------------------------------------
static const JNINativeMethod gInputManagerMethods[] = {
@@ -1726,6 +1733,8 @@ static const JNINativeMethod gInputManagerMethods[] = {
(void*) nativeReloadPointerIcons },
{ "nativeSetCustomPointerIcon", "(JLandroid/view/PointerIcon;)V",
(void*) nativeSetCustomPointerIcon },
+ { "nativeCanDispatchToDisplay", "(JII)Z",
+ (void*) nativeCanDispatchToDisplay },
};
#define FIND_CLASS(var, className) \
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index f3c19d099851..cbc3791264bf 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -73,6 +73,8 @@ static jmethodID method_reportGnssServiceDied;
static jmethodID method_correctionsGetLatitudeDegrees;
static jmethodID method_correctionsGetLongitudeDegrees;
static jmethodID method_correctionsGetAltitudeMeters;
+static jmethodID method_correctionsGetHorPosUncMeters;
+static jmethodID method_correctionsGetVerPosUncMeters;
static jmethodID method_correctionsGetToaGpsNanosecondsOfWeek;
static jmethodID method_correctionsGetSingleSatCorrectionList;
static jmethodID method_listSize;
@@ -2233,6 +2235,12 @@ static jboolean android_location_GnssMeasurementsProvider_inject_gnss_measuremen
method_correctionsGetAltitudeMeters = env->GetMethodID(
measCorrClass, "getAltitudeMeters", "()D");
+ method_correctionsGetHorPosUncMeters = env->GetMethodID(
+ measCorrClass, "getHorizontalPositionUncertaintyMeters", "()D");
+
+ method_correctionsGetVerPosUncMeters = env->GetMethodID(
+ measCorrClass, "getVerticalPositionUncertaintyMeters", "()D");
+
method_correctionsGetToaGpsNanosecondsOfWeek = env->GetMethodID(
measCorrClass, "getToaGpsNanosecondsOfWeek", "()J");
@@ -2246,6 +2254,10 @@ static jboolean android_location_GnssMeasurementsProvider_inject_gnss_measuremen
correctionsObj, method_correctionsGetLongitudeDegrees);
jdouble altitudeDegreesCorr = env->CallDoubleMethod(
correctionsObj, method_correctionsGetAltitudeMeters);
+ jdouble horizontalPositionUncertaintyMeters = env->CallDoubleMethod(
+ correctionsObj, method_correctionsGetHorPosUncMeters);
+ jdouble verticalPositionUncertaintyMeters = env->CallDoubleMethod(
+ correctionsObj, method_correctionsGetVerPosUncMeters);
jlong toaGpsNanosOfWeek = env->CallLongMethod(
correctionsObj, method_correctionsGetToaGpsNanosecondsOfWeek);
jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj,
@@ -2348,6 +2360,8 @@ static jboolean android_location_GnssMeasurementsProvider_inject_gnss_measuremen
.latitudeDegrees = latitudeDegreesCorr,
.longitudeDegrees = longitudeDegreesCorr,
.altitudeMeters = altitudeDegreesCorr,
+ .horizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters,
+ .verticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters,
.toaGpsNanosecondsOfWeek = static_cast<uint64_t>(toaGpsNanosOfWeek),
.satCorrections = list,
};
diff --git a/services/core/jni/com_android_server_security_VerityUtils.cpp b/services/core/jni/com_android_server_security_VerityUtils.cpp
index 0d888dc41719..988d75cfb984 100644
--- a/services/core/jni/com_android_server_security_VerityUtils.cpp
+++ b/services/core/jni/com_android_server_security_VerityUtils.cpp
@@ -32,9 +32,67 @@
// TODO(112037636): Always include once fsverity.h is upstreamed.
#if __has_include(<linux/fsverity.h>)
#include <linux/fsverity.h>
-const int kSha256Bytes = 32;
+#else
+
+// Before fs-verity is upstreamed, use the current snapshot for development.
+// https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git/tree/include/uapi/linux/fsverity.h?h=fsverity
+
+#include <linux/limits.h>
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+struct fsverity_digest {
+ __u16 digest_algorithm;
+ __u16 digest_size; /* input/output */
+ __u8 digest[];
+};
+
+#define FS_IOC_ENABLE_VERITY _IO('f', 133)
+#define FS_IOC_MEASURE_VERITY _IOWR('f', 134, struct fsverity_digest)
+
+#define FS_VERITY_MAGIC "FSVerity"
+
+#define FS_VERITY_ALG_SHA256 1
+
+struct fsverity_descriptor {
+ __u8 magic[8]; /* must be FS_VERITY_MAGIC */
+ __u8 major_version; /* must be 1 */
+ __u8 minor_version; /* must be 0 */
+ __u8 log_data_blocksize;/* log2(data-bytes-per-hash), e.g. 12 for 4KB */
+ __u8 log_tree_blocksize;/* log2(tree-bytes-per-hash), e.g. 12 for 4KB */
+ __le16 data_algorithm; /* hash algorithm for data blocks */
+ __le16 tree_algorithm; /* hash algorithm for tree blocks */
+ __le32 flags; /* flags */
+ __le32 __reserved1; /* must be 0 */
+ __le64 orig_file_size; /* size of the original file data */
+ __le16 auth_ext_count; /* number of authenticated extensions */
+ __u8 __reserved2[30]; /* must be 0 */
+};
+
+#define FS_VERITY_EXT_ROOT_HASH 1
+#define FS_VERITY_EXT_PKCS7_SIGNATURE 3
+
+struct fsverity_extension {
+ __le32 length;
+ __le16 type; /* Type of this extension (see codes above) */
+ __le16 __reserved; /* Reserved, must be 0 */
+};
+
+struct fsverity_digest_disk {
+ __le16 digest_algorithm;
+ __le16 digest_size;
+ __u8 digest[];
+};
+
+struct fsverity_footer {
+ __le32 desc_reverse_offset; /* distance to fsverity_descriptor */
+ __u8 magic[8]; /* FS_VERITY_MAGIC */
+} __packed;
+
#endif
+const int kSha256Bytes = 32;
+
namespace android {
namespace {
@@ -73,7 +131,6 @@ class JavaByteArrayHolder {
};
int enableFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) {
-#if __has_include(<linux/fsverity.h>)
const char* path = env->GetStringUTFChars(filePath, nullptr);
::android::base::unique_fd rfd(open(path, O_RDONLY | O_CLOEXEC));
if (rfd.get() < 0) {
@@ -83,14 +140,9 @@ int enableFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) {
return errno;
}
return 0;
-#else
- LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
- return ENOSYS;
-#endif
}
int measureFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) {
-#if __has_include(<linux/fsverity.h>)
auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_digest) + kSha256Bytes);
fsverity_digest* data = reinterpret_cast<fsverity_digest*>(raii->getRaw());
data->digest_size = kSha256Bytes; // the only input/output parameter
@@ -104,14 +156,9 @@ int measureFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) {
return errno;
}
return 0;
-#else
- LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
- return ENOSYS;
-#endif
}
jbyteArray constructFsveritySignedData(JNIEnv* env, jobject /* clazz */, jbyteArray digest) {
-#if __has_include(<linux/fsverity.h>)
auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_digest_disk) + kSha256Bytes);
fsverity_digest_disk* data = reinterpret_cast<fsverity_digest_disk*>(raii->getRaw());
@@ -126,15 +173,10 @@ jbyteArray constructFsveritySignedData(JNIEnv* env, jobject /* clazz */, jbyteAr
memcpy(data->digest, src, kSha256Bytes);
return raii->release();
-#else
- LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
- return 0;
-#endif
}
jbyteArray constructFsverityDescriptor(JNIEnv* env, jobject /* clazz */, jlong fileSize) {
-#if __has_include(<linux/fsverity.h>)
auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_descriptor));
fsverity_descriptor* desc = reinterpret_cast<fsverity_descriptor*>(raii->getRaw());
@@ -150,15 +192,10 @@ jbyteArray constructFsverityDescriptor(JNIEnv* env, jobject /* clazz */, jlong f
desc->auth_ext_count = 1;
return raii->release();
-#else
- LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
- return 0;
-#endif
}
jbyteArray constructFsverityExtension(JNIEnv* env, jobject /* clazz */, jshort extensionId,
jint extensionDataSize) {
-#if __has_include(<linux/fsverity.h>)
auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_extension));
fsverity_extension* ext = reinterpret_cast<fsverity_extension*>(raii->getRaw());
@@ -166,15 +203,10 @@ jbyteArray constructFsverityExtension(JNIEnv* env, jobject /* clazz */, jshort e
ext->type = extensionId;
return raii->release();
-#else
- LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
- return 0;
-#endif
}
jbyteArray constructFsverityFooter(JNIEnv* env, jobject /* clazz */,
jint offsetToDescriptorHead) {
-#if __has_include(<linux/fsverity.h>)
auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_footer));
fsverity_footer* footer = reinterpret_cast<fsverity_footer*>(raii->getRaw());
@@ -182,10 +214,6 @@ jbyteArray constructFsverityFooter(JNIEnv* env, jobject /* clazz */,
memcpy(footer->magic, FS_VERITY_MAGIC, sizeof(footer->magic));
return raii->release();
-#else
- LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
- return 0;
-#endif
}
const JNINativeMethod sMethods[] = {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 51bdbb38d582..a01a02625de2 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -74,20 +74,14 @@ import static android.app.admin.DevicePolicyManager.WIPE_SILENTLY;
import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
import static android.provider.Settings.Global.PRIVATE_DNS_MODE;
import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
-
import static android.provider.Telephony.Carriers.DPC_URI;
import static android.provider.Telephony.Carriers.ENFORCE_KEY;
import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent
- .PROVISIONING_ENTRY_POINT_ADB;
-import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker
- .STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
-
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PROVISIONING_ENTRY_POINT_ADB;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_DEVICE_OWNER;
import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_PROFILE_OWNER;
-
-
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
@@ -240,11 +234,11 @@ import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
import com.android.internal.util.JournaledFile;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.StatLogger;
import com.android.internal.util.XmlUtils;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.LocalServices;
import com.android.server.LockGuard;
-import com.android.internal.util.StatLogger;
import com.android.server.SystemServerInitThreadPool;
import com.android.server.SystemService;
import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo;
@@ -7716,18 +7710,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
// Shutting down backup manager service permanently.
- long ident = mInjector.binderClearCallingIdentity();
- try {
- if (mInjector.getIBackupManager() != null) {
- mInjector.getIBackupManager()
- .setBackupServiceActive(UserHandle.USER_SYSTEM, false);
- }
- } catch (RemoteException e) {
- throw new IllegalStateException("Failed deactivating backup service.", e);
- } finally {
- mInjector.binderRestoreCallingIdentity(ident);
- }
-
+ toggleBackupServiceActive(UserHandle.USER_SYSTEM, /* makeActive= */ false);
if (isAdb()) {
// Log device owner provisioning was started using adb.
MetricsLogger.action(mContext, PROVISIONING_ENTRY_POINT_ADB, LOG_TAG_DEVICE_OWNER);
@@ -7755,7 +7738,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
saveUserRestrictionsLocked(userId);
}
- ident = mInjector.binderClearCallingIdentity();
+ long ident = mInjector.binderClearCallingIdentity();
try {
// TODO Send to system too?
sendOwnerChangedBroadcast(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED, userId);
@@ -8012,6 +7995,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
.write();
}
+ // Shutting down backup manager service permanently.
+ toggleBackupServiceActive(userHandle, /* makeActive= */ false);
+
mOwners.setProfileOwner(who, ownerName, userHandle);
mOwners.writeProfileOwner(userHandle);
Slog.i(LOG_TAG, "Profile owner set: " + who + " on user " + userHandle);
@@ -8035,6 +8021,22 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
}
+
+ private void toggleBackupServiceActive(int userId, boolean makeActive) {
+ long ident = mInjector.binderClearCallingIdentity();
+ try {
+ if (mInjector.getIBackupManager() != null) {
+ mInjector.getIBackupManager()
+ .setBackupServiceActive(userId, makeActive);
+ }
+ } catch (RemoteException e) {
+ throw new IllegalStateException("Failed deactivating backup service.", e);
+ } finally {
+ mInjector.binderRestoreCallingIdentity(ident);
+ }
+
+ }
+
@Override
public void clearProfileOwner(ComponentName who) {
if (!mHasFeature) {
@@ -12787,22 +12789,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return;
}
Preconditions.checkNotNull(admin);
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
-
- final long ident = mInjector.binderClearCallingIdentity();
- try {
- IBackupManager ibm = mInjector.getIBackupManager();
- if (ibm != null) {
- ibm.setBackupServiceActive(UserHandle.USER_SYSTEM, enabled);
- }
- } catch (RemoteException e) {
- throw new IllegalStateException(
- "Failed " + (enabled ? "" : "de") + "activating backup service.", e);
- } finally {
- mInjector.binderRestoreCallingIdentity(ident);
- }
+ enforceProfileOrDeviceOwner(admin);
+ int userId = mInjector.userHandleGetCallingUserId();
+ toggleBackupServiceActive(userId, enabled);
}
@Override
@@ -12811,11 +12800,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (!mHasFeature) {
return true;
}
+
+ enforceProfileOrDeviceOwner(admin);
synchronized (getLockObject()) {
try {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
IBackupManager ibm = mInjector.getIBackupManager();
- return ibm != null && ibm.isBackupServiceActive(UserHandle.USER_SYSTEM);
+ return ibm != null && ibm.isBackupServiceActive(
+ mInjector.userHandleGetCallingUserId());
} catch (RemoteException e) {
throw new IllegalStateException("Failed requesting backup service state.", e);
}
@@ -14207,7 +14198,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
+ "calendar APIs", packageName));
return false;
}
- final Intent intent = new Intent(CalendarContract.ACTION_VIEW_WORK_CALENDAR_EVENT);
+ final Intent intent = new Intent(
+ CalendarContract.ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT);
intent.setPackage(packageName);
intent.putExtra(CalendarContract.EXTRA_EVENT_ID, eventId);
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, start);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index e378dd67bc1f..d030fa543991 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -91,6 +91,7 @@ import com.android.server.display.ColorDisplayService;
import com.android.server.display.DisplayManagerService;
import com.android.server.dreams.DreamManagerService;
import com.android.server.emergency.EmergencyAffordanceService;
+import com.android.server.gpu.GpuService;
import com.android.server.hdmi.HdmiControlService;
import com.android.server.incident.IncidentCompanionService;
import com.android.server.input.InputManagerService;
@@ -813,6 +814,11 @@ public final class SystemServer {
traceBeginAndSlog("StartBugreportManagerService");
mSystemServiceManager.startService(BugreportManagerService.class);
traceEnd();
+
+ // Serivce for GPU and GPU driver.
+ traceBeginAndSlog("GpuService");
+ mSystemServiceManager.startService(GpuService.class);
+ traceEnd();
}
/**
diff --git a/services/net/Android.bp b/services/net/Android.bp
index 30c7de57b73e..638ec95ec544 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -9,12 +9,6 @@ filegroup {
"java/android/net/ip/InterfaceController.java", // TODO: move to NetworkStack with tethering
"java/android/net/util/InterfaceParams.java", // TODO: move to NetworkStack with IpServer
"java/android/net/shared/*.java",
- ],
-}
-
-java_library {
- name: "services-netlink-lib",
- srcs: [
"java/android/net/netlink/*.java",
- ]
+ ],
}
diff --git a/services/net/java/android/net/ip/InterfaceController.java b/services/net/java/android/net/ip/InterfaceController.java
index b3af67cdbdc3..970bc9cf667b 100644
--- a/services/net/java/android/net/ip/InterfaceController.java
+++ b/services/net/java/android/net/ip/InterfaceController.java
@@ -17,7 +17,6 @@
package android.net.ip;
import android.net.INetd;
-import android.net.InterfaceConfiguration;
import android.net.InterfaceConfigurationParcel;
import android.net.LinkAddress;
import android.net.util.SharedLog;
@@ -49,14 +48,18 @@ public class InterfaceController {
mLog = log;
}
- private boolean setInterfaceConfig(InterfaceConfiguration config) {
- final InterfaceConfigurationParcel cfgParcel = config.toParcel(mIfName);
-
+ private boolean setInterfaceAddress(LinkAddress addr) {
+ final InterfaceConfigurationParcel ifConfig = new InterfaceConfigurationParcel();
+ ifConfig.ifName = mIfName;
+ ifConfig.ipv4Addr = addr.getAddress().getHostAddress();
+ ifConfig.prefixLength = addr.getPrefixLength();
+ ifConfig.hwAddr = "";
+ ifConfig.flags = new String[0];
try {
- mNetd.interfaceSetCfg(cfgParcel);
+ mNetd.interfaceSetCfg(ifConfig);
} catch (RemoteException | ServiceSpecificException e) {
logError("Setting IPv4 address to %s/%d failed: %s",
- cfgParcel.ipv4Addr, cfgParcel.prefixLength, e);
+ ifConfig.ipv4Addr, ifConfig.prefixLength, e);
return false;
}
return true;
@@ -69,18 +72,14 @@ public class InterfaceController {
if (!(address.getAddress() instanceof Inet4Address)) {
return false;
}
- final InterfaceConfiguration ifConfig = new InterfaceConfiguration();
- ifConfig.setLinkAddress(address);
- return setInterfaceConfig(ifConfig);
+ return setInterfaceAddress(address);
}
/**
* Clear the IPv4Address of the interface.
*/
public boolean clearIPv4Address() {
- final InterfaceConfiguration ifConfig = new InterfaceConfiguration();
- ifConfig.setLinkAddress(new LinkAddress("0.0.0.0/0"));
- return setInterfaceConfig(ifConfig);
+ return setInterfaceAddress(new LinkAddress("0.0.0.0/0"));
}
private boolean setEnableIPv6(boolean enabled) {
diff --git a/services/net/java/android/net/ip/IpServer.java b/services/net/java/android/net/ip/IpServer.java
index f7360f52225f..7910c9a69310 100644
--- a/services/net/java/android/net/ip/IpServer.java
+++ b/services/net/java/android/net/ip/IpServer.java
@@ -40,7 +40,7 @@ import android.net.dhcp.IDhcpServer;
import android.net.ip.RouterAdvertisementDaemon.RaParams;
import android.net.util.InterfaceParams;
import android.net.util.InterfaceSet;
-import android.net.shared.NetdService;
+import android.net.util.NetdService;
import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.Looper;
diff --git a/services/net/java/android/net/netlink/NetlinkSocket.java b/services/net/java/android/net/netlink/NetlinkSocket.java
index 2a98d90e5577..16f72bd53e15 100644
--- a/services/net/java/android/net/netlink/NetlinkSocket.java
+++ b/services/net/java/android/net/netlink/NetlinkSocket.java
@@ -27,14 +27,13 @@ import static android.system.OsConstants.SO_RCVBUF;
import static android.system.OsConstants.SO_RCVTIMEO;
import static android.system.OsConstants.SO_SNDTIMEO;
+import android.net.util.SocketUtils;
import android.system.ErrnoException;
import android.system.Os;
-import android.system.StructTimeval;
import android.util.Log;
-import libcore.io.IoUtils;
-
import java.io.FileDescriptor;
+import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.SocketException;
import java.nio.ByteBuffer;
@@ -95,7 +94,11 @@ public class NetlinkSocket {
Log.e(TAG, errPrefix, e);
throw new ErrnoException(errPrefix, EIO, e);
} finally {
- IoUtils.closeQuietly(fd);
+ try {
+ SocketUtils.closeSocket(fd);
+ } catch (IOException e) {
+ // Nothing we can do here
+ }
}
}
@@ -106,7 +109,7 @@ public class NetlinkSocket {
}
public static void connectToKernel(FileDescriptor fd) throws ErrnoException, SocketException {
- Os.connect(fd, makeNetlinkSocketAddress(0, 0));
+ SocketUtils.connectSocket(fd, makeNetlinkSocketAddress(0, 0));
}
private static void checkTimeout(long timeoutMs) {
@@ -125,7 +128,7 @@ public class NetlinkSocket {
throws ErrnoException, IllegalArgumentException, InterruptedIOException {
checkTimeout(timeoutMs);
- Os.setsockoptTimeval(fd, SOL_SOCKET, SO_RCVTIMEO, StructTimeval.fromMillis(timeoutMs));
+ SocketUtils.setSocketTimeValueOption(fd, SOL_SOCKET, SO_RCVTIMEO, timeoutMs);
ByteBuffer byteBuffer = ByteBuffer.allocate(bufsize);
int length = Os.read(fd, byteBuffer);
@@ -148,7 +151,7 @@ public class NetlinkSocket {
FileDescriptor fd, byte[] bytes, int offset, int count, long timeoutMs)
throws ErrnoException, IllegalArgumentException, InterruptedIOException {
checkTimeout(timeoutMs);
- Os.setsockoptTimeval(fd, SOL_SOCKET, SO_SNDTIMEO, StructTimeval.fromMillis(timeoutMs));
+ SocketUtils.setSocketTimeValueOption(fd, SOL_SOCKET, SO_SNDTIMEO, timeoutMs);
return Os.write(fd, bytes, offset, count);
}
}
diff --git a/services/net/java/android/net/shared/InitialConfiguration.java b/services/net/java/android/net/shared/InitialConfiguration.java
index bc2373f4aabc..4ad71381da04 100644
--- a/services/net/java/android/net/shared/InitialConfiguration.java
+++ b/services/net/java/android/net/shared/InitialConfiguration.java
@@ -20,6 +20,7 @@ import static android.net.shared.ParcelableUtil.fromParcelableArray;
import static android.net.shared.ParcelableUtil.toParcelableArray;
import static android.text.TextUtils.join;
+import android.net.InetAddresses;
import android.net.InitialConfigurationParcelable;
import android.net.IpPrefix;
import android.net.IpPrefixParcelable;
@@ -27,7 +28,7 @@ import android.net.LinkAddress;
import android.net.LinkAddressParcelable;
import android.net.RouteInfo;
-import java.net.Inet6Address;
+import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.HashSet;
import java.util.List;
@@ -43,6 +44,8 @@ public class InitialConfiguration {
private static final int RFC6177_MIN_PREFIX_LENGTH = 48;
private static final int RFC7421_PREFIX_LENGTH = 64;
+ public static final InetAddress INET6_ANY = InetAddresses.parseNumericAddress("::");
+
/**
* Create a InitialConfiguration that is a copy of the specified configuration.
*/
@@ -102,7 +105,7 @@ public class InitialConfiguration {
return false;
}
// There no more than one IPv4 address
- if (ipAddresses.stream().filter(LinkAddress::isIPv4).count() > 1) {
+ if (ipAddresses.stream().filter(InitialConfiguration::isIPv4).count() > 1) {
return false;
}
@@ -184,11 +187,11 @@ public class InitialConfiguration {
}
private static boolean isPrefixLengthCompliant(LinkAddress addr) {
- return addr.isIPv4() || isCompliantIPv6PrefixLength(addr.getPrefixLength());
+ return isIPv4(addr) || isCompliantIPv6PrefixLength(addr.getPrefixLength());
}
private static boolean isPrefixLengthCompliant(IpPrefix prefix) {
- return prefix.isIPv4() || isCompliantIPv6PrefixLength(prefix.getPrefixLength());
+ return isIPv4(prefix) || isCompliantIPv6PrefixLength(prefix.getPrefixLength());
}
private static boolean isCompliantIPv6PrefixLength(int prefixLength) {
@@ -196,8 +199,16 @@ public class InitialConfiguration {
&& (prefixLength <= RFC7421_PREFIX_LENGTH);
}
+ private static boolean isIPv4(IpPrefix prefix) {
+ return prefix.getAddress() instanceof Inet4Address;
+ }
+
+ private static boolean isIPv4(LinkAddress addr) {
+ return addr.getAddress() instanceof Inet4Address;
+ }
+
private static boolean isIPv6DefaultRoute(IpPrefix prefix) {
- return prefix.getAddress().equals(Inet6Address.ANY);
+ return prefix.getAddress().equals(INET6_ANY);
}
private static boolean isIPv6GUA(LinkAddress addr) {
diff --git a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
index 00073503886a..1f0525e4da88 100644
--- a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
+++ b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java
@@ -44,11 +44,11 @@ public final class IpConfigurationParcelableUtil {
@Nullable StaticIpConfiguration config) {
if (config == null) return null;
final StaticIpConfigurationParcelable p = new StaticIpConfigurationParcelable();
- p.ipAddress = LinkPropertiesParcelableUtil.toStableParcelable(config.ipAddress);
- p.gateway = parcelAddress(config.gateway);
+ p.ipAddress = LinkPropertiesParcelableUtil.toStableParcelable(config.getIpAddress());
+ p.gateway = parcelAddress(config.getGateway());
p.dnsServers = toParcelableArray(
- config.dnsServers, IpConfigurationParcelableUtil::parcelAddress, String.class);
- p.domains = config.domains;
+ config.getDnsServers(), IpConfigurationParcelableUtil::parcelAddress, String.class);
+ p.domains = config.getDomains();
return p;
}
@@ -59,11 +59,13 @@ public final class IpConfigurationParcelableUtil {
@Nullable StaticIpConfigurationParcelable p) {
if (p == null) return null;
final StaticIpConfiguration config = new StaticIpConfiguration();
- config.ipAddress = LinkPropertiesParcelableUtil.fromStableParcelable(p.ipAddress);
- config.gateway = unparcelAddress(p.gateway);
- config.dnsServers.addAll(fromParcelableArray(
- p.dnsServers, IpConfigurationParcelableUtil::unparcelAddress));
- config.domains = p.domains;
+ config.setIpAddress(LinkPropertiesParcelableUtil.fromStableParcelable(p.ipAddress));
+ config.setGateway(unparcelAddress(p.gateway));
+ for (InetAddress addr : fromParcelableArray(
+ p.dnsServers, IpConfigurationParcelableUtil::unparcelAddress)) {
+ config.addDnsServer(addr);
+ }
+ config.setDomains(p.domains);
return config;
}
diff --git a/services/net/java/android/net/shared/NetdService.java b/services/net/java/android/net/util/NetdService.java
index f5ae72587294..d4cd5bd7ba18 100644
--- a/services/net/java/android/net/shared/NetdService.java
+++ b/services/net/java/android/net/util/NetdService.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.net.shared;
+package android.net.util;
import android.content.Context;
import android.net.INetd;
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
index 00a60b91ec5c..5dafe077d32e 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
@@ -122,7 +122,7 @@ public class ActivityManagerInternalTest {
private UidRecord addActiveUidRecord(int uid, long curProcStateSeq,
long lastNetworkUpdatedProcStateSeq) {
- final UidRecord record = new UidRecord(uid, null /* atmInternal */);
+ final UidRecord record = new UidRecord(uid);
record.lastNetworkUpdatedProcStateSeq = lastNetworkUpdatedProcStateSeq;
record.curProcStateSeq = curProcStateSeq;
record.waitingForNetwork = true;
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index 419c73611cb9..4e21fd0cd0de 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -250,7 +250,7 @@ public class ActivityManagerServiceTest {
}
private UidRecord addUidRecord(int uid) {
- final UidRecord uidRec = new UidRecord(uid, null /* atmInternal */);
+ final UidRecord uidRec = new UidRecord(uid);
uidRec.waitingForNetwork = true;
uidRec.hasInternetPermission = true;
mAms.mProcessList.mActiveUids.put(uid, uidRec);
@@ -405,7 +405,7 @@ public class ActivityManagerServiceTest {
@Test
public void testBlockStateForUid() {
- final UidRecord uidRec = new UidRecord(TEST_UID, null /* atmInternal */);
+ final UidRecord uidRec = new UidRecord(TEST_UID);
int expectedBlockState;
final String errorTemplate = "Block state should be %s, prevState: %s, curState: %s";
@@ -732,7 +732,7 @@ public class ActivityManagerServiceTest {
@Test
public void testEnqueueUidChangeLocked_procStateSeqUpdated() {
- final UidRecord uidRecord = new UidRecord(TEST_UID, null /* atmInternal */);
+ final UidRecord uidRecord = new UidRecord(TEST_UID);
uidRecord.curProcStateSeq = TEST_PROC_STATE_SEQ1;
// Verify with no pending changes for TEST_UID.
@@ -778,7 +778,7 @@ public class ActivityManagerServiceTest {
@MediumTest
@Test
public void testEnqueueUidChangeLocked_dispatchUidsChanged() {
- final UidRecord uidRecord = new UidRecord(TEST_UID, null /* atmInternal */);
+ final UidRecord uidRecord = new UidRecord(TEST_UID);
final int expectedProcState = PROCESS_STATE_SERVICE;
uidRecord.setProcState = expectedProcState;
uidRecord.curProcStateSeq = TEST_PROC_STATE_SEQ1;
@@ -850,7 +850,7 @@ public class ActivityManagerServiceTest {
private void verifyWaitingForNetworkStateUpdate(long curProcStateSeq,
long lastDispatchedProcStateSeq, long lastNetworkUpdatedProcStateSeq,
final long procStateSeqToWait, boolean expectWait) throws Exception {
- final UidRecord record = new UidRecord(Process.myUid(), null /* atmInternal */);
+ final UidRecord record = new UidRecord(Process.myUid());
record.curProcStateSeq = curProcStateSeq;
record.lastDispatchedProcStateSeq = lastDispatchedProcStateSeq;
record.lastNetworkUpdatedProcStateSeq = lastNetworkUpdatedProcStateSeq;
diff --git a/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java b/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java
index 1a231cf56921..2f8e5456a695 100644
--- a/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java
@@ -18,6 +18,7 @@ package com.android.server.am;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2;
+import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2;
import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3;
@@ -61,6 +62,9 @@ import java.util.concurrent.TimeUnit;
@RunWith(AndroidJUnit4.class)
public final class AppCompactorTest {
+ private static final String CLEAR_DEVICE_CONFIG_KEY_CMD =
+ "device_config delete activity_manager";
+
@Mock private AppOpsService mAppOpsService;
private AppCompactor mCompactorUnderTest;
private HandlerThread mHandlerThread;
@@ -70,19 +74,21 @@ public final class AppCompactorTest {
private static void clearDeviceConfig() throws IOException {
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
uiDevice.executeShellCommand(
- "device_config delete activity_manager " + KEY_USE_COMPACTION);
+ CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_USE_COMPACTION);
+ uiDevice.executeShellCommand(
+ CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_ACTION_1);
uiDevice.executeShellCommand(
- "device_config delete activity_manager " + KEY_COMPACT_ACTION_1);
+ CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_ACTION_2);
uiDevice.executeShellCommand(
- "device_config delete activity_manager " + KEY_COMPACT_ACTION_2);
+ CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_1);
uiDevice.executeShellCommand(
- "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_1);
+ CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_2);
uiDevice.executeShellCommand(
- "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_2);
+ CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_3);
uiDevice.executeShellCommand(
- "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_3);
+ CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_4);
uiDevice.executeShellCommand(
- "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_4);
+ CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_STATSD_SAMPLE_RATE);
}
@Before
@@ -128,6 +134,8 @@ public final class AppCompactorTest {
is(AppCompactor.DEFAULT_COMPACT_THROTTLE_3));
assertThat(mCompactorUnderTest.mCompactThrottleFullFull,
is(AppCompactor.DEFAULT_COMPACT_THROTTLE_4));
+ assertThat(mCompactorUnderTest.mStatsdSampleRate,
+ is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE));
}
@Test
@@ -155,6 +163,9 @@ public final class AppCompactorTest {
DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
KEY_COMPACT_THROTTLE_4,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
+ DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ KEY_COMPACT_STATSD_SAMPLE_RATE,
+ Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
// Then calling init will read and set that flag.
mCompactorUnderTest.init();
@@ -173,6 +184,8 @@ public final class AppCompactorTest {
is(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1));
assertThat(mCompactorUnderTest.mCompactThrottleFullFull,
is(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1));
+ assertThat(mCompactorUnderTest.mStatsdSampleRate,
+ is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f));
}
@Test
@@ -365,6 +378,63 @@ public final class AppCompactorTest {
is(AppCompactor.DEFAULT_COMPACT_THROTTLE_4));
}
+ @Test
+ public void statsdSampleRate_listensToDeviceConfigChanges() throws InterruptedException {
+ mCompactorUnderTest.init();
+
+ // When we override mStatsdSampleRate with a reasonable values ...
+ mCountDown = new CountDownLatch(1);
+ DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ KEY_COMPACT_STATSD_SAMPLE_RATE,
+ Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
+ assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true));
+
+ // Then that override is reflected in the compactor.
+ assertThat(mCompactorUnderTest.mStatsdSampleRate,
+ is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f));
+ }
+
+ @Test
+ public void statsdSanokeRate_listensToDeviceConfigChangesBadValues()
+ throws InterruptedException {
+ mCompactorUnderTest.init();
+
+ // When we override mStatsdSampleRate with a reasonable values ...
+ mCountDown = new CountDownLatch(1);
+ DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false);
+ assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true));
+
+ // Then that override is reflected in the compactor.
+ assertThat(mCompactorUnderTest.mStatsdSampleRate,
+ is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE));
+ }
+
+ @Test
+ public void statsdSanokeRate_listensToDeviceConfigChangesOutOfRangeValues()
+ throws InterruptedException {
+ mCompactorUnderTest.init();
+
+ // When we override mStatsdSampleRate with an value outside of [0..1]...
+ mCountDown = new CountDownLatch(1);
+ DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ KEY_COMPACT_STATSD_SAMPLE_RATE,
+ Float.toString(-1.0f), false);
+ assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true));
+
+ // Then the values is capped in the range.
+ assertThat(mCompactorUnderTest.mStatsdSampleRate, is(0.0f));
+
+ mCountDown = new CountDownLatch(1);
+ DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ KEY_COMPACT_STATSD_SAMPLE_RATE,
+ Float.toString(1.01f), false);
+ assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true));
+
+ // Then the values is capped in the range.
+ assertThat(mCompactorUnderTest.mStatsdSampleRate, is(1.0f));
+ }
+
private class TestInjector extends Injector {
@Override
public AppOpsService getAppOpsService(File file, Handler handler) {
diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
new file mode 100644
index 000000000000..33cbf7ae8ba6
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
@@ -0,0 +1,176 @@
+/*
+ * 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.rollback;
+
+import static org.junit.Assert.*;
+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 static org.mockito.Mockito.verifyZeroInteractions;
+
+import android.content.pm.VersionedPackage;
+import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.PackageRollbackInfo.RestoreInfo;
+import android.util.IntArray;
+
+import com.android.server.pm.Installer;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
+
+import java.io.File;
+import java.util.ArrayList;
+
+@RunWith(JUnit4.class)
+public class AppDataRollbackHelperTest {
+
+ @Test
+ public void testSnapshotAppData() throws Exception {
+ Installer installer = mock(Installer.class);
+ AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+
+ // All users are unlocked so we should snapshot data for them.
+ doReturn(true).when(helper).isUserCredentialLocked(eq(10));
+ doReturn(true).when(helper).isUserCredentialLocked(eq(11));
+ IntArray pending = helper.snapshotAppData("com.foo.bar", new int[]{10, 11});
+ assertEquals(2, pending.size());
+ assertEquals(10, pending.get(0));
+ assertEquals(11, pending.get(1));
+
+ InOrder inOrder = Mockito.inOrder(installer);
+ inOrder.verify(installer).snapshotAppData(
+ eq("com.foo.bar"), eq(10), eq(Installer.FLAG_STORAGE_DE));
+ inOrder.verify(installer).snapshotAppData(
+ eq("com.foo.bar"), eq(11), eq(Installer.FLAG_STORAGE_DE));
+ inOrder.verifyNoMoreInteractions();
+
+ // One of the users is unlocked but the other isn't
+ doReturn(false).when(helper).isUserCredentialLocked(eq(10));
+ doReturn(true).when(helper).isUserCredentialLocked(eq(11));
+
+ pending = helper.snapshotAppData("com.foo.bar", new int[]{10, 11});
+ assertEquals(1, pending.size());
+ assertEquals(11, pending.get(0));
+
+ inOrder = Mockito.inOrder(installer);
+ inOrder.verify(installer).snapshotAppData(
+ eq("com.foo.bar"), eq(10),
+ eq(Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE));
+ inOrder.verify(installer).snapshotAppData(
+ eq("com.foo.bar"), eq(11), eq(Installer.FLAG_STORAGE_DE));
+ inOrder.verifyNoMoreInteractions();
+ }
+
+ private static RollbackData createInProgressRollbackData(String packageName) {
+ RollbackData data = new RollbackData(1, new File("/does/not/exist"));
+ data.packages.add(new PackageRollbackInfo(
+ new VersionedPackage(packageName, 1), new VersionedPackage(packageName, 1),
+ new IntArray(), new ArrayList<>()));
+ data.inProgress = true;
+
+ return data;
+ }
+
+ @Test
+ public void testRestoreAppDataSnapshot_noRollbackData() throws Exception {
+ Installer installer = mock(Installer.class);
+ AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+
+ assertFalse(helper.restoreAppData("com.foo", null, 0, 0, 0, "seinfo"));
+ verifyZeroInteractions(installer);
+ }
+
+ @Test
+ public void testRestoreAppDataSnapshot_noRollbackInProgress() throws Exception {
+ Installer installer = mock(Installer.class);
+ AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+
+ RollbackData rd = createInProgressRollbackData("com.foo");
+ // Override the in progress flag.
+ rd.inProgress = false;
+ assertFalse(helper.restoreAppData("com.foo", rd, 0, 0, 0, "seinfo"));
+ verifyZeroInteractions(installer);
+ }
+
+ @Test
+ public void testRestoreAppDataSnapshot_pendingBackupForUser() throws Exception {
+ Installer installer = mock(Installer.class);
+ AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+
+ RollbackData rd = createInProgressRollbackData("com.foo");
+ IntArray pendingBackups = rd.packages.get(0).getPendingBackups();
+ pendingBackups.add(10);
+ pendingBackups.add(11);
+
+ assertTrue(helper.restoreAppData("com.foo", rd, 10 /* userId */, 1, 2, "seinfo"));
+
+ // Should only require FLAG_STORAGE_DE here because we have a pending backup that we
+ // didn't manage to execute.
+ InOrder inOrder = Mockito.inOrder(installer);
+ inOrder.verify(installer).restoreAppDataSnapshot(
+ eq("com.foo"), eq(1), eq(2L), eq("seinfo"), eq(10), eq(Installer.FLAG_STORAGE_DE));
+ inOrder.verifyNoMoreInteractions();
+
+ assertEquals(1, pendingBackups.size());
+ assertEquals(11, pendingBackups.get(0));
+ }
+
+ @Test
+ public void testRestoreAppDataSnapshot_availableBackupForLockedUser() throws Exception {
+ Installer installer = mock(Installer.class);
+ AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+ doReturn(true).when(helper).isUserCredentialLocked(eq(10));
+
+ RollbackData rd = createInProgressRollbackData("com.foo");
+
+ assertTrue(helper.restoreAppData("com.foo", rd, 10 /* userId */, 1, 2, "seinfo"));
+
+ InOrder inOrder = Mockito.inOrder(installer);
+ inOrder.verify(installer).restoreAppDataSnapshot(
+ eq("com.foo"), eq(1), eq(2L), eq("seinfo"), eq(10), eq(Installer.FLAG_STORAGE_DE));
+ inOrder.verifyNoMoreInteractions();
+
+ ArrayList<RestoreInfo> pendingRestores = rd.packages.get(0).getPendingRestores();
+ assertEquals(1, pendingRestores.size());
+ assertEquals(10, pendingRestores.get(0).userId);
+ assertEquals(1, pendingRestores.get(0).appId);
+ assertEquals("seinfo", pendingRestores.get(0).seInfo);
+ }
+
+ @Test
+ public void testRestoreAppDataSnapshot_availableBackupForUnockedUser() throws Exception {
+ Installer installer = mock(Installer.class);
+ AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer));
+ doReturn(false).when(helper).isUserCredentialLocked(eq(10));
+
+ RollbackData rd = createInProgressRollbackData("com.foo");
+ assertFalse(helper.restoreAppData("com.foo", rd, 10 /* userId */, 1, 2, "seinfo"));
+
+ InOrder inOrder = Mockito.inOrder(installer);
+ inOrder.verify(installer).restoreAppDataSnapshot(
+ eq("com.foo"), eq(1), eq(2L), eq("seinfo"), eq(10),
+ eq(Installer.FLAG_STORAGE_DE | Installer.FLAG_STORAGE_CE));
+ inOrder.verifyNoMoreInteractions();
+
+ ArrayList<RestoreInfo> pendingRestores = rd.packages.get(0).getPendingRestores();
+ assertEquals(0, pendingRestores.size());
+ }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
index 1de1e4ef8b9f..0b488c09b45a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.INotificationManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.IPackageManager;
@@ -36,22 +37,17 @@ import android.os.UserManager;
import android.util.IntArray;
import android.util.Xml;
-import com.android.internal.util.FastXmlSerializer;
import com.android.server.UiServiceTestCase;
import com.android.server.notification.NotificationManagerService.NotificationAssistants;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlSerializer;
import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
@@ -65,6 +61,8 @@ public class NotificationAssistantsTest extends UiServiceTestCase {
private UserManager mUm;
@Mock
NotificationManagerService mNm;
+ @Mock
+ private INotificationManager mINm;
NotificationAssistants mAssistants;
@@ -83,6 +81,7 @@ public class NotificationAssistantsTest extends UiServiceTestCase {
getContext().setMockPackageManager(mPm);
getContext().addMockSystemService(Context.USER_SERVICE, mUm);
mAssistants = spy(mNm.new NotificationAssistants(getContext(), mLock, mUserProfiles, miPm));
+ when(mNm.getBinderService()).thenReturn(mINm);
List<ResolveInfo> approved = new ArrayList<>();
ResolveInfo resolve = new ResolveInfo();
@@ -136,4 +135,30 @@ public class NotificationAssistantsTest extends UiServiceTestCase {
verify(mAssistants, times(1)).addApprovedList(
new ComponentName("b", "b").flattenToString(),10, true);
}
+
+ @Test
+ public void testSetPackageOrComponentEnabled_onlyOnePackage() throws Exception {
+ ComponentName component1 = ComponentName.unflattenFromString("package/Component1");
+ ComponentName component2 = ComponentName.unflattenFromString("package/Component2");
+ mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true,
+ true);
+ verify(mINm, never()).setNotificationAssistantAccessGrantedForUser(any(ComponentName.class),
+ eq(mZero.id), anyBoolean());
+
+ mAssistants.setPackageOrComponentEnabled(component2.flattenToString(), mZero.id, true,
+ true);
+ verify(mINm, times(1)).setNotificationAssistantAccessGrantedForUser(component1, mZero.id,
+ false);
+ }
+
+ @Test
+ public void testSetPackageOrComponentEnabled_samePackage() throws Exception {
+ ComponentName component1 = ComponentName.unflattenFromString("package/Component1");
+ mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true,
+ true);
+ mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true,
+ true);
+ verify(mINm, never()).setNotificationAssistantAccessGrantedForUser(any(ComponentName.class),
+ eq(mZero.id), anyBoolean());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 5d46f0fe7538..4cae3b3f9ae7 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -2029,6 +2029,31 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testGetAssistantAllowedForUser() throws Exception {
+ UserHandle user = UserHandle.of(10);
+ try {
+ mBinderService.getAllowedNotificationAssistantForUser(user.getIdentifier());
+ } catch (IllegalStateException e) {
+ if (!e.getMessage().contains("At most one NotificationAssistant")) {
+ throw e;
+ }
+ }
+ verify(mAssistants, times(1)).getAllowedComponents(user.getIdentifier());
+ }
+
+ @Test
+ public void testGetAssistantAllowed() throws Exception {
+ try {
+ mBinderService.getAllowedNotificationAssistant();
+ } catch (IllegalStateException e) {
+ if (!e.getMessage().contains("At most one NotificationAssistant")) {
+ throw e;
+ }
+ }
+ verify(mAssistants, times(1)).getAllowedComponents(0);
+ }
+
+ @Test
public void testSetDndAccessForUser() throws Exception {
UserHandle user = UserHandle.of(10);
ComponentName c = ComponentName.unflattenFromString("package/Component");
@@ -2089,6 +2114,54 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testSetAssistantAccess_nullWithAllowedAssistant() throws Exception {
+ ArrayList<ComponentName> componentList = new ArrayList<>();
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ componentList.add(c);
+ when(mAssistants.getAllowedComponents(anyInt())).thenReturn(componentList);
+
+ try {
+ mBinderService.setNotificationAssistantAccessGranted(null, true);
+ } catch (SecurityException e) {
+ if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
+ throw e;
+ }
+ }
+
+ verify(mAssistants, times(1)).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, true, false);
+ verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, false, false);
+ verify(mListeners, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testSetAssistantAccessForUser_nullWithAllowedAssistant() throws Exception {
+ UserHandle user = UserHandle.of(10);
+ ArrayList<ComponentName> componentList = new ArrayList<>();
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ componentList.add(c);
+ when(mAssistants.getAllowedComponents(anyInt())).thenReturn(componentList);
+
+ try {
+ mBinderService.setNotificationAssistantAccessGrantedForUser(
+ null, user.getIdentifier(), true);
+ } catch (SecurityException e) {
+ if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
+ throw e;
+ }
+ }
+
+ verify(mAssistants, times(1)).setPackageOrComponentEnabled(
+ c.flattenToString(), user.getIdentifier(), true, false);
+ verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
+ c.flattenToString(), user.getIdentifier(), false, false);
+ verify(mListeners, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
public void testSetDndAccess() throws Exception {
ComponentName c = ComponentName.unflattenFromString("package/Component");
try {
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 bde9dde52c2f..47ec390d6b01 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -2006,6 +2006,28 @@ public class PreferencesHelperTest extends UiServiceTestCase {
}
@Test
+ public void testXml_statusBarIcons_default() throws Exception {
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ loadStreamXml(baos, false);
+
+ assertEquals(PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS,
+ mHelper.shouldHideSilentStatusIcons());
+ }
+
+ @Test
+ public void testXml_statusBarIcons() throws Exception {
+ mHelper.setHideSilentStatusIcons(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS);
+
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ loadStreamXml(baos, false);
+
+ assertEquals(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS,
+ mHelper.shouldHideSilentStatusIcons());
+ }
+
+ @Test
public void testSetNotificationDelegate() {
mHelper.setNotificationDelegate(PKG_O, UID_O, "other", 53);
assertEquals("other", mHelper.getNotificationDelegate(PKG_O, UID_O));
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
index 35c1edeace2d..986943aaf146 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -34,6 +34,7 @@ import static com.android.server.wm.ActivityStack.ActivityState.DESTROYING;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.wm.ActivityStack.ActivityState.STOPPED;
import static com.android.server.wm.ActivityStack.ActivityState.STOPPING;
import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE;
@@ -51,6 +52,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import android.content.ComponentName;
import android.content.pm.ActivityInfo;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
@@ -647,20 +649,50 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testFinishDisabledPackageActivities() {
+ public void testFinishDisabledPackageActivities_FinishAliveActivities() {
final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
+ firstActivity.setState(STOPPED, "testFinishDisabledPackageActivities");
+ secondActivity.setState(RESUMED, "testFinishDisabledPackageActivities");
+ mStack.mResumedActivity = secondActivity;
- // Making the second activity a task overlay without an app means it will be removed from
- // the task's activities as well once first activity is removed.
- secondActivity.mTaskOverlay = true;
- secondActivity.app = null;
+ // Note the activities have non-null ActivityRecord.app, so it won't remove directly.
+ mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName,
+ null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
+ UserHandle.USER_ALL);
+
+ // If the activity is disabled with {@link android.content.pm.PackageManager#DONT_KILL_APP}
+ // the activity should still follow the normal flow to finish and destroy.
+ assertThat(firstActivity.getState()).isEqualTo(DESTROYING);
+ assertThat(secondActivity.getState()).isEqualTo(PAUSING);
+ assertTrue(secondActivity.finishing);
+ }
+
+ @Test
+ public void testFinishDisabledPackageActivities_RemoveNonAliveActivities() {
+ final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build();
+
+ // The overlay activity is not in the disabled package but it is in the same task.
+ final ActivityRecord overlayActivity = new ActivityBuilder(mService).setTask(mTask)
+ .setComponent(new ComponentName("package.overlay", ".OverlayActivity")).build();
+ // If the task only remains overlay activity, the task should also be removed.
+ // See {@link ActivityStack#removeActivityFromHistoryLocked}.
+ overlayActivity.mTaskOverlay = true;
+
+ // The activity without an app means it will be removed immediately.
+ // See {@link ActivityStack#destroyActivityLocked}.
+ activity.app = null;
+ overlayActivity.app = null;
assertEquals(2, mTask.mActivities.size());
- mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName, null,
- true /* doit */, true /* evenPersistent */, UserHandle.USER_ALL);
+ mStack.finishDisabledPackageActivitiesLocked(activity.packageName,
+ null /* filterByClasses */, true /* doit */, true /* evenPersistent */,
+ UserHandle.USER_ALL);
+ // Although the overlay activity is in another package, the non-overlay activities are
+ // removed from the task. Since the overlay activity should be removed as well, the task
+ // should be empty.
assertThat(mTask.mActivities).isEmpty();
assertThat(mStack.getAllTasks()).isEmpty();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index ace965b8b42c..62ec838c047f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -561,7 +561,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
runAndVerifyBackgroundActivityStartsSubtest("allowed_noStartsAborted", false,
UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- false, false, false);
+ false, false, false, false);
}
/**
@@ -576,7 +576,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
"disallowed_unsupportedUsecase_aborted", true,
UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- false, false, false);
+ false, false, false, false);
}
/**
@@ -591,57 +591,64 @@ public class ActivityStarterTests extends ActivityTestsBase {
runAndVerifyBackgroundActivityStartsSubtest("disallowed_rootUid_notAborted", false,
Process.ROOT_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- false, false, false);
+ false, false, false, false);
runAndVerifyBackgroundActivityStartsSubtest("disallowed_systemUid_notAborted", false,
Process.SYSTEM_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- false, false, false);
+ false, false, false, false);
runAndVerifyBackgroundActivityStartsSubtest("disallowed_nfcUid_notAborted", false,
Process.NFC_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- false, false, false);
+ false, false, false, false);
runAndVerifyBackgroundActivityStartsSubtest(
"disallowed_callingUidHasVisibleWindow_notAborted", false,
UNIMPORTANT_UID, true, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- false, false, false);
+ false, false, false, false);
runAndVerifyBackgroundActivityStartsSubtest(
"disallowed_callingUidProcessStateTop_notAborted", false,
UNIMPORTANT_UID, false, PROCESS_STATE_TOP,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- false, false, false);
+ false, false, false, false);
runAndVerifyBackgroundActivityStartsSubtest(
"disallowed_realCallingUidHasVisibleWindow_notAborted", false,
UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, true, PROCESS_STATE_TOP + 1,
- false, false, false);
+ false, false, false, false);
runAndVerifyBackgroundActivityStartsSubtest(
"disallowed_realCallingUidProcessStateTop_notAborted", false,
UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP,
- false, false, false);
+ false, false, false, false);
runAndVerifyBackgroundActivityStartsSubtest(
"disallowed_hasForegroundActivities_notAborted", false,
UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- true, false, false);
+ true, false, false, false);
runAndVerifyBackgroundActivityStartsSubtest(
"disallowed_callerIsRecents_notAborted", false,
UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- false, true, false);
+ false, true, false, false);
runAndVerifyBackgroundActivityStartsSubtest(
"disallowed_callerIsWhitelisted_notAborted", false,
UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
- false, false, true);
+ false, false, true, false);
+ runAndVerifyBackgroundActivityStartsSubtest(
+ "disallowed_callerIsInstrumentingWithBackgroundActivityStartPrivileges_notAborted",
+ false,
+ UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1,
+ UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1,
+ false, false, false, true);
}
private void runAndVerifyBackgroundActivityStartsSubtest(String name, boolean shouldHaveAborted,
int callingUid, boolean callingUidHasVisibleWindow, int callingUidProcState,
int realCallingUid, boolean realCallingUidHasVisibleWindow, int realCallingUidProcState,
boolean hasForegroundActivities, boolean callerIsRecents,
- boolean callerIsTempWhitelisted) {
+ boolean callerIsTempWhitelisted,
+ boolean callerIsInstrumentingWithBackgroundActivityStartPrivileges) {
// window visibility
doReturn(callingUidHasVisibleWindow).when(mService.mWindowManager.mRoot)
.isAnyNonToastWindowVisibleForUid(callingUid);
@@ -664,6 +671,9 @@ public class ActivityStarterTests extends ActivityTestsBase {
doReturn(callerIsRecents).when(recentTasks).isCallerRecents(callingUid);
// caller is temp whitelisted
callerApp.setAllowBackgroundActivityStarts(callerIsTempWhitelisted);
+ // caller is instrumenting with background activity starts privileges
+ callerApp.setInstrumentingWithBackgroundActivityStartPrivileges(
+ callerIsInstrumentingWithBackgroundActivityStartPrivileges);
final ActivityOptions options = spy(ActivityOptions.makeBasic());
ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_NEW_TASK)
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
index ea8f33f0c630..3b399ffc708c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
@@ -474,6 +474,10 @@ class ActivityTestsBase {
}
@Override
+ void updateCpuStats() {
+ }
+
+ @Override
void updateBatteryStats(ActivityRecord component, boolean resumed) {
}
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 50e4faab76e3..ae05750eed9f 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -41,11 +41,11 @@ import android.hardware.usb.ParcelableUsbPort;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus;
+import android.hardware.usb.V1_0.IUsb;
import android.hardware.usb.V1_0.PortRole;
import android.hardware.usb.V1_0.PortRoleType;
import android.hardware.usb.V1_0.Status;
import android.hardware.usb.V1_1.PortStatus_1_1;
-import android.hardware.usb.V1_2.IUsb;
import android.hardware.usb.V1_2.IUsbCallback;
import android.hardware.usb.V1_2.PortStatus;
import android.hidl.manager.V1_0.IServiceManager;
@@ -320,9 +320,12 @@ public class UsbPortManager {
try {
// Oneway call into the hal
- mProxy.enableContaminantPresenceDetection(portId, enable);
+ android.hardware.usb.V1_2.IUsb proxy = (android.hardware.usb.V1_2.IUsb) mProxy;
+ proxy.enableContaminantPresenceDetection(portId, enable);
} catch (RemoteException e) {
- logAndPrintException(null, "Failed to set contaminant detection", e);
+ logAndPrintException(pw, "Failed to set contaminant detection", e);
+ } catch (ClassCastException e) {
+ logAndPrintException(pw, "Method only applicable to V1.2 or above implementation", e);
}
}
diff --git a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
index 9a30b35f02a2..22fc15985b05 100644
--- a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
+++ b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
@@ -50,8 +50,8 @@ public class IorapForwardingService extends SystemService {
public static final String TAG = "IorapForwardingService";
/** $> adb shell 'setprop log.tag.IorapdForwardingService VERBOSE' */
public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- /** $> adb shell 'setprop iorapd.enable true' */
- private static boolean IS_ENABLED = SystemProperties.getBoolean("iorapd.enable", true);
+ /** $> adb shell 'setprop ro.iorapd.enable true' */
+ private static boolean IS_ENABLED = SystemProperties.getBoolean("ro.iorapd.enable", true);
/** $> adb shell 'setprop iorapd.forwarding_service.wtf_crash true' */
private static boolean WTF_CRASH = SystemProperties.getBoolean(
"iorapd.forwarding_service.wtf_crash", false);
diff --git a/startop/iorap/tests/Android.mk b/startop/iorap/tests/Android.mk
index 1b2aa46a6418..fa8c8b5fba89 100644
--- a/startop/iorap/tests/Android.mk
+++ b/startop/iorap/tests/Android.mk
@@ -43,4 +43,7 @@ LOCAL_JAVA_LIBRARIES := \
LOCAL_CERTIFICATE := platform
LOCAL_PRIVATE_PLATFORM_APIS := true
+# Disable presubmit test until it works with disabled iorap by default.
+LOCAL_PRESUBMIT_DISABLED := true
+
include $(BUILD_PACKAGE)
diff --git a/telephony/java/android/telephony/NetworkService.java b/telephony/java/android/telephony/NetworkService.java
index 4bca404d9444..6c45cc4ef3b8 100644
--- a/telephony/java/android/telephony/NetworkService.java
+++ b/telephony/java/android/telephony/NetworkService.java
@@ -16,6 +16,7 @@
package android.telephony;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.app.Service;
import android.content.Intent;
@@ -112,13 +113,13 @@ public abstract class NetworkService extends Service {
mSlotId, 0, null).sendToTarget();
}
- private void registerForStateChanged(INetworkServiceCallback callback) {
+ private void registerForStateChanged(@NonNull INetworkServiceCallback callback) {
synchronized (mNetworkRegistrationStateChangedCallbacks) {
mNetworkRegistrationStateChangedCallbacks.add(callback);
}
}
- private void unregisterForStateChanged(INetworkServiceCallback callback) {
+ private void unregisterForStateChanged(@NonNull INetworkServiceCallback callback) {
synchronized (mNetworkRegistrationStateChangedCallbacks) {
mNetworkRegistrationStateChangedCallbacks.remove(callback);
}
diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java
index 0d94c4dd3686..c1786befb096 100644
--- a/telephony/java/android/telephony/RadioAccessFamily.java
+++ b/telephony/java/android/telephony/RadioAccessFamily.java
@@ -17,12 +17,15 @@
package android.telephony;
import android.annotation.UnsupportedAppUsage;
+import android.hardware.radio.V1_0.RadioTechnology;
+import android.hardware.radio.V1_4.CellInfo.Info;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.internal.telephony.RILConstants;
+
/**
* Object to indicate the phone radio type and access technology.
*
@@ -33,32 +36,34 @@ public class RadioAccessFamily implements Parcelable {
/**
* TODO: get rid of RAF definition in RadioAccessFamily and
* use {@link TelephonyManager.NetworkTypeBitMask}
+ * TODO: public definition {@link TelephonyManager.NetworkTypeBitMask} is long.
+ * TODO: Convert from int to long everywhere including HAL definitions.
*/
// 2G
- public static final int RAF_UNKNOWN = TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN;
- public static final int RAF_GSM = TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
- public static final int RAF_GPRS = TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
- public static final int RAF_EDGE = TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
- public static final int RAF_IS95A = TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
- public static final int RAF_IS95B = TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
- public static final int RAF_1xRTT = TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
+ public static final int RAF_UNKNOWN = (int) TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN;
+ public static final int RAF_GSM = (int) TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
+ public static final int RAF_GPRS = (int) TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
+ public static final int RAF_EDGE = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
+ public static final int RAF_IS95A = (int) TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+ public static final int RAF_IS95B = (int) TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+ public static final int RAF_1xRTT = (int) TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
// 3G
- public static final int RAF_EVDO_0 = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
- public static final int RAF_EVDO_A = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
- public static final int RAF_EVDO_B = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
- public static final int RAF_EHRPD = TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
- public static final int RAF_HSUPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
- public static final int RAF_HSDPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
- public static final int RAF_HSPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
- public static final int RAF_HSPAP = TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
- public static final int RAF_UMTS = TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
- public static final int RAF_TD_SCDMA = TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
+ public static final int RAF_EVDO_0 = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
+ public static final int RAF_EVDO_A = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
+ public static final int RAF_EVDO_B = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
+ public static final int RAF_EHRPD = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
+ public static final int RAF_HSUPA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
+ public static final int RAF_HSDPA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
+ public static final int RAF_HSPA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
+ public static final int RAF_HSPAP = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
+ public static final int RAF_UMTS = (int) TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
+ public static final int RAF_TD_SCDMA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
// 4G
- public static final int RAF_LTE = TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
- public static final int RAF_LTE_CA = TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
+ public static final int RAF_LTE = (int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
+ public static final int RAF_LTE_CA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
// 5G
- public static final int RAF_NR = TelephonyManager.NETWORK_TYPE_BITMASK_NR;
+ public static final int RAF_NR = (int) TelephonyManager.NETWORK_TYPE_BITMASK_NR;
// Grouping of RAFs
// 2G
@@ -147,20 +152,20 @@ public class RadioAccessFamily implements Parcelable {
/**
* Implement the Parcelable interface.
*/
- public static final Creator<RadioAccessFamily> CREATOR =
- new Creator<RadioAccessFamily>() {
+ public static final Creator<android.telephony.RadioAccessFamily> CREATOR =
+ new Creator<android.telephony.RadioAccessFamily>() {
@Override
- public RadioAccessFamily createFromParcel(Parcel in) {
+ public android.telephony.RadioAccessFamily createFromParcel(Parcel in) {
int phoneId = in.readInt();
int radioAccessFamily = in.readInt();
- return new RadioAccessFamily(phoneId, radioAccessFamily);
+ return new android.telephony.RadioAccessFamily(phoneId, radioAccessFamily);
}
@Override
- public RadioAccessFamily[] newArray(int size) {
- return new RadioAccessFamily[size];
+ public android.telephony.RadioAccessFamily[] newArray(int size) {
+ return new android.telephony.RadioAccessFamily[size];
}
};
@@ -391,76 +396,78 @@ public class RadioAccessFamily implements Parcelable {
}
/**
- * convert RAF from {@link ServiceState.RilRadioTechnology} bitmask to
+ * convert RAF from {@link android.hardware.radio.V1_0.RadioAccessFamily} to
* {@link TelephonyManager.NetworkTypeBitMask}, the bitmask represented by
- * {@link TelephonyManager.NetworkType}. Reasons are {@link TelephonyManager.NetworkType} are
- * public while {@link ServiceState.RilRadioTechnology} are hidden. We
- * don't want to expose two sets of definition to public.
+ * {@link TelephonyManager.NetworkType}.
*
- * @param raf bitmask represented by {@link ServiceState.RilRadioTechnology}
+ * @param raf {@link android.hardware.radio.V1_0.RadioAccessFamily}
* @return {@link TelephonyManager.NetworkTypeBitMask}
*/
public static int convertToNetworkTypeBitMask(int raf) {
int networkTypeRaf = 0;
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GSM)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GSM) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GPRS)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GPRS) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EDGE)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EDGE) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
}
// convert both IS95A/IS95B to CDMA as network mode doesn't support CDMA
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95A)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95A) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95B)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95B) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EHRPD) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSUPA) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSDPA) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPA)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPA) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPAP) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UMTS)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.UMTS) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA)) != 0) {
+ if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
}
- if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_NR)) != 0) {
+ if ((raf & android.hardware.radio.V1_4.RadioAccessFamily.NR) != 0) {
networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_NR;
}
+ // TODO: need hal definition
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN;
+ }
return (networkTypeRaf == 0) ? TelephonyManager.NETWORK_TYPE_UNKNOWN : networkTypeRaf;
}
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 44756307a4b3..33178766f3a3 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -540,7 +540,7 @@ public class ServiceState implements Parcelable {
*
* @hide
*/
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
+ @UnsupportedAppUsage
public int getDataRegState() {
return mDataRegState;
}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 869cf1cf9e14..dfe36efcd5d1 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -2577,8 +2577,14 @@ public class SubscriptionManager {
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public void setPreferredDataSubscriptionId(int subId) {
if (VDBG) logd("[setPreferredDataSubscriptionId]+ subId:" + subId);
- setSubscriptionPropertyHelper(DEFAULT_SUBSCRIPTION_ID, "setPreferredDataSubscriptionId",
- (iSub)-> iSub.setPreferredDataSubscriptionId(subId));
+ try {
+ ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
+ if (iSub != null) {
+ iSub.setPreferredDataSubscriptionId(subId);
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ }
}
/**
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 36450579c57b..0e63b2b4db4d 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -23,6 +23,7 @@ import static com.android.internal.util.Preconditions.checkNotNull;
import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
+import android.annotation.LongDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -349,41 +350,30 @@ public class TelephonyManager {
* Returns 0 if none of voice, sms, data is not supported
* Returns 1 for Single standby mode (Single SIM functionality)
* Returns 2 for Dual standby mode.(Dual SIM functionality)
+ * Returns 3 for Tri standby mode.(Tri SIM functionality)
*/
public int getPhoneCount() {
- int phoneCount = 1;
- switch (getMultiSimConfiguration()) {
- case UNKNOWN:
- // if voice or sms or data is supported, return 1 otherwise 0
- if (isVoiceCapable() || isSmsCapable()) {
- phoneCount = 1;
- } else {
- // todo: try to clean this up further by getting rid of the nested conditions
- if (mContext == null) {
- phoneCount = 1;
- } else {
- // check for data support
- ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
- Context.CONNECTIVITY_SERVICE);
- if (cm == null) {
- phoneCount = 1;
- } else {
- if (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)) {
- phoneCount = 1;
- } else {
- phoneCount = 0;
- }
- }
- }
+ int phoneCount = 0;
+
+ // check for voice and data support, 0 if not supported
+ if (!isVoiceCapable() && !isSmsCapable()) {
+ ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(
+ Context.CONNECTIVITY_SERVICE);
+ if (cm != null) {
+ if (!cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)) {
+ return phoneCount;
}
- break;
- case DSDS:
- case DSDA:
- phoneCount = PhoneConstants.MAX_PHONE_COUNT_DUAL_SIM;
- break;
- case TSTS:
- phoneCount = PhoneConstants.MAX_PHONE_COUNT_TRI_SIM;
- break;
+ }
+ }
+
+ phoneCount = 1;
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ phoneCount = telephony.getNumOfActiveSims();
+ }
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "getNumOfActiveSims RemoteException", ex);
}
return phoneCount;
}
@@ -6539,17 +6529,17 @@ public class TelephonyManager {
* {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE}
* or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
*
- * @return a 32-bit bitmap.
+ * @return The bitmap of preferred network types.
*
* @hide
*/
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
@SystemApi
- public @NetworkTypeBitMask int getPreferredNetworkTypeBitmap() {
+ public @NetworkTypeBitMask long getPreferredNetworkTypeBitmap() {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
- return RadioAccessFamily.getRafFromNetworkType(
+ return (long) RadioAccessFamily.getRafFromNetworkType(
telephony.getPreferredNetworkType(getSubId()));
}
} catch (RemoteException ex) {
@@ -6784,18 +6774,19 @@ public class TelephonyManager {
* {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
* app has carrier privileges (see {@link #hasCarrierPrivileges}).
*
- * @param networkTypeBitmap a 32-bit bitmap.
+ * @param networkTypeBitmap The bitmap of preferred network types.
* @return true on success; false on any failure.
* @hide
*/
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
@SystemApi
- public boolean setPreferredNetworkTypeBitmap(@NetworkTypeBitMask int networkTypeBitmap) {
+ public boolean setPreferredNetworkTypeBitmap(@NetworkTypeBitMask long networkTypeBitmap) {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
return telephony.setPreferredNetworkType(
- getSubId(), RadioAccessFamily.getNetworkTypeFromRaf(networkTypeBitmap));
+ getSubId(), RadioAccessFamily.getNetworkTypeFromRaf(
+ (int) networkTypeBitmap));
}
} catch (RemoteException ex) {
Rlog.e(TAG, "setPreferredNetworkType RemoteException", ex);
@@ -9704,7 +9695,7 @@ public class TelephonyManager {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(flag = true, prefix = {"NETWORK_TYPE_BITMASK_"},
+ @LongDef(flag = true, prefix = {"NETWORK_TYPE_BITMASK_"},
value = {NETWORK_TYPE_BITMASK_UNKNOWN,
NETWORK_TYPE_BITMASK_GSM,
NETWORK_TYPE_BITMASK_GPRS,
@@ -9733,118 +9724,125 @@ public class TelephonyManager {
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_UNKNOWN = (1 << NETWORK_TYPE_UNKNOWN);
+ public static final long NETWORK_TYPE_BITMASK_UNKNOWN = 0L;
/**
* network type bitmask indicating the support of radio tech GSM.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_GSM = (1 << NETWORK_TYPE_GSM);
+ public static final long NETWORK_TYPE_BITMASK_GSM = (1 << (NETWORK_TYPE_GSM -1));
/**
* network type bitmask indicating the support of radio tech GPRS.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_GPRS = (1 << NETWORK_TYPE_GPRS);
+ public static final long NETWORK_TYPE_BITMASK_GPRS = (1 << (NETWORK_TYPE_GPRS -1));
/**
* network type bitmask indicating the support of radio tech EDGE.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_EDGE = (1 << NETWORK_TYPE_EDGE);
+ public static final long NETWORK_TYPE_BITMASK_EDGE = (1 << (NETWORK_TYPE_EDGE -1));
/**
* network type bitmask indicating the support of radio tech CDMA(IS95A/IS95B).
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_CDMA = (1 << NETWORK_TYPE_CDMA);
+ public static final long NETWORK_TYPE_BITMASK_CDMA = (1 << (NETWORK_TYPE_CDMA -1));
/**
* network type bitmask indicating the support of radio tech 1xRTT.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_1xRTT = (1 << NETWORK_TYPE_1xRTT);
+ public static final long NETWORK_TYPE_BITMASK_1xRTT = (1 << (NETWORK_TYPE_1xRTT - 1));
// 3G
/**
* network type bitmask indicating the support of radio tech EVDO 0.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_EVDO_0 = (1 << NETWORK_TYPE_EVDO_0);
+ public static final long NETWORK_TYPE_BITMASK_EVDO_0 = (1 << (NETWORK_TYPE_EVDO_0 -1));
/**
* network type bitmask indicating the support of radio tech EVDO A.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_EVDO_A = (1 << NETWORK_TYPE_EVDO_A);
+ public static final long NETWORK_TYPE_BITMASK_EVDO_A = (1 << (NETWORK_TYPE_EVDO_A - 1));
/**
* network type bitmask indicating the support of radio tech EVDO B.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_EVDO_B = (1 << NETWORK_TYPE_EVDO_B);
+ public static final long NETWORK_TYPE_BITMASK_EVDO_B = (1 << (NETWORK_TYPE_EVDO_B -1));
/**
* network type bitmask indicating the support of radio tech EHRPD.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_EHRPD = (1 << NETWORK_TYPE_EHRPD);
+ public static final long NETWORK_TYPE_BITMASK_EHRPD = (1 << (NETWORK_TYPE_EHRPD -1));
/**
* network type bitmask indicating the support of radio tech HSUPA.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_HSUPA = (1 << NETWORK_TYPE_HSUPA);
+ public static final long NETWORK_TYPE_BITMASK_HSUPA = (1 << (NETWORK_TYPE_HSUPA -1));
/**
* network type bitmask indicating the support of radio tech HSDPA.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_HSDPA = (1 << NETWORK_TYPE_HSDPA);
+ public static final long NETWORK_TYPE_BITMASK_HSDPA = (1 << (NETWORK_TYPE_HSDPA -1));
/**
* network type bitmask indicating the support of radio tech HSPA.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_HSPA = (1 << NETWORK_TYPE_HSPA);
+ public static final long NETWORK_TYPE_BITMASK_HSPA = (1 << (NETWORK_TYPE_HSPA -1));
/**
* network type bitmask indicating the support of radio tech HSPAP.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_HSPAP = (1 << NETWORK_TYPE_HSPAP);
+ public static final long NETWORK_TYPE_BITMASK_HSPAP = (1 << (NETWORK_TYPE_HSPAP -1));
/**
* network type bitmask indicating the support of radio tech UMTS.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_UMTS = (1 << NETWORK_TYPE_UMTS);
+ public static final long NETWORK_TYPE_BITMASK_UMTS = (1 << (NETWORK_TYPE_UMTS -1));
/**
* network type bitmask indicating the support of radio tech TD_SCDMA.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_TD_SCDMA = (1 << NETWORK_TYPE_TD_SCDMA);
+ public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = (1 << (NETWORK_TYPE_TD_SCDMA -1));
// 4G
/**
* network type bitmask indicating the support of radio tech LTE.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_LTE = (1 << NETWORK_TYPE_LTE);
+ public static final long NETWORK_TYPE_BITMASK_LTE = (1 << (NETWORK_TYPE_LTE -1));
/**
* network type bitmask indicating the support of radio tech LTE CA (carrier aggregation).
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_LTE_CA = (1 << NETWORK_TYPE_LTE_CA);
+ public static final long NETWORK_TYPE_BITMASK_LTE_CA = (1 << (NETWORK_TYPE_LTE_CA -1));
/**
* network type bitmask indicating the support of radio tech NR(New Radio) 5G.
* @hide
*/
@SystemApi
- public static final int NETWORK_TYPE_BITMASK_NR = (1 << NETWORK_TYPE_NR);
+ public static final long NETWORK_TYPE_BITMASK_NR = (1 << (NETWORK_TYPE_NR -1));
+
+ /**
+ * network type bitmask indicating the support of radio tech IWLAN.
+ * @hide
+ */
+ @SystemApi
+ public static final long NETWORK_TYPE_BITMASK_IWLAN = (1 << (NETWORK_TYPE_IWLAN -1));
/**
* @return Modem supported radio access family bitmask
@@ -9855,11 +9853,11 @@ public class TelephonyManager {
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
- public @NetworkTypeBitMask int getSupportedRadioAccessFamily() {
+ public @NetworkTypeBitMask long getSupportedRadioAccessFamily() {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
- return telephony.getRadioAccessFamily(getSlotIndex(), getOpPackageName());
+ return (long) telephony.getRadioAccessFamily(getSlotIndex(), getOpPackageName());
} else {
// This can happen when the ITelephony interface is not up yet.
return NETWORK_TYPE_BITMASK_UNKNOWN;
@@ -10214,4 +10212,51 @@ public class TelephonyManager {
}
return true;
}
+
+ /**
+ * Switch configs to enable multi-sim or switch back to single-sim
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the
+ * calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ * @param numOfSims number of live SIMs we want to switch to
+ * @throws android.os.RemoteException
+ */
+ @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 (isMultisimCarrierRestricted()) {
+ Rlog.e(TAG, "switchMultiSimConfig not possible. It is restricted.");
+ return;
+ }
+
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ telephony.switchMultiSimConfig(numOfSims);
+ }
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "switchMultiSimConfig RemoteException", ex);
+ }
+ }
+
+ /**
+ * Get whether reboot is required or not after making changes to modem configurations.
+ * @Return {@code True} if reboot is required after making changes to modem configurations,
+ * otherwise return {@code False}.
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public boolean isRebootRequiredForModemConfigChange() {
+ try {
+ ITelephony service = getITelephony();
+ if (service != null) {
+ return service.isRebootRequiredForModemConfigChange();
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "isRebootRequiredForModemConfigChange RemoteException", e);
+ }
+ return false;
+ }
}
diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java
index 74d1e838f186..79572b9706a9 100644
--- a/telephony/java/android/telephony/data/DataService.java
+++ b/telephony/java/android/telephony/data/DataService.java
@@ -157,7 +157,10 @@ public abstract class DataService extends Service {
@Nullable LinkProperties linkProperties,
@Nullable DataServiceCallback callback) {
// The default implementation is to return unsupported.
- callback.onSetupDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED, null);
+ if (callback != null) {
+ callback.onSetupDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED,
+ null);
+ }
}
/**
@@ -176,7 +179,9 @@ public abstract class DataService extends Service {
public void deactivateDataCall(int cid, @DeactivateDataReason int reason,
@Nullable DataServiceCallback callback) {
// The default implementation is to return unsupported.
- callback.onDeactivateDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+ if (callback != null) {
+ callback.onDeactivateDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+ }
}
/**
@@ -190,7 +195,10 @@ public abstract class DataService extends Service {
public void setInitialAttachApn(DataProfile dataProfile, boolean isRoaming,
@Nullable DataServiceCallback callback) {
// The default implementation is to return unsupported.
- callback.onSetInitialAttachApnComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+ if (callback != null) {
+ callback.onSetInitialAttachApnComplete(
+ DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+ }
}
/**
@@ -206,7 +214,9 @@ public abstract class DataService extends Service {
public void setDataProfile(List<DataProfile> dps, boolean isRoaming,
@Nullable DataServiceCallback callback) {
// The default implementation is to return unsupported.
- callback.onSetDataProfileComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+ if (callback != null) {
+ callback.onSetDataProfileComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED);
+ }
}
/**
diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl
index a49d2d976d16..6ce9de4ca677 100755
--- a/telephony/java/com/android/internal/telephony/ISub.aidl
+++ b/telephony/java/com/android/internal/telephony/ISub.aidl
@@ -220,7 +220,7 @@ interface ISub {
* @hide
*
*/
- int setPreferredDataSubscriptionId(int subId);
+ void setPreferredDataSubscriptionId(int subId);
/**
* Get which subscription is preferred for cellular data.
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index c8fadae442a5..62f9999bc924 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1837,4 +1837,19 @@ interface ITelephony {
* @hide
*/
boolean isMultisimCarrierRestricted();
+
+ /**
+ * Switch configs to enable multi-sim or switch back to single-sim
+ * @hide
+ */
+ void switchMultiSimConfig(int numOfSims);
+ /**
+ * Get how many modems have been activated on the phone
+ * @hide
+ */
+ int getNumOfActiveSims();
+ /**
+ * Get if reboot is required upon altering modems configurations
+ */
+ boolean isRebootRequiredForModemConfigChange();
}
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index d9b206f49dd5..77b797956cf5 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -480,6 +480,7 @@ public interface RILConstants {
int RIL_REQUEST_SET_PREFERRED_DATA_MODEM = 204;
int RIL_REQUEST_EMERGENCY_DIAL = 205;
int RIL_REQUEST_GET_PHONE_CAPABILITY = 206;
+ int RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG = 207;
/* Responses begin */
int RIL_RESPONSE_ACKNOWLEDGEMENT = 800;
diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
index 6567ea764b50..603c4c2870d7 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
@@ -194,6 +194,13 @@ public interface TelephonyProperties
*/
static final String PROPERTY_MULTI_SIM_CONFIG = "persist.radio.multisim.config";
+ /**
+ * Property to indicate if reboot is required when changing modems configurations
+ * Type: String(true, false) default is false; most devices don't need reboot
+ */
+ String PROPERTY_REBOOT_REQUIRED_ON_MODEM_CHANGE =
+ "persist.radio.reboot_on_modem_change";
+
/**
* Property to store default subscription.
*/
diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
index 86af6422dad3..c1c598d52676 100644
--- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
+++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import android.content.pm.VersionedPackage;
import android.os.test.TestLooper;
import android.support.test.InstrumentationRegistry;
@@ -47,6 +48,7 @@ public class PackageWatchdogTest {
private static final String APP_B = "com.package.b";
private static final String APP_C = "com.package.c";
private static final String APP_D = "com.package.d";
+ private static final long VERSION_CODE = 1L;
private static final String OBSERVER_NAME_1 = "observer1";
private static final String OBSERVER_NAME_2 = "observer2";
private static final String OBSERVER_NAME_3 = "observer3";
@@ -193,7 +195,7 @@ public class PackageWatchdogTest {
// Then fail APP_A below the threshold
for (int i = 0; i < TRIGGER_FAILURE_COUNT - 1; i++) {
- watchdog.onPackageFailure(new String[]{APP_A});
+ watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
}
// Run handler so package failures are dispatched to observers
@@ -209,12 +211,10 @@ public class PackageWatchdogTest {
* the failed packages.
*/
@Test
- public void testPackageFailureNotifyNone() throws Exception {
+ public void testPackageFailureDifferentPackageNotifyNone() throws Exception {
PackageWatchdog watchdog = createWatchdog();
- TestObserver observer1 = new TestObserver(OBSERVER_NAME_1,
- PackageHealthObserverImpact.USER_IMPACT_HIGH);
- TestObserver observer2 = new TestObserver(OBSERVER_NAME_2,
- PackageHealthObserverImpact.USER_IMPACT_HIGH);
+ TestObserver observer1 = new TestObserver(OBSERVER_NAME_1);
+ TestObserver observer2 = new TestObserver(OBSERVER_NAME_2);
watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION);
@@ -222,7 +222,7 @@ public class PackageWatchdogTest {
// Then fail APP_C (not observed) above the threshold
for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
- watchdog.onPackageFailure(new String[]{APP_C});
+ watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_C, VERSION_CODE)));
}
// Run handler so package failures are dispatched to observers
@@ -234,6 +234,40 @@ public class PackageWatchdogTest {
}
/**
+ * Test package failure and does not notify any observer because the failed package version
+ * does not match the available rollback-from-version.
+ */
+ @Test
+ public void testPackageFailureDifferentVersionNotifyNone() throws Exception {
+ PackageWatchdog watchdog = createWatchdog();
+ long differentVersionCode = 2L;
+ TestObserver observer = new TestObserver(OBSERVER_NAME_1) {
+ public int onHealthCheckFailed(String packageName, long versionCode) {
+ if (versionCode == VERSION_CODE) {
+ // Only rollback for specific versionCode
+ return PackageHealthObserverImpact.USER_IMPACT_MEDIUM;
+ }
+ return PackageHealthObserverImpact.USER_IMPACT_NONE;
+ }
+ };
+
+ watchdog.startObservingHealth(observer, Arrays.asList(APP_A), SHORT_DURATION);
+
+ // Then fail APP_A (different version) above the threshold
+ for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
+ watchdog.onPackageFailure(Arrays.asList(
+ new VersionedPackage(APP_A, differentVersionCode)));
+ }
+
+ // Run handler so package failures are dispatched to observers
+ mTestLooper.dispatchAll();
+
+ // Verify that observers are not notified
+ assertEquals(0, observer.mFailedPackages.size());
+ }
+
+
+ /**
* Test package failure and notifies only least impact observers.
*/
@Test
@@ -260,7 +294,10 @@ public class PackageWatchdogTest {
// Then fail all apps above the threshold
for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
- watchdog.onPackageFailure(new String[]{APP_A, APP_B, APP_C, APP_D});
+ watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE),
+ new VersionedPackage(APP_B, VERSION_CODE),
+ new VersionedPackage(APP_C, VERSION_CODE),
+ new VersionedPackage(APP_D, VERSION_CODE)));
}
// Run handler so package failures are dispatched to observers
@@ -297,7 +334,7 @@ public class PackageWatchdogTest {
* <ul>
*/
@Test
- public void testPackageFailureNotifyLeastSuccessively() throws Exception {
+ public void testPackageFailureNotifyLeastImpactSuccessively() throws Exception {
PackageWatchdog watchdog = createWatchdog();
TestObserver observerFirst = new TestObserver(OBSERVER_NAME_1,
PackageHealthObserverImpact.USER_IMPACT_LOW);
@@ -310,7 +347,7 @@ public class PackageWatchdogTest {
// Then fail APP_A above the threshold
for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
- watchdog.onPackageFailure(new String[]{APP_A});
+ watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
}
// Run handler so package failures are dispatched to observers
mTestLooper.dispatchAll();
@@ -327,7 +364,7 @@ public class PackageWatchdogTest {
// Then fail APP_A again above the threshold
for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
- watchdog.onPackageFailure(new String[]{APP_A});
+ watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
}
// Run handler so package failures are dispatched to observers
mTestLooper.dispatchAll();
@@ -344,7 +381,7 @@ public class PackageWatchdogTest {
// Then fail APP_A again above the threshold
for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
- watchdog.onPackageFailure(new String[]{APP_A});
+ watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
}
// Run handler so package failures are dispatched to observers
mTestLooper.dispatchAll();
@@ -361,7 +398,7 @@ public class PackageWatchdogTest {
// Then fail APP_A again above the threshold
for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
- watchdog.onPackageFailure(new String[]{APP_A});
+ watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
}
// Run handler so package failures are dispatched to observers
mTestLooper.dispatchAll();
@@ -388,7 +425,7 @@ public class PackageWatchdogTest {
// Then fail APP_A above the threshold
for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) {
- watchdog.onPackageFailure(new String[]{APP_A});
+ watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE)));
}
// Run handler so package failures are dispatched to observers
@@ -420,11 +457,11 @@ public class PackageWatchdogTest {
mImpact = impact;
}
- public int onHealthCheckFailed(String packageName) {
+ public int onHealthCheckFailed(String packageName, long versionCode) {
return mImpact;
}
- public boolean execute(String packageName) {
+ public boolean execute(String packageName, long versionCode) {
mFailedPackages.add(packageName);
return true;
}
diff --git a/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java b/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java
index 02a439b5dd69..2310c829347e 100644
--- a/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java
+++ b/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java
@@ -17,17 +17,30 @@
package com.android.tests.rollback.testapp;
import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
import android.os.Bundle;
/**
* A crashing test app for testing apk rollback support.
*/
public class CrashingMainActivity extends Activity {
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
+ incrementCountAndBroadcast();
throw new RuntimeException("Intended force crash");
}
+
+ public void incrementCountAndBroadcast() {
+ SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = preferences.edit();
+ int count = preferences.getInt("crash_count", 0);
+ editor.putInt("crash_count", ++count).commit();
+
+ Intent intent = new Intent("com.android.tests.rollback.CRASH");
+ intent.putExtra("count", count);
+ sendBroadcast(intent);
+ }
}
diff --git a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
index e128a6ce9f7c..4b277ae850c5 100644
--- a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
+++ b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
@@ -17,6 +17,7 @@
package com.android.tests.rollback;
import android.Manifest;
+import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -36,7 +37,6 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -45,6 +45,7 @@ import java.util.Collections;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
/**
@@ -413,7 +414,6 @@ public class RollbackTest {
/**
* Test that app user data is rolled back.
- * TODO: Stop ignoring this test once user data rollback is supported.
*/
@Test
public void testUserDataRollback() throws Exception {
@@ -568,9 +568,7 @@ public class RollbackTest {
}
/**
- * Test rollback of multi-package installs.
- * TODO: Stop ignoring this test once support for multi-package rollback
- * is implemented.
+ * Test rollback of multi-package installs is implemented.
*/
@Test
public void testMultiPackage() throws Exception {
@@ -630,18 +628,20 @@ public class RollbackTest {
assertEquals(versionRolledBackTo, info.getVersionRolledBackTo().getLongVersionCode());
}
- // TODO(zezeozue): Stop ignoring after fixing race between rolling back and testing version
/**
* Test bad update automatic rollback.
*/
- @Ignore("Flaky")
@Test
public void testBadUpdateRollback() throws Exception {
+ BroadcastReceiver crashCountReceiver = null;
+ Context context = InstrumentationRegistry.getContext();
try {
RollbackTestUtils.adoptShellPermissionIdentity(
Manifest.permission.INSTALL_PACKAGES,
Manifest.permission.DELETE_PACKAGES,
- Manifest.permission.MANAGE_ROLLBACKS);
+ Manifest.permission.MANAGE_ROLLBACKS,
+ Manifest.permission.KILL_BACKGROUND_PROCESSES,
+ Manifest.permission.RESTART_PACKAGES);
RollbackManager rm = RollbackTestUtils.getRollbackManager();
// Prep installation of the test apps.
@@ -669,23 +669,52 @@ public class RollbackTest {
rm.getAvailableRollbacks(), TEST_APP_B);
assertRollbackInfoEquals(TEST_APP_B, 2, 1, rollbackB);
+ BlockingQueue<Integer> crashQueue = new SynchronousQueue<>();
+
+ IntentFilter crashCountFilter = new IntentFilter();
+ crashCountFilter.addAction("com.android.tests.rollback.CRASH");
+ crashCountFilter.addCategory(Intent.CATEGORY_DEFAULT);
+
+ crashCountReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ try {
+ // Sleep long enough for packagewatchdog to be notified of crash
+ Thread.sleep(1000);
+ // Kill app and close AppErrorDialog
+ ActivityManager am = context.getSystemService(ActivityManager.class);
+ am.killBackgroundProcesses(TEST_APP_A);
+ // Allow another package launch
+ crashQueue.offer(intent.getIntExtra("count", 0), 5, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ fail("Failed to communicate with test app");
+ }
+ }
+ };
+ context.registerReceiver(crashCountReceiver, crashCountFilter);
+
// Start apps PackageWatchdog#TRIGGER_FAILURE_COUNT times so TEST_APP_A crashes
- for (int i = 0; i < 5; i++) {
+ Integer crashCount = null;
+ do {
RollbackTestUtils.launchPackage(TEST_APP_A);
- Thread.sleep(1000);
- }
- Thread.sleep(1000);
+ crashCount = crashQueue.poll(5, TimeUnit.SECONDS);
+ if (crashCount == null) {
+ fail("Timed out waiting for crash signal from test app");
+ }
+ } while(crashCount < 5);
// TEST_APP_A is automatically rolled back by the RollbackPackageHealthObserver
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
// Instrumented app is still the package installer
- Context context = InstrumentationRegistry.getContext();
String installer = context.getPackageManager().getInstallerPackageName(TEST_APP_A);
assertEquals(INSTRUMENTED_APP, installer);
// TEST_APP_B is untouched
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
} finally {
RollbackTestUtils.dropShellPermissionIdentity();
+ if (crashCountReceiver != null) {
+ context.unregisterReceiver(crashCountReceiver);
+ }
}
}
diff --git a/tests/net/java/android/net/ip/InterfaceControllerTest.java b/tests/net/java/android/net/ip/InterfaceControllerTest.java
new file mode 100644
index 000000000000..d27a4f99cfd9
--- /dev/null
+++ b/tests/net/java/android/net/ip/InterfaceControllerTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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 android.net.ip;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.net.INetd;
+import android.net.InetAddresses;
+import android.net.InterfaceConfigurationParcel;
+import android.net.LinkAddress;
+import android.net.util.SharedLog;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class InterfaceControllerTest {
+ private static final String TEST_IFACE = "testif";
+ private static final String TEST_IPV4_ADDR = "192.168.123.28";
+ private static final int TEST_PREFIXLENGTH = 31;
+
+ @Mock private INetd mNetd;
+ @Mock private SharedLog mLog;
+ @Captor private ArgumentCaptor<InterfaceConfigurationParcel> mConfigCaptor;
+
+ private InterfaceController mController;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mController = new InterfaceController(TEST_IFACE, mNetd, mLog);
+
+ doNothing().when(mNetd).interfaceSetCfg(mConfigCaptor.capture());
+ }
+
+ @Test
+ public void testSetIPv4Address() throws Exception {
+ mController.setIPv4Address(
+ new LinkAddress(InetAddresses.parseNumericAddress(TEST_IPV4_ADDR),
+ TEST_PREFIXLENGTH));
+ verify(mNetd, times(1)).interfaceSetCfg(any());
+ final InterfaceConfigurationParcel parcel = mConfigCaptor.getValue();
+ assertEquals(TEST_IFACE, parcel.ifName);
+ assertEquals(TEST_IPV4_ADDR, parcel.ipv4Addr);
+ assertEquals(TEST_PREFIXLENGTH, parcel.prefixLength);
+ assertEquals("", parcel.hwAddr);
+ assertArrayEquals(new String[0], parcel.flags);
+ }
+
+ @Test
+ public void testClearIPv4Address() throws Exception {
+ mController.clearIPv4Address();
+ verify(mNetd, times(1)).interfaceSetCfg(any());
+ final InterfaceConfigurationParcel parcel = mConfigCaptor.getValue();
+ assertEquals(TEST_IFACE, parcel.ifName);
+ assertEquals("0.0.0.0", parcel.ipv4Addr);
+ assertEquals(0, parcel.prefixLength);
+ assertEquals("", parcel.hwAddr);
+ assertArrayEquals(new String[0], parcel.flags);
+ }
+}
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 923c7dd5fb94..3127d745b55d 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -57,6 +57,7 @@ import static android.net.NetworkPolicyManager.RULE_ALLOW_METERED;
import static android.net.NetworkPolicyManager.RULE_NONE;
import static android.net.NetworkPolicyManager.RULE_REJECT_ALL;
import static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
+import static android.net.shared.NetworkParcelableUtil.fromStableParcelable;
import static com.android.internal.util.TestUtils.waitForIdleHandler;
import static com.android.internal.util.TestUtils.waitForIdleLooper;
@@ -119,6 +120,7 @@ import android.net.NetworkFactory;
import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.NetworkMisc;
+import android.net.NetworkParcelable;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.net.NetworkStack;
@@ -482,8 +484,8 @@ public class ConnectivityServiceTest {
fail(e.getMessage());
}
- final ArgumentCaptor<Network> nmNetworkCaptor =
- ArgumentCaptor.forClass(Network.class);
+ final ArgumentCaptor<NetworkParcelable> nmNetworkCaptor =
+ ArgumentCaptor.forClass(NetworkParcelable.class);
final ArgumentCaptor<INetworkMonitorCallbacks> nmCbCaptor =
ArgumentCaptor.forClass(INetworkMonitorCallbacks.class);
doNothing().when(mNetworkStack).makeNetworkMonitor(
@@ -493,7 +495,7 @@ public class ConnectivityServiceTest {
mNetworkAgent = new NetworkAgent(mHandlerThread.getLooper(), mServiceContext,
"Mock-" + typeName, mNetworkInfo, mNetworkCapabilities,
- linkProperties, mScore, new NetworkMisc()) {
+ linkProperties, mScore, new NetworkMisc(), NetworkFactory.SerialNumber.NONE) {
@Override
public void unwanted() { mDisconnected.open(); }
@@ -523,7 +525,8 @@ public class ConnectivityServiceTest {
}
};
- assertEquals(mNetworkAgent.netId, nmNetworkCaptor.getValue().netId);
+ assertEquals(
+ mNetworkAgent.netId, fromStableParcelable(nmNetworkCaptor.getValue()).netId);
mNmCallbacks = nmCbCaptor.getValue();
try {
@@ -722,7 +725,7 @@ public class ConnectivityServiceTest {
/**
* A NetworkFactory that allows tests to wait until any in-flight NetworkRequest add or remove
* operations have been processed. Before ConnectivityService can add or remove any requests,
- * the factory must be told to expect those operations by calling expectAddRequests or
+ * the factory must be told to expect those operations by calling expectAddRequestsWithScores or
* expectRemoveRequests.
*/
private static class MockNetworkFactory extends NetworkFactory {
@@ -731,19 +734,22 @@ public class ConnectivityServiceTest {
private final AtomicBoolean mNetworkStarted = new AtomicBoolean(false);
// Used to expect that requests be removed or added on a separate thread, without sleeping.
- // Callers can call either expectAddRequests() or expectRemoveRequests() exactly once, then
- // cause some other thread to add or remove requests, then call waitForRequests(). We can
- // either expect requests to be added or removed, but not both, because CountDownLatch can
- // only count in one direction.
- private CountDownLatch mExpectations;
+ // Callers can call either expectAddRequestsWithScores() or expectRemoveRequests() exactly
+ // once, then cause some other thread to add or remove requests, then call
+ // waitForRequests().
+ // It is not possible to wait for both add and remove requests. When adding, the queue
+ // contains the expected score. When removing, the value is unused, all matters is the
+ // number of objects in the queue.
+ private final LinkedBlockingQueue<Integer> mExpectations;
// Whether we are currently expecting requests to be added or removed. Valid only if
- // mExpectations is non-null.
+ // mExpectations is non-empty.
private boolean mExpectingAdditions;
public MockNetworkFactory(Looper looper, Context context, String logTag,
NetworkCapabilities filter) {
super(looper, context, logTag, filter);
+ mExpectations = new LinkedBlockingQueue<>();
}
public int getMyRequestCount() {
@@ -775,69 +781,82 @@ public class ConnectivityServiceTest {
}
@Override
- protected void handleAddRequest(NetworkRequest request, int score) {
- // If we're expecting anything, we must be expecting additions.
- if (mExpectations != null && !mExpectingAdditions) {
- fail("Can't add requests while expecting requests to be removed");
- }
-
- // Add the request.
- super.handleAddRequest(request, score);
+ protected void handleAddRequest(NetworkRequest request, int score,
+ int factorySerialNumber) {
+ synchronized (mExpectations) {
+ final Integer expectedScore = mExpectations.poll(); // null if the queue is empty
+
+ assertNotNull("Added more requests than expected (" + request + " score : "
+ + score + ")", expectedScore);
+ // If we're expecting anything, we must be expecting additions.
+ if (!mExpectingAdditions) {
+ fail("Can't add requests while expecting requests to be removed");
+ }
+ if (expectedScore != score) {
+ fail("Expected score was " + expectedScore + " but actual was " + score
+ + " in added request");
+ }
- // Reduce the number of request additions we're waiting for.
- if (mExpectingAdditions) {
- assertTrue("Added more requests than expected", mExpectations.getCount() > 0);
- mExpectations.countDown();
+ // Add the request.
+ super.handleAddRequest(request, score, factorySerialNumber);
+ mExpectations.notify();
}
}
@Override
protected void handleRemoveRequest(NetworkRequest request) {
- // If we're expecting anything, we must be expecting removals.
- if (mExpectations != null && mExpectingAdditions) {
- fail("Can't remove requests while expecting requests to be added");
- }
+ synchronized (mExpectations) {
+ final Integer expectedScore = mExpectations.poll(); // null if the queue is empty
- // Remove the request.
- super.handleRemoveRequest(request);
+ assertTrue("Removed more requests than expected", expectedScore != null);
+ // If we're expecting anything, we must be expecting removals.
+ if (mExpectingAdditions) {
+ fail("Can't remove requests while expecting requests to be added");
+ }
- // Reduce the number of request removals we're waiting for.
- if (!mExpectingAdditions) {
- assertTrue("Removed more requests than expected", mExpectations.getCount() > 0);
- mExpectations.countDown();
+ // Remove the request.
+ super.handleRemoveRequest(request);
+ mExpectations.notify();
}
}
private void assertNoExpectations() {
- if (mExpectations != null) {
- fail("Can't add expectation, " + mExpectations.getCount() + " already pending");
+ if (mExpectations.size() != 0) {
+ fail("Can't add expectation, " + mExpectations.size() + " already pending");
}
}
- // Expects that count requests will be added.
- public void expectAddRequests(final int count) {
+ // Expects that requests with the specified scores will be added.
+ public void expectAddRequestsWithScores(final int... scores) {
assertNoExpectations();
mExpectingAdditions = true;
- mExpectations = new CountDownLatch(count);
+ for (int score : scores) {
+ mExpectations.add(score);
+ }
}
// Expects that count requests will be removed.
public void expectRemoveRequests(final int count) {
assertNoExpectations();
mExpectingAdditions = false;
- mExpectations = new CountDownLatch(count);
+ for (int i = 0; i < count; ++i) {
+ mExpectations.add(0); // For removals the score is ignored so any value will do.
+ }
}
// Waits for the expected request additions or removals to happen within a timeout.
public void waitForRequests() throws InterruptedException {
- assertNotNull("Nothing to wait for", mExpectations);
- mExpectations.await(TIMEOUT_MS, TimeUnit.MILLISECONDS);
- final long count = mExpectations.getCount();
+ final long deadline = SystemClock.elapsedRealtime() + TIMEOUT_MS;
+ synchronized (mExpectations) {
+ while (mExpectations.size() > 0 && SystemClock.elapsedRealtime() < deadline) {
+ mExpectations.wait(deadline - SystemClock.elapsedRealtime());
+ }
+ }
+ final long count = mExpectations.size();
final String msg = count + " requests still not " +
(mExpectingAdditions ? "added" : "removed") +
" after " + TIMEOUT_MS + " ms";
assertEquals(msg, 0, count);
- mExpectations = null;
}
public void waitForNetworkRequests(final int count) throws InterruptedException {
@@ -2268,6 +2287,12 @@ public class ConnectivityServiceTest {
callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent);
}
+ private int[] makeIntArray(final int size, final int value) {
+ final int[] array = new int[size];
+ Arrays.fill(array, value);
+ return array;
+ }
+
private void tryNetworkFactoryRequests(int capability) throws Exception {
// Verify NOT_RESTRICTED is set appropriately
final NetworkCapabilities nc = new NetworkRequest.Builder().addCapability(capability)
@@ -2289,7 +2314,7 @@ public class ConnectivityServiceTest {
mServiceContext, "testFactory", filter);
testFactory.setScoreFilter(40);
ConditionVariable cv = testFactory.getNetworkStartedCV();
- testFactory.expectAddRequests(1);
+ testFactory.expectAddRequestsWithScores(0);
testFactory.register();
testFactory.waitForNetworkRequests(1);
int expectedRequestCount = 1;
@@ -2300,7 +2325,7 @@ public class ConnectivityServiceTest {
assertFalse(testFactory.getMyStartRequested());
NetworkRequest request = new NetworkRequest.Builder().addCapability(capability).build();
networkCallback = new NetworkCallback();
- testFactory.expectAddRequests(1);
+ testFactory.expectAddRequestsWithScores(0); // New request
mCm.requestNetwork(request, networkCallback);
expectedRequestCount++;
testFactory.waitForNetworkRequests(expectedRequestCount);
@@ -2320,7 +2345,7 @@ public class ConnectivityServiceTest {
// When testAgent connects, ConnectivityService will re-send us all current requests with
// the new score. There are expectedRequestCount such requests, and we must wait for all of
// them.
- testFactory.expectAddRequests(expectedRequestCount);
+ testFactory.expectAddRequestsWithScores(makeIntArray(expectedRequestCount, 50));
testAgent.connect(false);
testAgent.addCapability(capability);
waitFor(cv);
@@ -2328,7 +2353,7 @@ public class ConnectivityServiceTest {
assertFalse(testFactory.getMyStartRequested());
// Bring in a bunch of requests.
- testFactory.expectAddRequests(10);
+ testFactory.expectAddRequestsWithScores(makeIntArray(10, 50));
assertEquals(expectedRequestCount, testFactory.getMyRequestCount());
ConnectivityManager.NetworkCallback[] networkCallbacks =
new ConnectivityManager.NetworkCallback[10];
@@ -2351,8 +2376,11 @@ public class ConnectivityServiceTest {
// Drop the higher scored network.
cv = testFactory.getNetworkStartedCV();
+ // With the default network disconnecting, the requests are sent with score 0 to factories.
+ testFactory.expectAddRequestsWithScores(makeIntArray(expectedRequestCount, 0));
testAgent.disconnect();
waitFor(cv);
+ testFactory.waitForNetworkRequests(expectedRequestCount);
assertEquals(expectedRequestCount, testFactory.getMyRequestCount());
assertTrue(testFactory.getMyStartRequested());
@@ -3174,22 +3202,23 @@ public class ConnectivityServiceTest {
testFactory.setScoreFilter(40);
// Register the factory and expect it to start looking for a network.
- testFactory.expectAddRequests(1);
+ testFactory.expectAddRequestsWithScores(0); // Score 0 as the request is not served yet.
testFactory.register();
testFactory.waitForNetworkRequests(1);
assertTrue(testFactory.getMyStartRequested());
// Bring up wifi. The factory stops looking for a network.
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
- testFactory.expectAddRequests(2); // Because the default request changes score twice.
+ // Score 60 - 40 penalty for not validated yet, then 60 when it validates
+ testFactory.expectAddRequestsWithScores(20, 60);
mWiFiNetworkAgent.connect(true);
- testFactory.waitForNetworkRequests(1);
+ testFactory.waitForRequests();
assertFalse(testFactory.getMyStartRequested());
ContentResolver cr = mServiceContext.getContentResolver();
// Turn on mobile data always on. The factory starts looking again.
- testFactory.expectAddRequests(1);
+ testFactory.expectAddRequestsWithScores(0); // Always on requests comes up with score 0
setAlwaysOnNetworks(true);
testFactory.waitForNetworkRequests(2);
assertTrue(testFactory.getMyStartRequested());
@@ -3197,7 +3226,7 @@ public class ConnectivityServiceTest {
// Bring up cell data and check that the factory stops looking.
assertLength(1, mCm.getAllNetworks());
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
- testFactory.expectAddRequests(2); // Because the cell request changes score twice.
+ testFactory.expectAddRequestsWithScores(10, 50); // Unvalidated, then validated
mCellNetworkAgent.connect(true);
cellNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
testFactory.waitForNetworkRequests(2);
diff --git a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
index 9578ded1a089..e877a8f7e6c1 100644
--- a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java
@@ -35,6 +35,7 @@ import android.net.ConnectivityManager;
import android.net.INetd;
import android.net.Network;
import android.net.NetworkCapabilities;
+import android.net.NetworkFactory;
import android.net.NetworkInfo;
import android.net.NetworkMisc;
import android.net.NetworkStack;
@@ -356,7 +357,8 @@ public class LingerMonitorTest {
caps.addCapability(0);
caps.addTransportType(transport);
NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null,
- caps, 50, mCtx, null, mMisc, mConnService, mNetd, mNMS);
+ caps, 50, mCtx, null, mMisc, mConnService, mNetd, mNMS,
+ NetworkFactory.SerialNumber.NONE);
nai.everValidated = true;
return nai;
}
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
index 3c3edda85e4f..672731cc2939 100644
--- a/tools/aapt/AaptAssets.cpp
+++ b/tools/aapt/AaptAssets.cpp
@@ -301,6 +301,7 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta
break;
}
// This is not alphabetical, so we fall through to variant
+ [[fallthrough]];
case 5:
case 6:
case 7:
diff --git a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
index 17847eaa0ca5..145e26923341 100644
--- a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
+++ b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
@@ -23,17 +23,9 @@ import android.security.Credentials;
import android.text.TextUtils;
import android.util.Log;
-import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -1126,6 +1118,12 @@ public class WifiEnterpriseConfig implements Parcelable {
String value = PASSWORD_KEY.equals(key) ? "<removed>" : mFields.get(key);
sb.append(key).append(" ").append(value).append("\n");
}
+ if (mEapMethod >= 0 && mEapMethod < Eap.strings.length) {
+ sb.append("eap_method: ").append(Eap.strings[mEapMethod]).append("\n");
+ }
+ if (mPhase2Method > 0 && mPhase2Method < Phase2.strings.length) {
+ sb.append("phase2_method: ").append(Phase2.strings[mPhase2Method]).append("\n");
+ }
return sb.toString();
}
diff --git a/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java b/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java
index c796e29e4e1a..c43818da359c 100644
--- a/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java
+++ b/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java
@@ -16,10 +16,14 @@
package android.net.wifi;
+import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* This class makes a subset of
* com.android.server.wifi.nano.WifiMetricsProto.WifiUsabilityStatsEntry parcelable.
@@ -28,6 +32,24 @@ import android.os.Parcelable;
*/
@SystemApi
public final class WifiUsabilityStatsEntry implements Parcelable {
+ /** {@hide} */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"PROBE_STATUS_"}, value = {
+ PROBE_STATUS_UNKNOWN,
+ PROBE_STATUS_NO_PROBE,
+ PROBE_STATUS_SUCCESS,
+ PROBE_STATUS_FAILURE})
+ public @interface ProbeStatus {}
+
+ /** Link probe status is unknown */
+ public static final int PROBE_STATUS_UNKNOWN = 0;
+ /** Link probe is not triggered */
+ public static final int PROBE_STATUS_NO_PROBE = 1;
+ /** Link probe is triggered and the result is success */
+ public static final int PROBE_STATUS_SUCCESS = 2;
+ /** Link probe is triggered and the result is failure */
+ public static final int PROBE_STATUS_FAILURE = 3;
+
/** Absolute milliseconds from device boot when these stats were sampled */
public final long timeStampMs;
/** The RSSI (in dBm) at the sample time */
@@ -68,6 +90,14 @@ public final class WifiUsabilityStatsEntry implements Parcelable {
public final long totalRadioOnFreqTimeMs;
/** The total number of beacons received from the last radio chip reset */
public final long totalBeaconRx;
+ /** The status of link probe since last stats update */
+ public final int probeStatusSinceLastUpdate;
+ /** The elapsed time of the most recent link probe since last stats update */
+ public final int probeElapsedTimeMsSinceLastUpdate;
+ /** The MCS rate of the most recent link probe since last stats update */
+ public final int probeMcsRateSinceLastUpdate;
+ /** Rx link speed at the sample time in Mbps */
+ public final int rxLinkSpeedMbps;
/** Constructor function {@hide} */
public WifiUsabilityStatsEntry(long timeStampMs, int rssi,
@@ -76,7 +106,9 @@ public final class WifiUsabilityStatsEntry implements Parcelable {
long totalRadioTxTimeMs, long totalRadioRxTimeMs, long totalScanTimeMs,
long totalNanScanTimeMs, long totalBackgroundScanTimeMs, long totalRoamScanTimeMs,
long totalPnoScanTimeMs, long totalHotspot2ScanTimeMs, long totalCcaBusyFreqTimeMs,
- long totalRadioOnFreqTimeMs, long totalBeaconRx) {
+ long totalRadioOnFreqTimeMs, long totalBeaconRx,
+ @ProbeStatus int probeStatusSinceLastUpdate, int probeElapsedTimeMsSinceLastUpdate,
+ int probeMcsRateSinceLastUpdate, int rxLinkSpeedMbps) {
this.timeStampMs = timeStampMs;
this.rssi = rssi;
this.linkSpeedMbps = linkSpeedMbps;
@@ -96,6 +128,10 @@ public final class WifiUsabilityStatsEntry implements Parcelable {
this.totalCcaBusyFreqTimeMs = totalCcaBusyFreqTimeMs;
this.totalRadioOnFreqTimeMs = totalRadioOnFreqTimeMs;
this.totalBeaconRx = totalBeaconRx;
+ this.probeStatusSinceLastUpdate = probeStatusSinceLastUpdate;
+ this.probeElapsedTimeMsSinceLastUpdate = probeElapsedTimeMsSinceLastUpdate;
+ this.probeMcsRateSinceLastUpdate = probeMcsRateSinceLastUpdate;
+ this.rxLinkSpeedMbps = rxLinkSpeedMbps;
}
/** Implement the Parcelable interface */
@@ -124,6 +160,10 @@ public final class WifiUsabilityStatsEntry implements Parcelable {
dest.writeLong(totalCcaBusyFreqTimeMs);
dest.writeLong(totalRadioOnFreqTimeMs);
dest.writeLong(totalBeaconRx);
+ dest.writeInt(probeStatusSinceLastUpdate);
+ dest.writeInt(probeElapsedTimeMsSinceLastUpdate);
+ dest.writeInt(probeMcsRateSinceLastUpdate);
+ dest.writeInt(rxLinkSpeedMbps);
}
/** Implement the Parcelable interface */
@@ -137,7 +177,8 @@ public final class WifiUsabilityStatsEntry implements Parcelable {
in.readLong(), in.readLong(), in.readLong(),
in.readLong(), in.readLong(), in.readLong(),
in.readLong(), in.readLong(), in.readLong(),
- in.readLong(), in.readLong()
+ in.readLong(), in.readLong(), in.readInt(),
+ in.readInt(), in.readInt(), in.readInt()
);
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
index 052ab99da905..63f47e7a7fea 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -190,6 +190,10 @@ public class WifiP2pManager {
* the network info in the form of a {@link android.net.NetworkInfo}. A third extra provides
* the details of the group.
*
+ * All of these permissions are required to receive this broadcast:
+ * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
+ * {@link android.Manifest.permission#ACCESS_WIFI_STATE}
+ *
* @see #EXTRA_WIFI_P2P_INFO
* @see #EXTRA_NETWORK_INFO
* @see #EXTRA_WIFI_P2P_GROUP
@@ -222,6 +226,10 @@ public class WifiP2pManager {
* Broadcast intent action indicating that the available peer list has changed. This
* can be sent as a result of peers being found, lost or updated.
*
+ * All of these permissions are required to receive this broadcast:
+ * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
+ * {@link android.Manifest.permission#ACCESS_WIFI_STATE}
+ *
* <p> An extra {@link #EXTRA_P2P_DEVICE_LIST} provides the full list of
* current peers. The full list of peers can also be obtained any time with
* {@link #requestPeers}.
@@ -238,7 +246,7 @@ public class WifiP2pManager {
*
* <p>Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
*/
- public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList";
+ public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList";
/**
* Broadcast intent action indicating that peer discovery has either started or stopped.
@@ -285,6 +293,18 @@ public class WifiP2pManager {
/**
* Broadcast intent action indicating that this device details have changed.
+ *
+ * <p> An extra {@link #EXTRA_WIFI_P2P_DEVICE} provides this device details.
+ * The valid device details can also be obtained with
+ * {@link #requestDeviceInfo(Channel, DeviceInfoListener)} when p2p is enabled.
+ * To get information notifications on P2P getting enabled refers
+ * {@link #WIFI_P2P_STATE_ENABLED}.
+ *
+ * All of these permissions are required to receive this broadcast:
+ * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
+ * {@link android.Manifest.permission#ACCESS_WIFI_STATE}
+ *
+ * @see #EXTRA_WIFI_P2P_DEVICE
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION =
@@ -546,6 +566,11 @@ public class WifiP2pManager {
/** @hide */
public static final int UPDATE_CHANNEL_INFO = BASE + 96;
+ /** @hide */
+ public static final int REQUEST_DEVICE_INFO = BASE + 97;
+ /** @hide */
+ public static final int RESPONSE_DEVICE_INFO = BASE + 98;
+
/**
* Create a new WifiP2pManager instance. Applications use
* {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
@@ -783,6 +808,17 @@ public class WifiP2pManager {
void onOngoingPeerAvailable(WifiP2pConfig peerConfig);
}
+ /** Interface for callback invocation when {@link android.net.wifi.p2p.WifiP2pDevice}
+ * is available in response to {@link #requestDeviceInfo(Channel, DeviceInfoListener)}.
+ */
+ public interface DeviceInfoListener {
+ /**
+ * The requested {@link android.net.wifi.p2p.WifiP2pDevice} is available.
+ * @param wifiP2pDevice Wi-Fi p2p {@link android.net.wifi.p2p.WifiP2pDevice}
+ */
+ void onDeviceInfoAvailable(WifiP2pDevice wifiP2pDevice);
+ }
+
/**
* A channel that connects the application to the Wifi p2p framework.
* Most p2p operations require a Channel as an argument. An instance of Channel is obtained
@@ -988,6 +1024,12 @@ public class WifiP2pManager {
.onNetworkInfoAvailable((NetworkInfo) message.obj);
}
break;
+ case RESPONSE_DEVICE_INFO:
+ if (listener != null) {
+ ((DeviceInfoListener) listener)
+ .onDeviceInfoAvailable((WifiP2pDevice) message.obj);
+ }
+ break;
default:
Log.d(TAG, "Ignored " + message);
break;
@@ -1826,4 +1868,29 @@ public class WifiP2pManager {
if (listener == null) throw new IllegalArgumentException("This listener cannot be null.");
c.mAsyncChannel.sendMessage(REQUEST_NETWORK_INFO, 0, c.putListener(listener));
}
+
+ /**
+ * Request Device Info
+ *
+ * <p> This method provides the device info
+ * in the form of a {@link android.net.wifi.p2p.WifiP2pDevice}.
+ * Valid {@link android.net.wifi.p2p.WifiP2pDevice} is returned when p2p is enabled.
+ * To get information notifications on P2P getting enabled refers
+ * {@link #WIFI_P2P_STATE_ENABLED}.
+ *
+ * <p> This {@link android.net.wifi.p2p.WifiP2pDevice} is returned using the
+ * {@link DeviceInfoListener} listener.
+ *
+ * <p> This information is also included in the {@link #WIFI_P2P_THIS_DEVICE_CHANGED_ACTION}
+ * broadcast event with extra {@link #EXTRA_WIFI_P2P_DEVICE}.
+ *
+ * @param c is the channel created at {@link #initialize(Context, Looper, ChannelListener)}.
+ * @param listener for callback when network info is available.
+ */
+ @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
+ public void requestDeviceInfo(@NonNull Channel c, @NonNull DeviceInfoListener listener) {
+ checkChannel(c);
+ if (listener == null) throw new IllegalArgumentException("This listener cannot be null.");
+ c.mAsyncChannel.sendMessage(REQUEST_DEVICE_INFO, 0, c.putListener(listener));
+ }
}
diff --git a/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java b/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java
index a947b5568a16..a22f8ce853bf 100644
--- a/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java
@@ -74,7 +74,7 @@ public class WifiUsabilityStatsEntryTest {
private static WifiUsabilityStatsEntry createResult() {
return new WifiUsabilityStatsEntry(
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22
);
}
@@ -100,5 +100,10 @@ public class WifiUsabilityStatsEntryTest {
assertEquals(expected.totalCcaBusyFreqTimeMs, actual.totalCcaBusyFreqTimeMs);
assertEquals(expected.totalRadioOnFreqTimeMs, actual.totalRadioOnFreqTimeMs);
assertEquals(expected.totalBeaconRx, actual.totalBeaconRx);
+ assertEquals(expected.probeStatusSinceLastUpdate, actual.probeStatusSinceLastUpdate);
+ assertEquals(expected.probeElapsedTimeMsSinceLastUpdate,
+ actual.probeElapsedTimeMsSinceLastUpdate);
+ assertEquals(expected.probeMcsRateSinceLastUpdate, actual.probeMcsRateSinceLastUpdate);
+ assertEquals(expected.rxLinkSpeedMbps, actual.rxLinkSpeedMbps);
}
}