summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp5
-rw-r--r--apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java79
-rw-r--r--apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java16
-rw-r--r--api/current.txt962
-rw-r--r--api/removed.txt7
-rw-r--r--api/system-current.txt65
-rw-r--r--api/test-current.txt26
-rw-r--r--cmds/incidentd/src/Section.cpp6
-rw-r--r--cmds/statsd/Android.mk7
-rw-r--r--cmds/statsd/src/StatsLogProcessor.cpp84
-rw-r--r--cmds/statsd/src/StatsLogProcessor.h4
-rw-r--r--cmds/statsd/src/StatsService.cpp21
-rw-r--r--cmds/statsd/src/StatsService.h10
-rw-r--r--cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp2
-rw-r--r--cmds/statsd/src/atoms.proto6
-rw-r--r--cmds/statsd/src/external/StatsPullerManagerImpl.cpp5
-rw-r--r--cmds/statsd/src/guardrail/StatsdStats.h10
-rw-r--r--cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp5
-rw-r--r--cmds/statsd/src/packages/UidMap.cpp76
-rw-r--r--cmds/statsd/src/packages/UidMap.h17
-rw-r--r--cmds/statsd/src/storage/StorageManager.cpp54
-rw-r--r--cmds/statsd/src/storage/StorageManager.h2
-rw-r--r--cmds/statsd/tests/StatsService_test.cpp67
-rw-r--r--cmds/statsd/tests/UidMap_test.cpp54
-rw-r--r--config/boot-image-profile.txt2
-rw-r--r--config/hiddenapi-light-greylist.txt85
-rw-r--r--config/hiddenapi-vendor-list.txt166
-rw-r--r--core/java/android/app/ActivityThread.java68
-rw-r--r--core/java/android/app/ActivityView.java11
-rw-r--r--core/java/android/app/AppOpsManager.java15
-rw-r--r--core/java/android/app/ApplicationPackageManager.java55
-rw-r--r--core/java/android/app/ClientTransactionHandler.java14
-rw-r--r--core/java/android/app/Notification.java336
-rw-r--r--core/java/android/app/RemoteInput.java14
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java11
-rw-r--r--core/java/android/app/admin/IDevicePolicyManager.aidl2
-rw-r--r--core/java/android/app/job/JobParameters.java11
-rw-r--r--core/java/android/app/servertransaction/StopActivityItem.java2
-rw-r--r--core/java/android/app/servertransaction/TransactionExecutor.java3
-rw-r--r--core/java/android/app/servertransaction/TransactionExecutorHelper.java27
-rw-r--r--core/java/android/app/slice/Slice.java166
-rw-r--r--core/java/android/app/slice/SliceItem.java19
-rw-r--r--core/java/android/app/slice/SliceProvider.java9
-rw-r--r--core/java/android/app/usage/UsageEvents.java15
-rw-r--r--core/java/android/app/usage/UsageStats.java20
-rw-r--r--core/java/android/app/usage/UsageStatsManager.java58
-rw-r--r--core/java/android/bluetooth/BluetoothAdapter.java4
-rw-r--r--core/java/android/bluetooth/BluetoothHearingAid.java71
-rw-r--r--core/java/android/content/ContentResolver.java5
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl12
-rw-r--r--core/java/android/content/pm/PackageManager.java126
-rw-r--r--core/java/android/content/pm/PackageUserState.java22
-rw-r--r--core/java/android/database/sqlite/SQLiteConnection.java4
-rw-r--r--core/java/android/database/sqlite/SQLiteConnectionPool.java6
-rw-r--r--core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java5
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java71
-rw-r--r--core/java/android/hardware/camera2/CameraDevice.java3
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java187
-rw-r--r--core/java/android/hardware/camera2/CameraMetadata.java8
-rw-r--r--core/java/android/hardware/camera2/CaptureRequest.java4
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java67
-rw-r--r--core/java/android/hardware/camera2/dispatch/ArgumentReplacingDispatcher.java85
-rw-r--r--core/java/android/hardware/camera2/dispatch/BroadcastDispatcher.java64
-rw-r--r--core/java/android/hardware/camera2/dispatch/Dispatchable.java35
-rw-r--r--core/java/android/hardware/camera2/dispatch/DuckTypingDispatcher.java55
-rw-r--r--core/java/android/hardware/camera2/dispatch/HandlerDispatcher.java85
-rw-r--r--core/java/android/hardware/camera2/dispatch/InvokeDispatcher.java55
-rw-r--r--core/java/android/hardware/camera2/dispatch/MethodNameInvoker.java97
-rw-r--r--core/java/android/hardware/camera2/dispatch/package.html3
-rw-r--r--core/java/android/hardware/camera2/impl/CallbackProxies.java179
-rw-r--r--core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java176
-rw-r--r--core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java7
-rw-r--r--core/java/android/hardware/camera2/impl/CameraDeviceImpl.java279
-rw-r--r--core/java/android/hardware/camera2/params/SessionConfiguration.java25
-rw-r--r--core/java/android/hardware/camera2/utils/TaskDrainer.java26
-rw-r--r--core/java/android/hardware/camera2/utils/TaskSingleDrainer.java19
-rw-r--r--core/java/android/hardware/display/DisplayManager.java39
-rw-r--r--core/java/android/hardware/display/DisplayManagerGlobal.java26
-rw-r--r--core/java/android/hardware/display/IDisplayManager.aidl8
-rw-r--r--core/java/android/hardware/location/IFusedLocationHardware.aidl129
-rw-r--r--core/java/android/hardware/location/IFusedLocationHardwareSink.aidl53
-rw-r--r--core/java/android/hardware/soundtrigger/SoundTrigger.java227
-rw-r--r--core/java/android/net/ConnectivityManager.java7
-rw-r--r--core/java/android/net/IIpSecService.aidl5
-rw-r--r--core/java/android/net/IpSecAlgorithm.java15
-rw-r--r--core/java/android/net/IpSecManager.java64
-rw-r--r--core/java/android/net/IpSecTransform.java12
-rw-r--r--core/java/android/net/NetworkRequest.java14
-rw-r--r--core/java/android/net/SntpClient.java16
-rw-r--r--core/java/android/os/BaseBundle.java17
-rw-r--r--core/java/android/os/BatteryStats.java15
-rw-r--r--core/java/android/os/Binder.java4
-rw-r--r--core/java/android/os/IPowerManager.aidl3
-rw-r--r--core/java/android/os/PowerManager.java13
-rw-r--r--core/java/android/privacy/internal/rappor/RapporEncoder.java17
-rw-r--r--core/java/android/provider/Settings.java105
-rw-r--r--core/java/android/security/keystore/recovery/KeyChainProtectionParams.java9
-rw-r--r--core/java/android/security/keystore/recovery/KeyChainSnapshot.java34
-rw-r--r--core/java/android/security/keystore/recovery/KeyDerivationParams.java57
-rw-r--r--core/java/android/security/keystore/recovery/RecoveryController.java98
-rw-r--r--core/java/android/security/keystore/recovery/RecoverySession.java120
-rw-r--r--core/java/android/security/keystore/recovery/TrustedRootCertificates.java (renamed from core/java/android/security/backup/TrustedRootCertificates.java)28
-rw-r--r--core/java/android/security/keystore/recovery/X509CertificateParsingUtils.java (renamed from core/java/android/security/backup/X509CertificateParsingUtils.java)2
-rw-r--r--core/java/android/service/autofill/AutofillService.java5
-rw-r--r--core/java/android/service/autofill/AutofillServiceHelper.java35
-rw-r--r--core/java/android/service/autofill/AutofillServiceInfo.java8
-rw-r--r--core/java/android/service/autofill/Dataset.java35
-rw-r--r--core/java/android/service/autofill/FillResponse.java70
-rw-r--r--core/java/android/service/autofill/SaveInfo.java55
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java36
-rw-r--r--core/java/android/service/notification/NotificationRankingUpdate.java10
-rw-r--r--core/java/android/service/trust/TrustAgentService.java2
-rw-r--r--core/java/android/text/DynamicLayout.java7
-rw-r--r--core/java/android/text/MeasuredParagraph.java18
-rw-r--r--core/java/android/text/PrecomputedText.java152
-rw-r--r--core/java/android/text/SpannableString.java20
-rw-r--r--core/java/android/text/SpannableStringInternal.java81
-rw-r--r--core/java/android/text/SpannedString.java19
-rw-r--r--core/java/android/text/StaticLayout.java30
-rw-r--r--core/java/android/text/util/Linkify.java3
-rw-r--r--core/java/android/util/DebugUtils.java12
-rw-r--r--core/java/android/util/FeatureFlagUtils.java2
-rw-r--r--core/java/android/util/NtpTrustedTime.java19
-rw-r--r--core/java/android/view/IWindowManager.aidl10
-rw-r--r--core/java/android/view/RenderNode.java7
-rw-r--r--core/java/android/view/SurfaceControl.java6
-rw-r--r--core/java/android/view/View.java22
-rw-r--r--core/java/android/view/WindowManager.java14
-rw-r--r--core/java/android/view/textclassifier/SystemTextClassifier.java15
-rw-r--r--core/java/android/view/textclassifier/TextClassification.java19
-rw-r--r--core/java/android/view/textclassifier/TextClassifier.java66
-rw-r--r--core/java/android/view/textclassifier/TextClassifierImpl.java44
-rw-r--r--core/java/android/view/textclassifier/TextLinks.java78
-rw-r--r--core/java/android/view/textservice/SpellCheckerSession.java8
-rw-r--r--core/java/android/webkit/TracingConfig.java43
-rw-r--r--core/java/android/webkit/TracingController.java5
-rw-r--r--core/java/android/webkit/WebView.java8
-rw-r--r--core/java/android/widget/AbsListView.java2
-rw-r--r--core/java/android/widget/Magnifier.java19
-rw-r--r--core/java/android/widget/MediaControlView2.java3
-rw-r--r--core/java/android/widget/SelectionActionModeHelper.java2
-rw-r--r--core/java/android/widget/TextView.java61
-rw-r--r--core/java/android/widget/VideoView2.java3
-rw-r--r--core/java/com/android/internal/app/ISoundTriggerService.aidl8
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodUtils.java22
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java182
-rw-r--r--core/java/com/android/internal/os/BinderCallsStats.java272
-rw-r--r--core/java/com/android/internal/os/WrapperInit.java8
-rw-r--r--core/java/com/android/internal/util/FunctionalUtils.java31
-rw-r--r--core/java/com/android/internal/util/NotificationColorUtil.java20
-rw-r--r--core/java/com/android/internal/util/NotificationMessagingUtil.java36
-rw-r--r--core/java/com/android/internal/util/ProviderAccessStats.java134
-rw-r--r--core/java/com/android/internal/widget/ILockSettings.aidl7
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java146
-rw-r--r--core/jni/android/graphics/AnimatedImageDrawable.cpp41
-rw-r--r--core/jni/android/graphics/ColorFilter.cpp4
-rw-r--r--core/jni/android/graphics/ImageDecoder.cpp157
-rw-r--r--core/jni/android/graphics/ImageDecoder.h7
-rw-r--r--core/jni/android_graphics_Canvas.cpp11
-rw-r--r--core/jni/android_text_MeasuredParagraph.cpp29
-rw-r--r--core/jni/android_view_RenderNode.cpp5
-rw-r--r--core/jni/android_view_SurfaceControl.cpp10
-rw-r--r--core/jni/com_android_internal_os_Zygote.cpp4
-rw-r--r--core/proto/android/app/job/enums.proto (renamed from core/proto/android/app/jobparameters.proto)25
-rw-r--r--core/proto/android/os/batterystats.proto4
-rw-r--r--core/proto/android/os/incident.proto20
-rw-r--r--core/proto/android/providers/settings.proto10
-rw-r--r--core/proto/android/server/activitymanagerservice.proto46
-rw-r--r--core/proto/android/server/animationadapter.proto2
-rw-r--r--core/proto/android/server/appwindowthumbnail.proto2
-rw-r--r--core/proto/android/server/jobscheduler.proto6
-rw-r--r--core/proto/android/server/surfaceanimator.proto2
-rw-r--r--core/proto/android/server/windowmanagerservice.proto2
-rw-r--r--core/proto/android/server/windowmanagertrace.proto2
-rw-r--r--core/proto/android/service/package.proto1
-rw-r--r--core/res/AndroidManifest.xml41
-rw-r--r--core/res/res/layout/autofill_save.xml8
-rw-r--r--core/res/res/layout/shutdown_dialog.xml2
-rw-r--r--core/res/res/values-af/strings.xml177
-rw-r--r--core/res/res/values-az/strings.xml172
-rw-r--r--core/res/res/values-be/strings.xml148
-rw-r--r--core/res/res/values-bg/strings.xml177
-rw-r--r--core/res/res/values-bn/strings.xml210
-rw-r--r--core/res/res/values-bs/strings.xml195
-rw-r--r--core/res/res/values-ca/strings.xml198
-rw-r--r--core/res/res/values-de/strings.xml196
-rw-r--r--core/res/res/values-en-rAU/strings.xml168
-rw-r--r--core/res/res/values-en-rCA/strings.xml174
-rw-r--r--core/res/res/values-en-rGB/strings.xml168
-rw-r--r--core/res/res/values-en-rIN/strings.xml168
-rw-r--r--core/res/res/values-en-rXC/strings.xml172
-rw-r--r--core/res/res/values-es-rUS/strings.xml194
-rw-r--r--core/res/res/values-es/strings.xml191
-rw-r--r--core/res/res/values-et/strings.xml177
-rw-r--r--core/res/res/values-eu/strings.xml189
-rw-r--r--core/res/res/values-fi/strings.xml177
-rw-r--r--core/res/res/values-fr-rCA/strings.xml198
-rw-r--r--core/res/res/values-fr/strings.xml190
-rw-r--r--core/res/res/values-gl/strings.xml204
-rw-r--r--core/res/res/values-gu/strings.xml190
-rw-r--r--core/res/res/values-hi/strings.xml200
-rw-r--r--core/res/res/values-hr/strings.xml181
-rw-r--r--core/res/res/values-hu/strings.xml181
-rw-r--r--core/res/res/values-in/strings.xml179
-rw-r--r--core/res/res/values-it/strings.xml179
-rw-r--r--core/res/res/values-ja/strings.xml181
-rw-r--r--core/res/res/values-ka/strings.xml177
-rw-r--r--core/res/res/values-kk/strings.xml177
-rw-r--r--core/res/res/values-km/strings.xml201
-rw-r--r--core/res/res/values-kn/strings.xml190
-rw-r--r--core/res/res/values-ko/strings.xml181
-rw-r--r--core/res/res/values-ky/strings.xml198
-rw-r--r--core/res/res/values-lo/strings.xml181
-rw-r--r--core/res/res/values-mk/strings.xml198
-rw-r--r--core/res/res/values-ml/strings.xml198
-rw-r--r--core/res/res/values-mn/strings.xml179
-rw-r--r--core/res/res/values-mr/strings.xml206
-rw-r--r--core/res/res/values-my/strings.xml191
-rw-r--r--core/res/res/values-nb/strings.xml198
-rw-r--r--core/res/res/values-ne/strings.xml210
-rw-r--r--core/res/res/values-nl/strings.xml198
-rw-r--r--core/res/res/values-pa/strings.xml198
-rw-r--r--core/res/res/values-pl/strings.xml197
-rw-r--r--core/res/res/values-pt-rBR/strings.xml156
-rw-r--r--core/res/res/values-pt-rPT/strings.xml177
-rw-r--r--core/res/res/values-pt/strings.xml198
-rw-r--r--core/res/res/values-ro/strings.xml173
-rw-r--r--core/res/res/values-si/strings.xml181
-rw-r--r--core/res/res/values-ta/strings.xml196
-rw-r--r--core/res/res/values-te/strings.xml194
-rw-r--r--core/res/res/values-th/strings.xml177
-rw-r--r--core/res/res/values-ur/strings.xml200
-rw-r--r--core/res/res/values-uz/strings.xml194
-rw-r--r--core/res/res/values-vi/strings.xml184
-rw-r--r--core/res/res/values-zh-rHK/strings.xml179
-rw-r--r--core/res/res/values-zh-rTW/strings.xml183
-rw-r--r--core/res/res/values/attrs.xml8
-rw-r--r--core/res/res/values/colors.xml7
-rw-r--r--core/res/res/values/config.xml6
-rw-r--r--core/res/res/values/public.xml2
-rw-r--r--core/res/res/values/strings.xml50
-rw-r--r--core/res/res/values/styles_material.xml3
-rw-r--r--core/res/res/values/symbols.xml17
-rw-r--r--core/res/res/values/themes_device_defaults.xml4
-rw-r--r--core/tests/coretests/src/android/app/activity/ActivityThreadTest.java41
-rw-r--r--core/tests/coretests/src/android/net/SntpClientTest.java31
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java11
-rw-r--r--core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java (renamed from core/tests/coretests/src/android/security/backup/TrustedRootCertificatesTest.java)8
-rw-r--r--core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java (renamed from core/tests/coretests/src/android/security/backup/X509CertificateParsingUtilsTest.java)4
-rw-r--r--core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java163
-rw-r--r--core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java153
-rw-r--r--core/tests/coretests/src/android/text/util/LinkifyTest.java60
-rw-r--r--core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java39
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java1
-rw-r--r--core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java194
-rw-r--r--core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java3
-rw-r--r--core/tests/privacytests/Android.mk2
-rw-r--r--core/tests/privacytests/src/android/privacy/LongitudinalReportingEncoderTest.java48
-rw-r--r--core/tests/privacytests/src/android/privacy/RapporEncoderTest.java17
-rw-r--r--data/etc/hiddenapi-package-whitelist.xml25
-rw-r--r--graphics/java/android/graphics/Canvas.java4
-rw-r--r--graphics/java/android/graphics/ImageDecoder.java187
-rw-r--r--graphics/java/android/graphics/Picture.java2
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedImageDrawable.java9
-rw-r--r--libs/androidfw/ResourceUtils.cpp3
-rw-r--r--libs/androidfw/tests/ResourceUtils_test.cpp25
-rw-r--r--libs/hwui/RenderProperties.h4
-rw-r--r--libs/hwui/hwui/AnimatedImageDrawable.cpp4
-rw-r--r--libs/hwui/hwui/AnimatedImageDrawable.h10
-rw-r--r--libs/hwui/hwui/Canvas.h2
-rw-r--r--libs/hwui/pipeline/skia/SkiaPipeline.cpp3
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp10
-rw-r--r--location/java/android/location/GnssMeasurement.java135
-rw-r--r--location/java/android/location/LocationManager.java55
-rw-r--r--location/java/android/location/LocationRequest.java3
-rw-r--r--location/lib/Android.mk22
-rw-r--r--location/lib/java/com/android/location/provider/ActivityChangedEvent.java1
-rw-r--r--location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java1
-rw-r--r--location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java1
-rw-r--r--location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java1
-rw-r--r--location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java1
-rw-r--r--location/lib/java/com/android/location/provider/FusedLocationHardware.java371
-rw-r--r--location/lib/java/com/android/location/provider/FusedLocationHardwareSink.java67
-rw-r--r--location/lib/java/com/android/location/provider/FusedProvider.java24
-rw-r--r--location/lib/java/com/android/location/provider/GeocodeProvider.java1
-rw-r--r--location/lib/java/com/android/location/provider/GeofenceProvider.java1
-rw-r--r--location/lib/java/com/android/location/provider/GmsFusedBatchOptions.java114
-rw-r--r--location/lib/java/com/android/location/provider/LocationProviderBase.java1
-rw-r--r--location/lib/java/com/android/location/provider/ProviderPropertiesUnbundled.java1
-rw-r--r--location/lib/java/com/android/location/provider/ProviderRequestUnbundled.java1
-rw-r--r--media/java/android/media/AudioManager.java1
-rw-r--r--media/java/android/media/AudioManagerInternal.java2
-rw-r--r--media/java/android/media/AudioPresentation.java17
-rw-r--r--media/java/android/media/AudioSystem.java3
-rw-r--r--media/java/android/media/AudioTrack.java9
-rw-r--r--media/java/android/media/DataSourceDesc.java1
-rw-r--r--media/java/android/media/Media2DataSource.java1
-rw-r--r--media/java/android/media/MediaBrowser2.java5
-rw-r--r--media/java/android/media/MediaCodec.java95
-rw-r--r--media/java/android/media/MediaController2.java9
-rw-r--r--media/java/android/media/MediaFormat.java46
-rw-r--r--media/java/android/media/MediaItem2.java6
-rw-r--r--media/java/android/media/MediaLibraryService2.java10
-rw-r--r--media/java/android/media/MediaMetadata2.java9
-rw-r--r--media/java/android/media/MediaMetadataRetriever.java143
-rw-r--r--media/java/android/media/MediaPlayer2.java1
-rw-r--r--media/java/android/media/MediaPlayerBase.java4
-rw-r--r--media/java/android/media/MediaPlaylistAgent.java14
-rw-r--r--media/java/android/media/MediaSession2.java40
-rw-r--r--media/java/android/media/MediaSessionService2.java8
-rw-r--r--media/java/android/media/Rating2.java13
-rw-r--r--media/java/android/media/SessionToken2.java5
-rw-r--r--media/java/android/media/VolumeProvider2.java3
-rw-r--r--media/java/android/media/session/ISessionManager.aidl7
-rw-r--r--media/java/android/media/session/MediaSessionManager.java24
-rw-r--r--media/java/android/media/soundtrigger/ISoundTriggerDetectionService.aidl35
-rw-r--r--media/java/android/media/soundtrigger/ISoundTriggerDetectionServiceClient.aidl (renamed from core/java/android/hardware/camera2/dispatch/NullDispatcher.java)26
-rw-r--r--media/java/android/media/soundtrigger/SoundTriggerDetectionService.java292
-rw-r--r--media/java/android/media/soundtrigger/SoundTriggerManager.java58
-rw-r--r--media/java/android/media/update/ApiLoader.java7
-rw-r--r--media/java/android/media/update/MediaSession2Provider.java4
-rw-r--r--media/jni/android_media_MediaMetadataRetriever.cpp7
-rw-r--r--media/jni/android_mtp_MtpDatabase.cpp50
-rw-r--r--packages/SettingsLib/res/values/strings.xml10
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java384
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java25
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java11
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java3
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java91
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java367
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java8
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java42
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java6
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java318
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java59
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java303
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java62
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java20
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java13
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java152
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java18
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java20
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java14
-rw-r--r--packages/SettingsProvider/res/values/defaults.xml4
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java16
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java142
-rw-r--r--packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java113
-rw-r--r--packages/SystemUI/Android.mk1
-rw-r--r--packages/SystemUI/res/drawable/car_rounded_bg_bottom.xml11
-rw-r--r--packages/SystemUI/res/drawable/heads_up_scrim.xml25
-rw-r--r--packages/SystemUI/res/drawable/ic_ime_switcher_default.xml2
-rw-r--r--packages/SystemUI/res/drawable/ic_lock_lockdown.xml3
-rw-r--r--packages/SystemUI/res/layout/car_volume_dialog.xml68
-rw-r--r--packages/SystemUI/res/layout/car_volume_dialog_row.xml47
-rw-r--r--packages/SystemUI/res/layout/heads_up_status_bar_layout.xml48
-rw-r--r--packages/SystemUI/res/layout/mobile_signal_group.xml1
-rw-r--r--packages/SystemUI/res/layout/notification_icon_area.xml6
-rw-r--r--packages/SystemUI/res/layout/rounded_corners.xml4
-rw-r--r--packages/SystemUI/res/layout/status_bar.xml72
-rw-r--r--packages/SystemUI/res/layout/super_status_bar.xml8
-rw-r--r--packages/SystemUI/res/values-sw600dp/bools.xml (renamed from location/java/android/location/IFusedProvider.aidl)29
-rw-r--r--packages/SystemUI/res/values/bools.xml21
-rw-r--r--packages/SystemUI/res/values/colors.xml6
-rw-r--r--packages/SystemUI/res/values/dimens.xml9
-rw-r--r--packages/SystemUI/res/values/strings.xml9
-rw-r--r--packages/SystemUI/res/values/styles.xml4
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/RegionInterceptingFrameLayout.java90
-rw-r--r--packages/SystemUI/src/com/android/systemui/ScreenDecorations.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIFactory.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java43
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeUi.java44
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/power/PowerUI.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java64
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java55
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java76
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java83
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java193
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java74
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationListContainer.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java42
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java46
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java247
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java28
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java27
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java52
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java94
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java124
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java98
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java52
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java24
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/ExpandableViewState.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/HeadsUpAppearInterpolator.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationRoundnessManager.java128
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java177
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java77
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java835
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java4
-rw-r--r--packages/SystemUI/tests/Android.mk1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java28
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java94
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java18
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java32
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java46
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java137
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java35
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java68
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java18
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationRoundnessManagerTest.java181
-rw-r--r--proto/src/metrics_constants.proto8
-rw-r--r--proto/src/wifi.proto26
-rw-r--r--services/art-profile1
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerService.java41
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java2
-rw-r--r--services/autofill/java/com/android/server/autofill/Helper.java11
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java32
-rw-r--r--services/autofill/java/com/android/server/autofill/ViewState.java52
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/FillUi.java33
-rw-r--r--services/core/java/com/android/server/AppStateTracker.java23
-rw-r--r--services/core/java/com/android/server/BinderCallsStatsService.java55
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java22
-rw-r--r--services/core/java/com/android/server/InputMethodManagerService.java17
-rw-r--r--services/core/java/com/android/server/IpSecService.java79
-rw-r--r--services/core/java/com/android/server/LocationManagerService.java36
-rw-r--r--services/core/java/com/android/server/am/ActiveInstrumentation.java2
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java157
-rw-r--r--services/core/java/com/android/server/am/ActivityDisplay.java6
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java144
-rw-r--r--services/core/java/com/android/server/am/ActivityRecord.java23
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java14
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java32
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java8
-rw-r--r--services/core/java/com/android/server/am/AppBindRecord.java2
-rw-r--r--services/core/java/com/android/server/am/AppErrors.java1
-rw-r--r--services/core/java/com/android/server/am/AppTimeTracker.java2
-rw-r--r--services/core/java/com/android/server/am/BatteryExternalStatsWorker.java46
-rw-r--r--services/core/java/com/android/server/am/BroadcastFilter.java2
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueue.java4
-rw-r--r--services/core/java/com/android/server/am/BroadcastRecord.java2
-rw-r--r--services/core/java/com/android/server/am/ConnectionRecord.java2
-rw-r--r--services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java8
-rw-r--r--services/core/java/com/android/server/am/IntentBindRecord.java3
-rw-r--r--services/core/java/com/android/server/am/KeyguardController.java4
-rw-r--r--services/core/java/com/android/server/am/LockTaskController.java25
-rw-r--r--services/core/java/com/android/server/am/OWNERS4
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java1
-rw-r--r--services/core/java/com/android/server/am/ReceiverList.java1
-rw-r--r--services/core/java/com/android/server/am/RecentTasks.java4
-rw-r--r--services/core/java/com/android/server/am/ServiceRecord.java1
-rw-r--r--services/core/java/com/android/server/am/TaskRecord.java26
-rw-r--r--services/core/java/com/android/server/am/UidRecord.java1
-rw-r--r--services/core/java/com/android/server/am/UriPermissionOwner.java2
-rw-r--r--services/core/java/com/android/server/am/UserController.java1
-rw-r--r--services/core/java/com/android/server/am/UserState.java1
-rw-r--r--services/core/java/com/android/server/am/VrController.java1
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java115
-rw-r--r--services/core/java/com/android/server/connectivity/PermissionMonitor.java51
-rw-r--r--services/core/java/com/android/server/display/AutomaticBrightnessController.java4
-rw-r--r--services/core/java/com/android/server/display/BrightnessMappingStrategy.java8
-rw-r--r--services/core/java/com/android/server/display/BrightnessTracker.java89
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java42
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java4
-rw-r--r--services/core/java/com/android/server/fingerprint/ClientMonitor.java10
-rw-r--r--services/core/java/com/android/server/job/JobSchedulerService.java4
-rw-r--r--services/core/java/com/android/server/job/controllers/JobStatus.java38
-rw-r--r--services/core/java/com/android/server/location/FlpHardwareProvider.java74
-rw-r--r--services/core/java/com/android/server/location/FusedLocationHardwareSecure.java131
-rw-r--r--services/core/java/com/android/server/location/FusedProxy.java130
-rw-r--r--services/core/java/com/android/server/location/GnssLocationProvider.java72
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java28
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java3
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java10
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java164
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/certificate/TrustedRootCert.java74
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java13
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshot.java298
-rw-r--r--services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java3
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java203
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java296
-rw-r--r--services/core/java/com/android/server/notification/NotificationRecord.java14
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java125
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java36
-rw-r--r--services/core/java/com/android/server/pm/PackageSettingBase.java23
-rw-r--r--services/core/java/com/android/server/pm/Settings.java68
-rw-r--r--services/core/java/com/android/server/pm/dex/ArtManagerService.java24
-rw-r--r--services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java28
-rw-r--r--services/core/java/com/android/server/policy/BarController.java4
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java141
-rw-r--r--services/core/java/com/android/server/policy/WindowManagerPolicy.java4
-rw-r--r--services/core/java/com/android/server/policy/WindowOrientationListener.java4
-rw-r--r--services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java10
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java34
-rw-r--r--services/core/java/com/android/server/power/WirelessChargerDetector.java15
-rw-r--r--services/core/java/com/android/server/power/batterysaver/BatterySaverController.java64
-rw-r--r--services/core/java/com/android/server/slice/SliceManagerService.java73
-rw-r--r--services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java415
-rw-r--r--services/core/java/com/android/server/wm/AccessibilityController.java20
-rw-r--r--services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java91
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java4
-rw-r--r--services/core/java/com/android/server/wm/AppWindowThumbnail.java8
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java88
-rw-r--r--services/core/java/com/android/server/wm/ConfigurationContainer.java8
-rw-r--r--services/core/java/com/android/server/wm/Dimmer.java8
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java47
-rw-r--r--services/core/java/com/android/server/wm/DisplayFrames.java2
-rw-r--r--services/core/java/com/android/server/wm/DockedStackDividerController.java2
-rw-r--r--services/core/java/com/android/server/wm/LocalAnimationAdapter.java4
-rw-r--r--services/core/java/com/android/server/wm/PinnedStackController.java4
-rw-r--r--services/core/java/com/android/server/wm/RecentsAnimationController.java4
-rw-r--r--services/core/java/com/android/server/wm/RemoteAnimationController.java16
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java6
-rw-r--r--services/core/java/com/android/server/wm/ScreenRotationAnimation.java4
-rw-r--r--services/core/java/com/android/server/wm/SurfaceAnimator.java35
-rw-r--r--services/core/java/com/android/server/wm/Task.java14
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java31
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimationSpec.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java19
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java81
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java113
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java22
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfaceController.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowToken.java29
-rw-r--r--services/core/java/com/android/server/wm/WindowTracing.java14
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp11
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java64
-rw-r--r--services/java/com/android/server/SystemServer.java11
-rw-r--r--services/tests/servicestests/Android.mk1
-rw-r--r--services/tests/servicestests/AndroidManifest.xml1
-rw-r--r--services/tests/servicestests/AndroidTest.xml2
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java85
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java97
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/autofill/AutofillManagerServiceTest.java28
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java22
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java101
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java73
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java25
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java105
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestData.java54
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java331
-rw-r--r--services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java154
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java43
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java127
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java26
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java91
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java32
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java38
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java2
-rw-r--r--services/tests/servicestests/test-apps/SuspendTestApp/Android.mk30
-rw-r--r--services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml27
-rw-r--r--services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestActivity.java24
-rw-r--r--services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestReceiver.java56
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java9
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java119
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java298
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java4
-rw-r--r--services/usage/java/com/android/server/usage/AppStandbyController.java11
-rw-r--r--services/usage/java/com/android/server/usage/AppTimeLimitController.java21
-rw-r--r--services/usage/java/com/android/server/usage/IntervalStats.java5
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java31
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsXmlV1.java5
-rw-r--r--services/usage/java/com/android/server/usage/UserUsageStatsService.java20
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java573
-rw-r--r--telecomm/java/android/telecom/Call.java4
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java11
-rw-r--r--telephony/java/android/telephony/CellIdentityTdscdma.java70
-rw-r--r--telephony/java/android/telephony/ServiceState.java4
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java14
-rw-r--r--telephony/java/android/telephony/TelephonyScanManager.java16
-rw-r--r--telephony/java/android/telephony/data/ApnSetting.java746
-rw-r--r--telephony/java/android/telephony/euicc/EuiccManager.java17
-rw-r--r--telephony/java/android/telephony/ims/feature/MmTelFeature.java18
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/SmsMessage.java11
-rw-r--r--test-mock/api/android-test-mock-current.txt1
-rw-r--r--test-mock/src/android/test/mock/MockPackageManager.java10
-rw-r--r--tests/BandwidthTests/src/com/android/tests/bandwidthenforcement/BandwidthEnforcementTestService.java12
-rw-r--r--tests/UsageStatsTest/AndroidManifest.xml1
-rw-r--r--tests/net/java/android/net/IpSecManagerTest.java68
-rw-r--r--tests/net/java/com/android/server/IpSecServiceParameterizedTest.java157
-rw-r--r--tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java134
-rw-r--r--tests/testables/tests/Android.mk2
636 files changed, 24577 insertions, 12500 deletions
diff --git a/Android.bp b/Android.bp
index 1caa4977a168..be832108097c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -169,8 +169,6 @@ java_library {
"core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl",
"core/java/android/hardware/location/IActivityRecognitionHardwareSink.aidl",
"core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl",
- "core/java/android/hardware/location/IFusedLocationHardware.aidl",
- "core/java/android/hardware/location/IFusedLocationHardwareSink.aidl",
"core/java/android/hardware/location/IGeofenceHardware.aidl",
"core/java/android/hardware/location/IGeofenceHardwareCallback.aidl",
"core/java/android/hardware/location/IGeofenceHardwareMonitorCallback.aidl",
@@ -409,7 +407,6 @@ java_library {
"location/java/android/location/IBatchedLocationCallback.aidl",
"location/java/android/location/ICountryDetector.aidl",
"location/java/android/location/ICountryListener.aidl",
- "location/java/android/location/IFusedProvider.aidl",
"location/java/android/location/IGeocodeProvider.aidl",
"location/java/android/location/IGeofenceProvider.aidl",
"location/java/android/location/IGnssStatusListener.aidl",
@@ -462,6 +459,8 @@ java_library {
"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",
"media/java/android/media/tv/ITvInputClient.aidl",
"media/java/android/media/tv/ITvInputHardware.aidl",
"media/java/android/media/tv/ITvInputHardwareCallback.aidl",
diff --git a/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java b/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java
new file mode 100644
index 000000000000..28d40969aa21
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.os;
+
+import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.PerfStatusReporter;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.internal.os.BinderCallsStats;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertNull;
+
+
+/**
+ * Performance tests for {@link BinderCallsStats}
+ */
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class BinderCallsStatsPerfTest {
+
+ @Rule
+ public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
+ private BinderCallsStats mBinderCallsStats;
+
+ @Before
+ public void setUp() {
+ mBinderCallsStats = new BinderCallsStats(true);
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void timeCallSession() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Binder b = new Binder();
+ int i = 0;
+ while (state.keepRunning()) {
+ BinderCallsStats.CallSession s = mBinderCallsStats.callStarted(b, i % 100);
+ mBinderCallsStats.callEnded(s);
+ i++;
+ }
+ }
+
+ @Test
+ public void timeCallSessionTrackingDisabled() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Binder b = new Binder();
+ mBinderCallsStats = new BinderCallsStats(false);
+ assertNull(mBinderCallsStats.callStarted(b, 0));
+ while (state.keepRunning()) {
+ BinderCallsStats.CallSession s = mBinderCallsStats.callStarted(b, 0);
+ mBinderCallsStats.callEnded(s);
+ }
+ }
+
+}
diff --git a/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
index 73e17242ae78..ccbccca87b69 100644
--- a/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
+++ b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
@@ -119,8 +119,12 @@ public class PrecomputedTextMemoryUsageTest {
// Report median of randomly generated PrecomputedText.
for (int i = 0; i < TRIAL_COUNT; ++i) {
CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
- memories[i] = PrecomputedText.createWidthOnly(cs, param, 0, cs.length())
- .getMemoryUsage();
+ PrecomputedText.ParagraphInfo[] paragraphInfo =
+ PrecomputedText.createMeasuredParagraphs(cs, param, 0, cs.length(), false);
+ memories[i] = 0;
+ for (PrecomputedText.ParagraphInfo info : paragraphInfo) {
+ memories[i] += info.measured.getMemoryUsage();
+ }
}
reportMemoryUsage(median(memories), "MemoryUsage_NoHyphenation_WidthOnly");
}
@@ -136,8 +140,12 @@ public class PrecomputedTextMemoryUsageTest {
// Report median of randomly generated PrecomputedText.
for (int i = 0; i < TRIAL_COUNT; ++i) {
CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
- memories[i] = PrecomputedText.createWidthOnly(cs, param, 0, cs.length())
- .getMemoryUsage();
+ PrecomputedText.ParagraphInfo[] paragraphInfo =
+ PrecomputedText.createMeasuredParagraphs(cs, param, 0, cs.length(), false);
+ memories[i] = 0;
+ for (PrecomputedText.ParagraphInfo info : paragraphInfo) {
+ memories[i] += info.measured.getMemoryUsage();
+ }
}
reportMemoryUsage(median(memories), "MemoryUsage_Hyphenation_WidthOnly");
}
diff --git a/api/current.txt b/api/current.txt
index 1fde4ad72df6..93906acdc615 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1378,7 +1378,7 @@ package android {
field public static final int textEditSidePasteWindowLayout = 16843614; // 0x101035e
field public static final int textEditSuggestionItemLayout = 16843636; // 0x1010374
field public static final int textFilterEnabled = 16843007; // 0x10100ff
- field public static final int textFontWeight = 16844166; // 0x1010586
+ field public static final int textFontWeight = 16844165; // 0x1010585
field public static final int textIsSelectable = 16843542; // 0x1010316
field public static final int textOff = 16843045; // 0x1010125
field public static final int textOn = 16843044; // 0x1010124
@@ -1469,7 +1469,6 @@ package android {
field public static final deprecated int unfocusedMonthDateColor = 16843588; // 0x1010344
field public static final int unselectedAlpha = 16843278; // 0x101020e
field public static final int updatePeriodMillis = 16843344; // 0x1010250
- field public static final int urlBarResourceId = 16844164; // 0x1010584
field public static final int use32bitAbi = 16844053; // 0x1010515
field public static final int useDefaultMargins = 16843641; // 0x1010379
field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310
@@ -1549,7 +1548,7 @@ package android {
field public static final int windowHideAnimation = 16842935; // 0x10100b7
field public static final int windowIsFloating = 16842839; // 0x1010057
field public static final int windowIsTranslucent = 16842840; // 0x1010058
- field public static final int windowLayoutInDisplayCutoutMode = 16844167; // 0x1010587
+ field public static final int windowLayoutInDisplayCutoutMode = 16844166; // 0x1010586
field public static final int windowLightNavigationBar = 16844140; // 0x101056c
field public static final int windowLightStatusBar = 16844000; // 0x10104e0
field public static final int windowMinWidthMajor = 16843606; // 0x1010356
@@ -5401,6 +5400,7 @@ package android.app {
method public android.app.Notification.Builder extend(android.app.Notification.Extender);
method public android.os.Bundle getExtras();
method public deprecated android.app.Notification getNotification();
+ method public android.app.Notification.Style getStyle();
method public static android.app.Notification.Builder recoverBuilder(android.content.Context, android.app.Notification);
method public android.app.Notification.Builder setActions(android.app.Notification.Action...);
method public android.app.Notification.Builder setAutoCancel(boolean);
@@ -6558,7 +6558,7 @@ package android.app.admin {
method public void setLockTaskPackages(android.content.ComponentName, java.lang.String[]) throws java.lang.SecurityException;
method public void setLogoutEnabled(android.content.ComponentName, boolean);
method public void setLongSupportMessage(android.content.ComponentName, java.lang.CharSequence);
- method public void setMandatoryBackupTransport(android.content.ComponentName, android.content.ComponentName);
+ method public boolean setMandatoryBackupTransport(android.content.ComponentName, android.content.ComponentName);
method public void setMasterVolumeMuted(android.content.ComponentName, boolean);
method public void setMaximumFailedPasswordsForWipe(android.content.ComponentName, int);
method public void setMaximumTimeToLock(android.content.ComponentName, long);
@@ -7192,6 +7192,7 @@ package android.app.slice {
field public static final deprecated java.lang.String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
field public static final java.lang.String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
field public static final java.lang.String HINT_ACTIONS = "actions";
+ field public static final java.lang.String HINT_ERROR = "error";
field public static final java.lang.String HINT_HORIZONTAL = "horizontal";
field public static final java.lang.String HINT_KEY_WORDS = "key_words";
field public static final java.lang.String HINT_LARGE = "large";
@@ -7217,29 +7218,22 @@ package android.app.slice {
}
public static class Slice.Builder {
- ctor public Slice.Builder(android.net.Uri);
+ ctor public deprecated Slice.Builder(android.net.Uri);
+ ctor public Slice.Builder(android.net.Uri, android.app.slice.SliceSpec);
ctor public Slice.Builder(android.app.slice.Slice.Builder);
- method public android.app.slice.Slice.Builder addAction(android.app.PendingIntent, android.app.slice.Slice);
method public android.app.slice.Slice.Builder addAction(android.app.PendingIntent, android.app.slice.Slice, java.lang.String);
- method public android.app.slice.Slice.Builder addBundle(android.os.Bundle, java.lang.String, java.lang.String...);
method public android.app.slice.Slice.Builder addBundle(android.os.Bundle, java.lang.String, java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addHints(java.lang.String...);
method public android.app.slice.Slice.Builder addHints(java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addIcon(android.graphics.drawable.Icon, java.lang.String, java.lang.String...);
method public android.app.slice.Slice.Builder addIcon(android.graphics.drawable.Icon, java.lang.String, java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addInt(int, java.lang.String, java.lang.String...);
method public android.app.slice.Slice.Builder addInt(int, java.lang.String, java.util.List<java.lang.String>);
+ method public android.app.slice.Slice.Builder addLong(long, java.lang.String, java.util.List<java.lang.String>);
method public android.app.slice.Slice.Builder addRemoteInput(android.app.RemoteInput, java.lang.String, java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addRemoteInput(android.app.RemoteInput, java.lang.String, java.lang.String...);
- method public android.app.slice.Slice.Builder addSubSlice(android.app.slice.Slice);
method public android.app.slice.Slice.Builder addSubSlice(android.app.slice.Slice, java.lang.String);
- method public android.app.slice.Slice.Builder addText(java.lang.CharSequence, java.lang.String, java.lang.String...);
method public android.app.slice.Slice.Builder addText(java.lang.CharSequence, java.lang.String, java.util.List<java.lang.String>);
- method public android.app.slice.Slice.Builder addTimestamp(long, java.lang.String, java.lang.String...);
- method public android.app.slice.Slice.Builder addTimestamp(long, java.lang.String, java.util.List<java.lang.String>);
+ method public deprecated android.app.slice.Slice.Builder addTimestamp(long, java.lang.String, java.util.List<java.lang.String>);
method public android.app.slice.Slice build();
method public android.app.slice.Slice.Builder setCallerNeeded(boolean);
- method public android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
+ method public deprecated android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
}
public final class SliceItem implements android.os.Parcelable {
@@ -7262,10 +7256,11 @@ package android.app.slice {
field public static final java.lang.String FORMAT_BUNDLE = "bundle";
field public static final java.lang.String FORMAT_IMAGE = "image";
field public static final java.lang.String FORMAT_INT = "int";
+ field public static final java.lang.String FORMAT_LONG = "long";
field public static final java.lang.String FORMAT_REMOTE_INPUT = "input";
field public static final java.lang.String FORMAT_SLICE = "slice";
field public static final java.lang.String FORMAT_TEXT = "text";
- field public static final java.lang.String FORMAT_TIMESTAMP = "timestamp";
+ field public static final deprecated java.lang.String FORMAT_TIMESTAMP = "long";
}
public class SliceManager {
@@ -11159,6 +11154,7 @@ package android.content.pm {
method public abstract android.content.res.Resources getResourcesForApplication(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract java.util.List<android.content.pm.SharedLibraryInfo> getSharedLibraries(int);
+ method public android.os.PersistableBundle getSuspendedPackageAppExtras();
method public abstract android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
method public abstract java.lang.String[] getSystemSharedLibraryNames();
method public abstract java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
@@ -11172,6 +11168,7 @@ package android.content.pm {
method public abstract boolean hasSystemFeature(java.lang.String, int);
method public abstract boolean isInstantApp();
method public abstract boolean isInstantApp(java.lang.String);
+ method public boolean isPackageSuspended();
method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public abstract boolean isSafeMode();
method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
@@ -13637,12 +13634,14 @@ package android.graphics {
field public static final int ALLOCATOR_HARDWARE = 3; // 0x3
field public static final int ALLOCATOR_SHARED_MEMORY = 2; // 0x2
field public static final int ALLOCATOR_SOFTWARE = 1; // 0x1
- field public static final int ERROR_SOURCE_ERROR = 3; // 0x3
- field public static final int ERROR_SOURCE_EXCEPTION = 1; // 0x1
- field public static final int ERROR_SOURCE_INCOMPLETE = 2; // 0x2
}
- public static abstract class ImageDecoder.Error implements java.lang.annotation.Annotation {
+ public static final class ImageDecoder.DecodeException extends java.io.IOException {
+ method public int getError();
+ method public android.graphics.ImageDecoder.Source getSource();
+ field public static final int SOURCE_EXCEPTION = 1; // 0x1
+ field public static final int SOURCE_INCOMPLETE = 2; // 0x2
+ field public static final int SOURCE_MALFORMED_DATA = 3; // 0x3
}
public static class ImageDecoder.ImageInfo {
@@ -13651,16 +13650,12 @@ package android.graphics {
method public boolean isAnimated();
}
- public static class ImageDecoder.IncompleteException extends java.io.IOException {
- ctor public ImageDecoder.IncompleteException();
- }
-
public static abstract interface ImageDecoder.OnHeaderDecodedListener {
method public abstract void onHeaderDecoded(android.graphics.ImageDecoder, android.graphics.ImageDecoder.ImageInfo, android.graphics.ImageDecoder.Source);
}
public static abstract interface ImageDecoder.OnPartialImageListener {
- method public abstract boolean onPartialImage(int, android.graphics.ImageDecoder.Source);
+ method public abstract boolean onPartialImage(android.graphics.ImageDecoder.DecodeException);
}
public static abstract class ImageDecoder.Source {
@@ -15799,6 +15794,7 @@ package android.hardware.camera2 {
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> INFO_SUPPORTED_HARDWARE_LEVEL;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.String> INFO_VERSION;
field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size[]> JPEG_AVAILABLE_THUMBNAIL_SIZES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_DISTORTION;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_FACING;
field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_APERTURES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FILTER_DENSITIES;
@@ -15811,7 +15807,7 @@ package android.hardware.camera2 {
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_POSE_REFERENCE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_ROTATION;
field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_TRANSLATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_RADIAL_DISTORTION;
+ field public static final deprecated android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_RADIAL_DISTORTION;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REPROCESS_MAX_CAPTURE_STALL;
@@ -16269,6 +16265,7 @@ package android.hardware.camera2 {
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY;
field public static final android.hardware.camera2.CaptureResult.Key<android.util.Size> JPEG_THUMBNAIL_SIZE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_APERTURE;
+ field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_DISTORTION;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FILTER_DENSITY;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCAL_LENGTH;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCUS_DISTANCE;
@@ -16277,7 +16274,7 @@ package android.hardware.camera2 {
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE;
field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_ROTATION;
field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_TRANSLATION;
- field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_RADIAL_DISTORTION;
+ field public static final deprecated android.hardware.camera2.CaptureResult.Key<float[]> LENS_RADIAL_DISTORTION;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_STATE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> NOISE_REDUCTION_MODE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR;
@@ -16440,8 +16437,8 @@ package android.hardware.camera2.params {
}
public final class SessionConfiguration {
- ctor public SessionConfiguration(int, java.util.List<android.hardware.camera2.params.OutputConfiguration>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler);
- method public android.os.Handler getHandler();
+ ctor public SessionConfiguration(int, java.util.List<android.hardware.camera2.params.OutputConfiguration>, java.util.concurrent.Executor, android.hardware.camera2.CameraCaptureSession.StateCallback);
+ method public java.util.concurrent.Executor getExecutor();
method public android.hardware.camera2.params.InputConfiguration getInputConfiguration();
method public java.util.List<android.hardware.camera2.params.OutputConfiguration> getOutputConfigurations();
method public android.hardware.camera2.CaptureRequest getSessionParameters();
@@ -21536,10 +21533,10 @@ package android.location {
method public int getAccumulatedDeltaRangeState();
method public double getAccumulatedDeltaRangeUncertaintyMeters();
method public double getAutomaticGainControlLevelDb();
- method public long getCarrierCycles();
+ method public deprecated long getCarrierCycles();
method public float getCarrierFrequencyHz();
- method public double getCarrierPhase();
- method public double getCarrierPhaseUncertainty();
+ method public deprecated double getCarrierPhase();
+ method public deprecated double getCarrierPhaseUncertainty();
method public double getCn0DbHz();
method public int getConstellationType();
method public int getMultipathIndicator();
@@ -21552,13 +21549,15 @@ package android.location {
method public int getSvid();
method public double getTimeOffsetNanos();
method public boolean hasAutomaticGainControlLevelDb();
- method public boolean hasCarrierCycles();
+ method public deprecated boolean hasCarrierCycles();
method public boolean hasCarrierFrequencyHz();
- method public boolean hasCarrierPhase();
- method public boolean hasCarrierPhaseUncertainty();
+ method public deprecated boolean hasCarrierPhase();
+ method public deprecated boolean hasCarrierPhaseUncertainty();
method public boolean hasSnrInDb();
method public void writeToParcel(android.os.Parcel, int);
field public static final int ADR_STATE_CYCLE_SLIP = 4; // 0x4
+ field public static final int ADR_STATE_HALF_CYCLE_REPORTED = 16; // 0x10
+ field public static final int ADR_STATE_HALF_CYCLE_RESOLVED = 8; // 0x8
field public static final int ADR_STATE_RESET = 2; // 0x2
field public static final int ADR_STATE_UNKNOWN = 0; // 0x0
field public static final int ADR_STATE_VALID = 1; // 0x1
@@ -21808,7 +21807,6 @@ package android.location {
method public void unregisterGnssMeasurementsCallback(android.location.GnssMeasurementsEvent.Callback);
method public void unregisterGnssNavigationMessageCallback(android.location.GnssNavigationMessage.Callback);
method public void unregisterGnssStatusCallback(android.location.GnssStatus.Callback);
- field public static final java.lang.String GNSS_HARDWARE_MODEL_NAME_UNKNOWN = "Model Name Unknown";
field public static final java.lang.String GPS_PROVIDER = "gps";
field public static final java.lang.String KEY_LOCATION_CHANGED = "location";
field public static final java.lang.String KEY_PROVIDER_ENABLED = "providerEnabled";
@@ -22081,7 +22079,6 @@ package android.media {
method public boolean isBluetoothScoOn();
method public boolean isMicrophoneMute();
method public boolean isMusicActive();
- method public boolean isOffloadedPlaybackSupported(android.media.AudioFormat);
method public boolean isSpeakerphoneOn();
method public boolean isStreamMute(int);
method public boolean isVolumeFixed();
@@ -22407,7 +22404,6 @@ package android.media {
method public int reloadStaticData();
method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
method public deprecated void removeOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener);
- method public void removeStreamEventCallback();
method public int setAuxEffectSendLevel(float);
method public int setBufferSizeInFrames(int);
method public int setLoopPoints(int, int, int);
@@ -22422,7 +22418,6 @@ package android.media {
method public int setPresentation(android.media.AudioPresentation);
method protected deprecated void setState(int);
method public deprecated int setStereoVolume(float, float);
- method public void setStreamEventCallback(java.util.concurrent.Executor, android.media.AudioTrack.StreamEventCallback);
method public int setVolume(float);
method public void stop() throws java.lang.IllegalStateException;
method public int write(byte[], int, int);
@@ -22458,7 +22453,6 @@ package android.media {
method public android.media.AudioTrack.Builder setAudioAttributes(android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
method public android.media.AudioTrack.Builder setAudioFormat(android.media.AudioFormat) throws java.lang.IllegalArgumentException;
method public android.media.AudioTrack.Builder setBufferSizeInBytes(int) throws java.lang.IllegalArgumentException;
- method public android.media.AudioTrack.Builder setOffloadedPlayback(boolean);
method public android.media.AudioTrack.Builder setPerformanceMode(int);
method public android.media.AudioTrack.Builder setSessionId(int) throws java.lang.IllegalArgumentException;
method public android.media.AudioTrack.Builder setTransferMode(int) throws java.lang.IllegalArgumentException;
@@ -22482,12 +22476,6 @@ package android.media {
method public default void onRoutingChanged(android.media.AudioRouting);
}
- public static abstract class AudioTrack.StreamEventCallback {
- method public void onStreamDataRequest(android.media.AudioTrack);
- method public void onStreamPresentationEnd(android.media.AudioTrack);
- method public void onTearDown(android.media.AudioTrack);
- }
-
public class CamcorderProfile {
method public static android.media.CamcorderProfile get(int);
method public static android.media.CamcorderProfile get(int, int);
@@ -22540,40 +22528,6 @@ package android.media {
field public static final int QUALITY_MEDIUM = 1; // 0x1
}
- public final class DataSourceDesc {
- method public long getEndPosition();
- method public java.io.FileDescriptor getFileDescriptor();
- method public long getFileDescriptorLength();
- method public long getFileDescriptorOffset();
- method public android.media.Media2DataSource getMedia2DataSource();
- method public java.lang.String getMediaId();
- method public long getStartPosition();
- method public int getType();
- method public android.net.Uri getUri();
- method public android.content.Context getUriContext();
- method public java.util.List<java.net.HttpCookie> getUriCookies();
- method public java.util.Map<java.lang.String, java.lang.String> getUriHeaders();
- field public static final long LONG_MAX = 576460752303423487L; // 0x7ffffffffffffffL
- field public static final int TYPE_CALLBACK = 1; // 0x1
- field public static final int TYPE_FD = 2; // 0x2
- field public static final int TYPE_NONE = 0; // 0x0
- field public static final int TYPE_URI = 3; // 0x3
- }
-
- public static class DataSourceDesc.Builder {
- ctor public DataSourceDesc.Builder();
- ctor public DataSourceDesc.Builder(android.media.DataSourceDesc);
- method public android.media.DataSourceDesc build();
- method public android.media.DataSourceDesc.Builder setDataSource(android.media.Media2DataSource);
- method public android.media.DataSourceDesc.Builder setDataSource(java.io.FileDescriptor);
- method public android.media.DataSourceDesc.Builder setDataSource(java.io.FileDescriptor, long, long);
- method public android.media.DataSourceDesc.Builder setDataSource(android.content.Context, android.net.Uri);
- method public android.media.DataSourceDesc.Builder setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>, java.util.List<java.net.HttpCookie>);
- method public android.media.DataSourceDesc.Builder setEndPosition(long);
- method public android.media.DataSourceDesc.Builder setMediaId(java.lang.String);
- method public android.media.DataSourceDesc.Builder setStartPosition(long);
- }
-
public final class DeniedByServerException extends android.media.MediaDrmException {
ctor public DeniedByServerException(java.lang.String);
}
@@ -22851,12 +22805,6 @@ package android.media {
method public abstract void onJetUserIdUpdate(android.media.JetPlayer, int, int);
}
- public abstract class Media2DataSource implements java.io.Closeable {
- ctor public Media2DataSource();
- method public abstract long getSize() throws java.io.IOException;
- method public abstract int readAt(long, byte[], int, int) throws java.io.IOException;
- }
-
public class MediaActionSound {
ctor public MediaActionSound();
method public void load(int);
@@ -22868,27 +22816,6 @@ package android.media {
field public static final int STOP_VIDEO_RECORDING = 3; // 0x3
}
- public class MediaBrowser2 extends android.media.MediaController2 {
- ctor public MediaBrowser2(android.content.Context, android.media.SessionToken2, java.util.concurrent.Executor, android.media.MediaBrowser2.BrowserCallback);
- method public void getChildren(java.lang.String, int, int, android.os.Bundle);
- method public void getItem(java.lang.String);
- method public void getLibraryRoot(android.os.Bundle);
- method public void getSearchResult(java.lang.String, int, int, android.os.Bundle);
- method public void search(java.lang.String, android.os.Bundle);
- method public void subscribe(java.lang.String, android.os.Bundle);
- method public void unsubscribe(java.lang.String);
- }
-
- public static class MediaBrowser2.BrowserCallback extends android.media.MediaController2.ControllerCallback {
- ctor public MediaBrowser2.BrowserCallback();
- method public void onChildrenChanged(android.media.MediaBrowser2, java.lang.String, int, android.os.Bundle);
- method public void onGetChildrenDone(android.media.MediaBrowser2, java.lang.String, int, int, java.util.List<android.media.MediaItem2>, android.os.Bundle);
- method public void onGetItemDone(android.media.MediaBrowser2, java.lang.String, android.media.MediaItem2);
- method public void onGetLibraryRootDone(android.media.MediaBrowser2, android.os.Bundle, java.lang.String, android.os.Bundle);
- method public void onGetSearchResultDone(android.media.MediaBrowser2, java.lang.String, int, int, java.util.List<android.media.MediaItem2>, android.os.Bundle);
- method public void onSearchResultChanged(android.media.MediaBrowser2, java.lang.String, int, android.os.Bundle);
- }
-
public final class MediaCas implements java.lang.AutoCloseable {
ctor public MediaCas(int) throws android.media.MediaCasException.UnsupportedCasException;
method public void close();
@@ -23366,82 +23293,6 @@ package android.media {
field public static final int REGULAR_CODECS = 0; // 0x0
}
- public class MediaController2 implements java.lang.AutoCloseable {
- ctor public MediaController2(android.content.Context, android.media.SessionToken2, java.util.concurrent.Executor, android.media.MediaController2.ControllerCallback);
- method public void addPlaylistItem(int, android.media.MediaItem2);
- method public void adjustVolume(int, int);
- method public void close();
- method public void fastForward();
- method public long getBufferedPosition();
- method public android.media.MediaItem2 getCurrentMediaItem();
- method public android.media.MediaController2.PlaybackInfo getPlaybackInfo();
- method public float getPlaybackSpeed();
- method public int getPlayerState();
- method public java.util.List<android.media.MediaItem2> getPlaylist();
- method public android.media.MediaMetadata2 getPlaylistMetadata();
- method public long getPosition();
- method public int getRepeatMode();
- method public android.app.PendingIntent getSessionActivity();
- method public android.media.SessionToken2 getSessionToken();
- method public int getShuffleMode();
- method public boolean isConnected();
- method public void pause();
- method public void play();
- method public void playFromMediaId(java.lang.String, android.os.Bundle);
- method public void playFromSearch(java.lang.String, android.os.Bundle);
- method public void playFromUri(android.net.Uri, android.os.Bundle);
- method public void prepare();
- method public void prepareFromMediaId(java.lang.String, android.os.Bundle);
- method public void prepareFromSearch(java.lang.String, android.os.Bundle);
- method public void prepareFromUri(android.net.Uri, android.os.Bundle);
- method public void removePlaylistItem(android.media.MediaItem2);
- method public void replacePlaylistItem(int, android.media.MediaItem2);
- method public void rewind();
- method public void seekTo(long);
- method public void sendCustomCommand(android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver);
- method public void setPlaybackSpeed(float);
- method public void setPlaylist(java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2);
- method public void setRating(java.lang.String, android.media.Rating2);
- method public void setRepeatMode(int);
- method public void setShuffleMode(int);
- method public void setVolumeTo(int, int);
- method public void skipToNextItem();
- method public void skipToPlaylistItem(android.media.MediaItem2);
- method public void skipToPreviousItem();
- method public void stop();
- method public void updatePlaylistMetadata(android.media.MediaMetadata2);
- }
-
- public static abstract class MediaController2.ControllerCallback {
- ctor public MediaController2.ControllerCallback();
- method public void onAllowedCommandsChanged(android.media.MediaController2, android.media.MediaSession2.CommandGroup);
- method public void onBufferedPositionChanged(android.media.MediaController2, long);
- method public void onConnected(android.media.MediaController2, android.media.MediaSession2.CommandGroup);
- method public void onCurrentMediaItemChanged(android.media.MediaController2, android.media.MediaItem2);
- method public void onCustomCommand(android.media.MediaController2, android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver);
- method public void onCustomLayoutChanged(android.media.MediaController2, java.util.List<android.media.MediaSession2.CommandButton>);
- method public void onDisconnected(android.media.MediaController2);
- method public void onError(android.media.MediaController2, int, android.os.Bundle);
- method public void onPlaybackInfoChanged(android.media.MediaController2, android.media.MediaController2.PlaybackInfo);
- method public void onPlaybackSpeedChanged(android.media.MediaController2, float);
- method public void onPlayerStateChanged(android.media.MediaController2, int);
- method public void onPlaylistChanged(android.media.MediaController2, android.media.MediaPlaylistAgent, java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2);
- method public void onPlaylistMetadataChanged(android.media.MediaController2, android.media.MediaPlaylistAgent, android.media.MediaMetadata2);
- method public void onPositionChanged(android.media.MediaController2, long, long);
- method public void onRepeatModeChanged(android.media.MediaController2, android.media.MediaPlaylistAgent, int);
- method public void onShuffleModeChanged(android.media.MediaController2, android.media.MediaPlaylistAgent, int);
- }
-
- public static final class MediaController2.PlaybackInfo {
- method public android.media.AudioAttributes getAudioAttributes();
- method public int getControlType();
- method public int getCurrentVolume();
- method public int getMaxVolume();
- method public int getPlaybackType();
- field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
- field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
- }
-
public final class MediaCrypto {
ctor public MediaCrypto(java.util.UUID, byte[]) throws android.media.MediaCryptoException;
method protected void finalize();
@@ -23778,10 +23629,8 @@ package android.media {
field public static final java.lang.String KEY_DURATION = "durationUs";
field public static final java.lang.String KEY_FLAC_COMPRESSION_LEVEL = "flac-compression-level";
field public static final java.lang.String KEY_FRAME_RATE = "frame-rate";
- field public static final java.lang.String KEY_GRID_COLS = "grid-cols";
- field public static final java.lang.String KEY_GRID_HEIGHT = "grid-height";
+ field public static final java.lang.String KEY_GRID_COLUMNS = "grid-cols";
field public static final java.lang.String KEY_GRID_ROWS = "grid-rows";
- field public static final java.lang.String KEY_GRID_WIDTH = "grid-width";
field public static final java.lang.String KEY_HDR_STATIC_INFO = "hdr-static-info";
field public static final java.lang.String KEY_HEIGHT = "height";
field public static final java.lang.String KEY_INTRA_REFRESH_PERIOD = "intra-refresh-period";
@@ -23810,6 +23659,8 @@ package android.media {
field public static final java.lang.String KEY_SLICE_HEIGHT = "slice-height";
field public static final java.lang.String KEY_STRIDE = "stride";
field public static final java.lang.String KEY_TEMPORAL_LAYERING = "ts-schema";
+ field public static final java.lang.String KEY_TILE_HEIGHT = "tile-height";
+ field public static final java.lang.String KEY_TILE_WIDTH = "tile-width";
field public static final java.lang.String KEY_TRACK_ID = "track-id";
field public static final java.lang.String KEY_WIDTH = "width";
field public static final java.lang.String MIMETYPE_AUDIO_AAC = "audio/mp4a-latm";
@@ -23842,71 +23693,6 @@ package android.media {
field public static final java.lang.String MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9";
}
- public class MediaItem2 {
- method public static android.media.MediaItem2 fromBundle(android.content.Context, android.os.Bundle);
- method public android.media.DataSourceDesc getDataSourceDesc();
- method public int getFlags();
- method public java.lang.String getMediaId();
- method public android.media.MediaMetadata2 getMetadata();
- method public boolean isBrowsable();
- method public boolean isPlayable();
- method public void setMetadata(android.media.MediaMetadata2);
- method public android.os.Bundle toBundle();
- field public static final int FLAG_BROWSABLE = 1; // 0x1
- field public static final int FLAG_PLAYABLE = 2; // 0x2
- }
-
- public static final class MediaItem2.Builder {
- ctor public MediaItem2.Builder(android.content.Context, int);
- method public android.media.MediaItem2 build();
- method public android.media.MediaItem2.Builder setDataSourceDesc(android.media.DataSourceDesc);
- method public android.media.MediaItem2.Builder setMediaId(java.lang.String);
- method public android.media.MediaItem2.Builder setMetadata(android.media.MediaMetadata2);
- }
-
- public abstract class MediaLibraryService2 extends android.media.MediaSessionService2 {
- ctor public MediaLibraryService2();
- method public abstract android.media.MediaLibraryService2.MediaLibrarySession onCreateSession(java.lang.String);
- field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaLibraryService2";
- }
-
- public static final class MediaLibraryService2.LibraryRoot {
- ctor public MediaLibraryService2.LibraryRoot(android.content.Context, java.lang.String, android.os.Bundle);
- method public android.os.Bundle getExtras();
- method public java.lang.String getRootId();
- field public static final java.lang.String EXTRA_OFFLINE = "android.media.extra.OFFLINE";
- field public static final java.lang.String EXTRA_RECENT = "android.media.extra.RECENT";
- field public static final java.lang.String EXTRA_SUGGESTED = "android.media.extra.SUGGESTED";
- }
-
- public static final class MediaLibraryService2.MediaLibrarySession extends android.media.MediaSession2 {
- method public void notifyChildrenChanged(android.media.MediaSession2.ControllerInfo, java.lang.String, int, android.os.Bundle);
- method public void notifyChildrenChanged(java.lang.String, int, android.os.Bundle);
- method public void notifySearchResultChanged(android.media.MediaSession2.ControllerInfo, java.lang.String, int, android.os.Bundle);
- }
-
- public static final class MediaLibraryService2.MediaLibrarySession.Builder {
- ctor public MediaLibraryService2.MediaLibrarySession.Builder(android.media.MediaLibraryService2, java.util.concurrent.Executor, android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback);
- method public android.media.MediaLibraryService2.MediaLibrarySession build();
- method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setId(java.lang.String);
- method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setPlayer(android.media.MediaPlayerBase);
- method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setPlaylistAgent(android.media.MediaPlaylistAgent);
- method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setSessionActivity(android.app.PendingIntent);
- method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setSessionCallback(java.util.concurrent.Executor, android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback);
- method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setVolumeProvider(android.media.VolumeProvider2);
- }
-
- public static class MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback extends android.media.MediaSession2.SessionCallback {
- ctor public MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback(android.content.Context);
- method public java.util.List<android.media.MediaItem2> onGetChildren(android.media.MediaLibraryService2.MediaLibrarySession, android.media.MediaSession2.ControllerInfo, java.lang.String, int, int, android.os.Bundle);
- method public android.media.MediaItem2 onGetItem(android.media.MediaLibraryService2.MediaLibrarySession, android.media.MediaSession2.ControllerInfo, java.lang.String);
- method public android.media.MediaLibraryService2.LibraryRoot onGetLibraryRoot(android.media.MediaLibraryService2.MediaLibrarySession, android.media.MediaSession2.ControllerInfo, android.os.Bundle);
- method public java.util.List<android.media.MediaItem2> onGetSearchResult(android.media.MediaLibraryService2.MediaLibrarySession, android.media.MediaSession2.ControllerInfo, java.lang.String, int, int, android.os.Bundle);
- method public void onSearch(android.media.MediaLibraryService2.MediaLibrarySession, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle);
- method public void onSubscribe(android.media.MediaLibraryService2.MediaLibrarySession, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle);
- method public void onUnsubscribe(android.media.MediaLibraryService2.MediaLibrarySession, android.media.MediaSession2.ControllerInfo, java.lang.String);
- }
-
public final class MediaMetadata implements android.os.Parcelable {
method public boolean containsKey(java.lang.String);
method public int describeContents();
@@ -23962,79 +23748,6 @@ package android.media {
method public android.media.MediaMetadata.Builder putText(java.lang.String, java.lang.CharSequence);
}
- public final class MediaMetadata2 {
- method public boolean containsKey(java.lang.String);
- method public static android.media.MediaMetadata2 fromBundle(android.content.Context, android.os.Bundle);
- method public android.graphics.Bitmap getBitmap(java.lang.String);
- method public android.os.Bundle getExtras();
- method public float getFloat(java.lang.String);
- method public long getLong(java.lang.String);
- method public java.lang.String getMediaId();
- method public android.media.Rating2 getRating(java.lang.String);
- method public java.lang.String getString(java.lang.String);
- method public java.lang.CharSequence getText(java.lang.String);
- method public java.util.Set<java.lang.String> keySet();
- method public int size();
- method public android.os.Bundle toBundle();
- field public static final long BT_FOLDER_TYPE_ALBUMS = 2L; // 0x2L
- field public static final long BT_FOLDER_TYPE_ARTISTS = 3L; // 0x3L
- field public static final long BT_FOLDER_TYPE_GENRES = 4L; // 0x4L
- field public static final long BT_FOLDER_TYPE_MIXED = 0L; // 0x0L
- field public static final long BT_FOLDER_TYPE_PLAYLISTS = 5L; // 0x5L
- field public static final long BT_FOLDER_TYPE_TITLES = 1L; // 0x1L
- field public static final long BT_FOLDER_TYPE_YEARS = 6L; // 0x6L
- field public static final java.lang.String METADATA_KEY_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
- field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
- field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
- field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
- field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
- field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
- field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
- field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
- field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
- field public static final java.lang.String METADATA_KEY_BT_FOLDER_TYPE = "android.media.metadata.BT_FOLDER_TYPE";
- field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
- field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
- field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
- field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
- field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
- field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
- field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
- field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
- field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
- field public static final java.lang.String METADATA_KEY_DOWNLOAD_STATUS = "android.media.metadata.DOWNLOAD_STATUS";
- field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
- field public static final java.lang.String METADATA_KEY_EXTRAS = "android.media.metadata.EXTRAS";
- field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
- field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
- field public static final java.lang.String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI";
- field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
- field public static final java.lang.String METADATA_KEY_RADIO_CALLSIGN = "android.media.metadata.RADIO_CALLSIGN";
- field public static final java.lang.String METADATA_KEY_RADIO_FREQUENCY = "android.media.metadata.RADIO_FREQUENCY";
- field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
- field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
- field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
- field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
- field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
- field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
- field public static final long STATUS_DOWNLOADED = 2L; // 0x2L
- field public static final long STATUS_DOWNLOADING = 1L; // 0x1L
- field public static final long STATUS_NOT_DOWNLOADED = 0L; // 0x0L
- }
-
- public static final class MediaMetadata2.Builder {
- ctor public MediaMetadata2.Builder(android.content.Context);
- ctor public MediaMetadata2.Builder(android.content.Context, android.media.MediaMetadata2);
- method public android.media.MediaMetadata2 build();
- method public android.media.MediaMetadata2.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
- method public android.media.MediaMetadata2.Builder putFloat(java.lang.String, float);
- method public android.media.MediaMetadata2.Builder putLong(java.lang.String, long);
- method public android.media.MediaMetadata2.Builder putRating(java.lang.String, android.media.Rating2);
- method public android.media.MediaMetadata2.Builder putString(java.lang.String, java.lang.String);
- method public android.media.MediaMetadata2.Builder putText(java.lang.String, java.lang.CharSequence);
- method public android.media.MediaMetadata2.Builder setExtras(android.os.Bundle);
- }
-
public abstract deprecated class MediaMetadataEditor {
method public synchronized void addEditableKey(int);
method public abstract void apply();
@@ -24059,12 +23772,16 @@ package android.media {
method public java.lang.String extractMetadata(int);
method public byte[] getEmbeddedPicture();
method public android.graphics.Bitmap getFrameAtIndex(int, android.media.MediaMetadataRetriever.BitmapParams);
+ method public android.graphics.Bitmap getFrameAtIndex(int);
method public android.graphics.Bitmap getFrameAtTime(long, int);
method public android.graphics.Bitmap getFrameAtTime(long);
method public android.graphics.Bitmap getFrameAtTime();
method public java.util.List<android.graphics.Bitmap> getFramesAtIndex(int, int, android.media.MediaMetadataRetriever.BitmapParams);
+ method public java.util.List<android.graphics.Bitmap> getFramesAtIndex(int, int);
method public android.graphics.Bitmap getImageAtIndex(int, android.media.MediaMetadataRetriever.BitmapParams);
+ method public android.graphics.Bitmap getImageAtIndex(int);
method public android.graphics.Bitmap getPrimaryImage(android.media.MediaMetadataRetriever.BitmapParams);
+ method public android.graphics.Bitmap getPrimaryImage();
method public android.graphics.Bitmap getScaledFrameAtTime(long, int, int, int);
method public void release();
method public void setDataSource(java.lang.String) throws java.lang.IllegalArgumentException;
@@ -24349,263 +24066,6 @@ package android.media {
field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1
}
- public abstract class MediaPlayer2 extends android.media.MediaPlayerBase implements android.media.AudioRouting {
- method public abstract void attachAuxEffect(int);
- method public abstract void clearDrmEventCallback();
- method public abstract void clearMediaPlayer2EventCallback();
- method public abstract void clearPendingCommands();
- method public abstract void close();
- method public static final android.media.MediaPlayer2 create();
- method public abstract void deselectTrack(int);
- method public abstract int getAudioSessionId();
- method public abstract long getBufferedPosition();
- method public abstract long getCurrentPosition();
- method public abstract android.media.MediaPlayer2.DrmInfo getDrmInfo();
- method public abstract android.media.MediaDrm.KeyRequest getDrmKeyRequest(byte[], byte[], java.lang.String, int, java.util.Map<java.lang.String, java.lang.String>) throws android.media.MediaPlayer2.NoDrmSchemeException;
- method public abstract java.lang.String getDrmPropertyString(java.lang.String) throws android.media.MediaPlayer2.NoDrmSchemeException;
- method public abstract long getDuration();
- method public abstract android.os.PersistableBundle getMetrics();
- method public abstract android.media.PlaybackParams getPlaybackParams();
- method public abstract int getSelectedTrack(int);
- method public abstract android.media.SyncParams getSyncParams();
- method public abstract android.media.MediaTimestamp getTimestamp();
- method public abstract java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo();
- method public abstract int getVideoHeight();
- method public abstract int getVideoWidth();
- method public void notifyWhenCommandLabelReached(java.lang.Object);
- method public abstract void prepareDrm(java.util.UUID) throws android.media.MediaPlayer2.ProvisioningNetworkErrorException, android.media.MediaPlayer2.ProvisioningServerErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
- method public abstract byte[] provideDrmKeyResponse(byte[], byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer2.NoDrmSchemeException;
- method public abstract void releaseDrm() throws android.media.MediaPlayer2.NoDrmSchemeException;
- method public abstract void restoreDrmKeys(byte[]) throws android.media.MediaPlayer2.NoDrmSchemeException;
- method public void seekTo(long);
- method public abstract void seekTo(long, int);
- method public abstract void selectTrack(int);
- method public abstract void setAudioSessionId(int);
- method public abstract void setAuxEffectSendLevel(float);
- method public abstract void setDrmEventCallback(java.util.concurrent.Executor, android.media.MediaPlayer2.DrmEventCallback);
- method public abstract void setDrmPropertyString(java.lang.String, java.lang.String) throws android.media.MediaPlayer2.NoDrmSchemeException;
- method public abstract void setMediaPlayer2EventCallback(java.util.concurrent.Executor, android.media.MediaPlayer2.MediaPlayer2EventCallback);
- method public abstract void setOnDrmConfigHelper(android.media.MediaPlayer2.OnDrmConfigHelper);
- method public abstract void setPlaybackParams(android.media.PlaybackParams);
- method public abstract void setSurface(android.view.Surface);
- method public abstract void setSyncParams(android.media.SyncParams);
- field public static final int CALL_COMPLETED_ATTACH_AUX_EFFECT = 1; // 0x1
- field public static final int CALL_COMPLETED_DESELECT_TRACK = 2; // 0x2
- field public static final int CALL_COMPLETED_LOOP_CURRENT = 3; // 0x3
- field public static final int CALL_COMPLETED_PAUSE = 4; // 0x4
- field public static final int CALL_COMPLETED_PLAY = 5; // 0x5
- field public static final int CALL_COMPLETED_PREPARE = 6; // 0x6
- field public static final int CALL_COMPLETED_RELEASE_DRM = 12; // 0xc
- field public static final int CALL_COMPLETED_RESTORE_DRM_KEYS = 13; // 0xd
- field public static final int CALL_COMPLETED_SEEK_TO = 14; // 0xe
- field public static final int CALL_COMPLETED_SELECT_TRACK = 15; // 0xf
- field public static final int CALL_COMPLETED_SET_AUDIO_ATTRIBUTES = 16; // 0x10
- field public static final int CALL_COMPLETED_SET_AUDIO_SESSION_ID = 17; // 0x11
- field public static final int CALL_COMPLETED_SET_AUX_EFFECT_SEND_LEVEL = 18; // 0x12
- field public static final int CALL_COMPLETED_SET_DATA_SOURCE = 19; // 0x13
- field public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCE = 22; // 0x16
- field public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCES = 23; // 0x17
- field public static final int CALL_COMPLETED_SET_PLAYBACK_PARAMS = 24; // 0x18
- field public static final int CALL_COMPLETED_SET_PLAYBACK_SPEED = 25; // 0x19
- field public static final int CALL_COMPLETED_SET_PLAYER_VOLUME = 26; // 0x1a
- field public static final int CALL_COMPLETED_SET_SURFACE = 27; // 0x1b
- field public static final int CALL_COMPLETED_SET_SYNC_PARAMS = 28; // 0x1c
- field public static final int CALL_COMPLETED_SKIP_TO_NEXT = 29; // 0x1d
- field public static final int CALL_STATUS_BAD_VALUE = 2; // 0x2
- field public static final int CALL_STATUS_ERROR_IO = 4; // 0x4
- field public static final int CALL_STATUS_ERROR_UNKNOWN = -2147483648; // 0x80000000
- field public static final int CALL_STATUS_INVALID_OPERATION = 1; // 0x1
- field public static final int CALL_STATUS_NO_DRM_SCHEME = 5; // 0x5
- field public static final int CALL_STATUS_NO_ERROR = 0; // 0x0
- field public static final int CALL_STATUS_PERMISSION_DENIED = 3; // 0x3
- field public static final int MEDIA_ERROR_IO = -1004; // 0xfffffc14
- field public static final int MEDIA_ERROR_MALFORMED = -1007; // 0xfffffc11
- field public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200; // 0xc8
- field public static final int MEDIA_ERROR_TIMED_OUT = -110; // 0xffffff92
- field public static final int MEDIA_ERROR_UNKNOWN = 1; // 0x1
- field public static final int MEDIA_ERROR_UNSUPPORTED = -1010; // 0xfffffc0e
- field public static final int MEDIA_INFO_AUDIO_NOT_PLAYING = 804; // 0x324
- field public static final int MEDIA_INFO_AUDIO_RENDERING_START = 4; // 0x4
- field public static final int MEDIA_INFO_BAD_INTERLEAVING = 800; // 0x320
- field public static final int MEDIA_INFO_BUFFERING_END = 702; // 0x2be
- field public static final int MEDIA_INFO_BUFFERING_START = 701; // 0x2bd
- field public static final int MEDIA_INFO_BUFFERING_UPDATE = 704; // 0x2c0
- field public static final int MEDIA_INFO_METADATA_UPDATE = 802; // 0x322
- field public static final int MEDIA_INFO_NOT_SEEKABLE = 801; // 0x321
- field public static final int MEDIA_INFO_PLAYBACK_COMPLETE = 5; // 0x5
- field public static final int MEDIA_INFO_PLAYLIST_END = 6; // 0x6
- field public static final int MEDIA_INFO_PREPARED = 100; // 0x64
- field public static final int MEDIA_INFO_STARTED_AS_NEXT = 2; // 0x2
- field public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902; // 0x386
- field public static final int MEDIA_INFO_UNKNOWN = 1; // 0x1
- field public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901; // 0x385
- field public static final int MEDIA_INFO_VIDEO_NOT_PLAYING = 805; // 0x325
- field public static final int MEDIA_INFO_VIDEO_RENDERING_START = 3; // 0x3
- field public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700; // 0x2bc
- 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_SUCCESS = 0; // 0x0
- 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
- field public static final int SEEK_PREVIOUS_SYNC = 0; // 0x0
- field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT = 1; // 0x1
- }
-
- public static abstract class MediaPlayer2.DrmEventCallback {
- ctor public MediaPlayer2.DrmEventCallback();
- method public void onDrmInfo(android.media.MediaPlayer2, android.media.DataSourceDesc, android.media.MediaPlayer2.DrmInfo);
- method public void onDrmPrepared(android.media.MediaPlayer2, android.media.DataSourceDesc, int);
- }
-
- public static abstract class MediaPlayer2.DrmInfo {
- ctor public MediaPlayer2.DrmInfo();
- method public abstract java.util.Map<java.util.UUID, byte[]> getPssh();
- method public abstract java.util.List<java.util.UUID> getSupportedSchemes();
- }
-
- public static abstract class MediaPlayer2.MediaPlayer2EventCallback {
- ctor public MediaPlayer2.MediaPlayer2EventCallback();
- method public void onCallCompleted(android.media.MediaPlayer2, android.media.DataSourceDesc, int, int);
- method public void onCommandLabelReached(android.media.MediaPlayer2, java.lang.Object);
- method public void onError(android.media.MediaPlayer2, android.media.DataSourceDesc, int, int);
- method public void onInfo(android.media.MediaPlayer2, android.media.DataSourceDesc, int, int);
- method public void onMediaTimeChanged(android.media.MediaPlayer2, android.media.DataSourceDesc, android.media.MediaTimestamp);
- method public void onTimedMetaDataAvailable(android.media.MediaPlayer2, android.media.DataSourceDesc, android.media.TimedMetaData);
- method public void onVideoSizeChanged(android.media.MediaPlayer2, android.media.DataSourceDesc, int, int);
- }
-
- public static final class MediaPlayer2.MetricsConstants {
- field public static final java.lang.String CODEC_AUDIO = "android.media.mediaplayer.audio.codec";
- field public static final java.lang.String CODEC_VIDEO = "android.media.mediaplayer.video.codec";
- field public static final java.lang.String DURATION = "android.media.mediaplayer.durationMs";
- field public static final java.lang.String ERRORS = "android.media.mediaplayer.err";
- field public static final java.lang.String ERROR_CODE = "android.media.mediaplayer.errcode";
- field public static final java.lang.String FRAMES = "android.media.mediaplayer.frames";
- field public static final java.lang.String FRAMES_DROPPED = "android.media.mediaplayer.dropped";
- field public static final java.lang.String HEIGHT = "android.media.mediaplayer.height";
- field public static final java.lang.String MIME_TYPE_AUDIO = "android.media.mediaplayer.audio.mime";
- field public static final java.lang.String MIME_TYPE_VIDEO = "android.media.mediaplayer.video.mime";
- field public static final java.lang.String PLAYING = "android.media.mediaplayer.playingMs";
- field public static final java.lang.String WIDTH = "android.media.mediaplayer.width";
- }
-
- public static abstract class MediaPlayer2.NoDrmSchemeException extends android.media.MediaDrmException {
- ctor protected MediaPlayer2.NoDrmSchemeException(java.lang.String);
- }
-
- public static abstract interface MediaPlayer2.OnDrmConfigHelper {
- method public abstract void onDrmConfig(android.media.MediaPlayer2, android.media.DataSourceDesc);
- }
-
- public static abstract class MediaPlayer2.ProvisioningNetworkErrorException extends android.media.MediaDrmException {
- ctor protected MediaPlayer2.ProvisioningNetworkErrorException(java.lang.String);
- }
-
- public static abstract class MediaPlayer2.ProvisioningServerErrorException extends android.media.MediaDrmException {
- ctor protected MediaPlayer2.ProvisioningServerErrorException(java.lang.String);
- }
-
- public static abstract class MediaPlayer2.TrackInfo {
- ctor public MediaPlayer2.TrackInfo();
- method public abstract android.media.MediaFormat getFormat();
- method public abstract java.lang.String getLanguage();
- method public abstract int getTrackType();
- method public abstract java.lang.String toString();
- field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2
- field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5
- field public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; // 0x4
- field public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; // 0x0
- field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1
- }
-
- public abstract class MediaPlayerBase implements java.lang.AutoCloseable {
- ctor public MediaPlayerBase();
- method public abstract android.media.AudioAttributes getAudioAttributes();
- method public long getBufferedPosition();
- method public abstract int getBufferingState();
- method public abstract android.media.DataSourceDesc getCurrentDataSource();
- method public long getCurrentPosition();
- method public long getDuration();
- method public float getMaxPlayerVolume();
- method public float getPlaybackSpeed();
- method public abstract int getPlayerState();
- method public abstract float getPlayerVolume();
- method public boolean isReversePlaybackSupported();
- method public abstract void loopCurrent(boolean);
- method public abstract void pause();
- method public abstract void play();
- method public abstract void prepare();
- method public abstract void registerPlayerEventCallback(java.util.concurrent.Executor, android.media.MediaPlayerBase.PlayerEventCallback);
- method public abstract void reset();
- method public abstract void seekTo(long);
- method public abstract void setAudioAttributes(android.media.AudioAttributes);
- method public abstract void setDataSource(android.media.DataSourceDesc);
- method public abstract void setNextDataSource(android.media.DataSourceDesc);
- method public abstract void setNextDataSources(java.util.List<android.media.DataSourceDesc>);
- method public abstract void setPlaybackSpeed(float);
- method public abstract void setPlayerVolume(float);
- method public abstract void skipToNext();
- method public abstract void unregisterPlayerEventCallback(android.media.MediaPlayerBase.PlayerEventCallback);
- field public static final int BUFFERING_STATE_BUFFERING_AND_PLAYABLE = 1; // 0x1
- field public static final int BUFFERING_STATE_BUFFERING_AND_STARVED = 2; // 0x2
- field public static final int BUFFERING_STATE_BUFFERING_COMPLETE = 3; // 0x3
- field public static final int BUFFERING_STATE_UNKNOWN = 0; // 0x0
- field public static final int PLAYER_STATE_ERROR = 3; // 0x3
- field public static final int PLAYER_STATE_IDLE = 0; // 0x0
- field public static final int PLAYER_STATE_PAUSED = 1; // 0x1
- field public static final int PLAYER_STATE_PLAYING = 2; // 0x2
- field public static final long UNKNOWN_TIME = -1L; // 0xffffffffffffffffL
- }
-
- public static abstract class MediaPlayerBase.PlayerEventCallback {
- ctor public MediaPlayerBase.PlayerEventCallback();
- method public void onBufferingStateChanged(android.media.MediaPlayerBase, android.media.DataSourceDesc, int);
- method public void onCurrentDataSourceChanged(android.media.MediaPlayerBase, android.media.DataSourceDesc);
- method public void onMediaPrepared(android.media.MediaPlayerBase, android.media.DataSourceDesc);
- method public void onPlayerStateChanged(android.media.MediaPlayerBase, int);
- }
-
- public abstract class MediaPlaylistAgent {
- ctor public MediaPlaylistAgent(android.content.Context);
- method public void addPlaylistItem(int, android.media.MediaItem2);
- method public java.util.List<android.media.MediaItem2> getPlaylist();
- method public android.media.MediaMetadata2 getPlaylistMetadata();
- method public int getRepeatMode();
- method public int getShuffleMode();
- method public final void notifyPlaylistChanged();
- method public final void notifyPlaylistMetadataChanged();
- method public final void notifyRepeatModeChanged();
- method public final void notifyShuffleModeChanged();
- method public final void registerPlaylistEventCallback(java.util.concurrent.Executor, android.media.MediaPlaylistAgent.PlaylistEventCallback);
- method public void removePlaylistItem(android.media.MediaItem2);
- method public void replacePlaylistItem(int, android.media.MediaItem2);
- method public void setPlaylist(java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2);
- method public void setRepeatMode(int);
- method public void setShuffleMode(int);
- method public void skipToNextItem();
- method public void skipToPlaylistItem(android.media.MediaItem2);
- method public void skipToPreviousItem();
- method public final void unregisterPlaylistEventCallback(android.media.MediaPlaylistAgent.PlaylistEventCallback);
- method public void updatePlaylistMetadata(android.media.MediaMetadata2);
- field public static final int REPEAT_MODE_ALL = 2; // 0x2
- field public static final int REPEAT_MODE_GROUP = 3; // 0x3
- field public static final int REPEAT_MODE_NONE = 0; // 0x0
- field public static final int REPEAT_MODE_ONE = 1; // 0x1
- field public static final int SHUFFLE_MODE_ALL = 1; // 0x1
- field public static final int SHUFFLE_MODE_GROUP = 2; // 0x2
- field public static final int SHUFFLE_MODE_NONE = 0; // 0x0
- }
-
- public static abstract class MediaPlaylistAgent.PlaylistEventCallback {
- ctor public MediaPlaylistAgent.PlaylistEventCallback();
- method public void onPlaylistChanged(android.media.MediaPlaylistAgent, java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2);
- method public void onPlaylistMetadataChanged(android.media.MediaPlaylistAgent, android.media.MediaMetadata2);
- method public void onRepeatModeChanged(android.media.MediaPlaylistAgent, int);
- method public void onShuffleModeChanged(android.media.MediaPlaylistAgent, int);
- }
-
public class MediaRecorder implements android.media.AudioRouting {
ctor public MediaRecorder();
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
@@ -24882,187 +24342,6 @@ package android.media {
method public abstract void onScanCompleted(java.lang.String, android.net.Uri);
}
- public class MediaSession2 implements java.lang.AutoCloseable {
- method public void addPlaylistItem(int, android.media.MediaItem2);
- method public void clearOnDataSourceMissingHelper();
- method public void close();
- method public void fastForward();
- method public java.util.List<android.media.MediaSession2.ControllerInfo> getConnectedControllers();
- method public android.media.MediaItem2 getCurrentMediaItem();
- method public float getPlaybackSpeed();
- method public android.media.MediaPlayerBase getPlayer();
- method public java.util.List<android.media.MediaItem2> getPlaylist();
- method public android.media.MediaPlaylistAgent getPlaylistAgent();
- method public android.media.MediaMetadata2 getPlaylistMetadata();
- method public int getRepeatMode();
- method public int getShuffleMode();
- method public android.media.SessionToken2 getToken();
- method public android.media.VolumeProvider2 getVolumeProvider();
- method public void notifyError(int, android.os.Bundle);
- method public void pause();
- method public void play();
- method public void prepare();
- method public void removePlaylistItem(android.media.MediaItem2);
- method public void replacePlaylistItem(int, android.media.MediaItem2);
- method public void rewind();
- method public void seekTo(long);
- method public void sendCustomCommand(android.media.MediaSession2.Command, android.os.Bundle);
- method public void sendCustomCommand(android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver);
- method public void setAllowedCommands(android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.CommandGroup);
- method public void setAudioFocusRequest(android.media.AudioFocusRequest);
- method public void setCustomLayout(android.media.MediaSession2.ControllerInfo, java.util.List<android.media.MediaSession2.CommandButton>);
- method public void setOnDataSourceMissingHelper(android.media.MediaSession2.OnDataSourceMissingHelper);
- method public void setPlaybackSpeed(float);
- method public void setPlaylist(java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2);
- method public void setRepeatMode(int);
- method public void setShuffleMode(int);
- method public void skipToNextItem();
- method public void skipToPlaylistItem(android.media.MediaItem2);
- method public void skipToPreviousItem();
- method public void stop();
- method public void updatePlayer(android.media.MediaPlayerBase, android.media.MediaPlaylistAgent, android.media.VolumeProvider2);
- method public void updatePlaylistMetadata(android.media.MediaMetadata2);
- field public static final int COMMAND_CODE_BROWSER = 28; // 0x1c
- field public static final int COMMAND_CODE_CUSTOM = 0; // 0x0
- field public static final int COMMAND_CODE_PLAYBACK_ADJUST_VOLUME = 11; // 0xb
- field public static final int COMMAND_CODE_PLAYBACK_FAST_FORWARD = 7; // 0x7
- field public static final int COMMAND_CODE_PLAYBACK_PAUSE = 2; // 0x2
- field public static final int COMMAND_CODE_PLAYBACK_PLAY = 1; // 0x1
- field public static final int COMMAND_CODE_PLAYBACK_PREPARE = 6; // 0x6
- field public static final int COMMAND_CODE_PLAYBACK_REWIND = 8; // 0x8
- field public static final int COMMAND_CODE_PLAYBACK_SEEK_TO = 9; // 0x9
- field public static final int COMMAND_CODE_PLAYBACK_SET_VOLUME = 10; // 0xa
- field public static final int COMMAND_CODE_PLAYBACK_SKIP_NEXT_ITEM = 4; // 0x4
- field public static final int COMMAND_CODE_PLAYBACK_SKIP_PREV_ITEM = 5; // 0x5
- field public static final int COMMAND_CODE_PLAYBACK_STOP = 3; // 0x3
- field public static final int COMMAND_CODE_PLAYLIST_ADD_ITEM = 15; // 0xf
- field public static final int COMMAND_CODE_PLAYLIST_GET_LIST = 18; // 0x12
- field public static final int COMMAND_CODE_PLAYLIST_GET_LIST_METADATA = 20; // 0x14
- field public static final int COMMAND_CODE_PLAYLIST_REMOVE_ITEM = 16; // 0x10
- field public static final int COMMAND_CODE_PLAYLIST_REPLACE_ITEM = 17; // 0x11
- field public static final int COMMAND_CODE_PLAYLIST_SET_LIST = 19; // 0x13
- field public static final int COMMAND_CODE_PLAYLIST_SET_LIST_METADATA = 21; // 0x15
- field public static final int COMMAND_CODE_PLAYLIST_SET_REPEAT_MODE = 14; // 0xe
- field public static final int COMMAND_CODE_PLAYLIST_SET_SHUFFLE_MODE = 13; // 0xd
- field public static final int COMMAND_CODE_PLAYLIST_SKIP_TO_PLAYLIST_ITEM = 12; // 0xc
- field public static final int COMMAND_CODE_PLAY_FROM_MEDIA_ID = 22; // 0x16
- field public static final int COMMAND_CODE_PLAY_FROM_SEARCH = 24; // 0x18
- field public static final int COMMAND_CODE_PLAY_FROM_URI = 23; // 0x17
- field public static final int COMMAND_CODE_PREPARE_FROM_MEDIA_ID = 25; // 0x19
- field public static final int COMMAND_CODE_PREPARE_FROM_SEARCH = 27; // 0x1b
- field public static final int COMMAND_CODE_PREPARE_FROM_URI = 26; // 0x1a
- field public static final int ERROR_CODE_ACTION_ABORTED = 10; // 0xa
- field public static final int ERROR_CODE_APP_ERROR = 1; // 0x1
- field public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3; // 0x3
- field public static final int ERROR_CODE_CONCURRENT_STREAM_LIMIT = 5; // 0x5
- field public static final int ERROR_CODE_CONTENT_ALREADY_PLAYING = 8; // 0x8
- field public static final int ERROR_CODE_END_OF_QUEUE = 11; // 0xb
- field public static final int ERROR_CODE_NOT_AVAILABLE_IN_REGION = 7; // 0x7
- field public static final int ERROR_CODE_NOT_SUPPORTED = 2; // 0x2
- field public static final int ERROR_CODE_PARENTAL_CONTROL_RESTRICTED = 6; // 0x6
- field public static final int ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED = 4; // 0x4
- field public static final int ERROR_CODE_SETUP_REQUIRED = 12; // 0xc
- field public static final int ERROR_CODE_SKIP_LIMIT_REACHED = 9; // 0x9
- field public static final int ERROR_CODE_UNKNOWN_ERROR = 0; // 0x0
- }
-
- public static final class MediaSession2.Builder {
- ctor public MediaSession2.Builder(android.content.Context);
- method public android.media.MediaSession2 build();
- method public android.media.MediaSession2.Builder setId(java.lang.String);
- method public android.media.MediaSession2.Builder setPlayer(android.media.MediaPlayerBase);
- method public android.media.MediaSession2.Builder setPlaylistAgent(android.media.MediaPlaylistAgent);
- method public android.media.MediaSession2.Builder setSessionActivity(android.app.PendingIntent);
- method public android.media.MediaSession2.Builder setSessionCallback(java.util.concurrent.Executor, android.media.MediaSession2.SessionCallback);
- method public android.media.MediaSession2.Builder setVolumeProvider(android.media.VolumeProvider2);
- }
-
- public static final class MediaSession2.Command {
- ctor public MediaSession2.Command(android.content.Context, int);
- ctor public MediaSession2.Command(android.content.Context, java.lang.String, android.os.Bundle);
- method public int getCommandCode();
- method public java.lang.String getCustomCommand();
- method public android.os.Bundle getExtras();
- }
-
- public static final class MediaSession2.CommandButton {
- method public android.media.MediaSession2.Command getCommand();
- method public java.lang.String getDisplayName();
- method public android.os.Bundle getExtras();
- method public int getIconResId();
- method public boolean isEnabled();
- }
-
- public static final class MediaSession2.CommandButton.Builder {
- ctor public MediaSession2.CommandButton.Builder(android.content.Context);
- method public android.media.MediaSession2.CommandButton build();
- method public android.media.MediaSession2.CommandButton.Builder setCommand(android.media.MediaSession2.Command);
- method public android.media.MediaSession2.CommandButton.Builder setDisplayName(java.lang.String);
- method public android.media.MediaSession2.CommandButton.Builder setEnabled(boolean);
- method public android.media.MediaSession2.CommandButton.Builder setExtras(android.os.Bundle);
- method public android.media.MediaSession2.CommandButton.Builder setIconResId(int);
- }
-
- public static final class MediaSession2.CommandGroup {
- ctor public MediaSession2.CommandGroup(android.content.Context);
- ctor public MediaSession2.CommandGroup(android.content.Context, android.media.MediaSession2.CommandGroup);
- method public void addAllPredefinedCommands();
- method public void addCommand(android.media.MediaSession2.Command);
- method public java.util.List<android.media.MediaSession2.Command> getCommands();
- method public boolean hasCommand(android.media.MediaSession2.Command);
- method public boolean hasCommand(int);
- method public void removeCommand(android.media.MediaSession2.Command);
- }
-
- public static final class MediaSession2.ControllerInfo {
- method public java.lang.String getPackageName();
- method public int getUid();
- method public boolean isTrusted();
- }
-
- public static abstract interface MediaSession2.OnDataSourceMissingHelper {
- method public abstract android.media.DataSourceDesc onDataSourceMissing(android.media.MediaSession2, android.media.MediaItem2);
- }
-
- public static abstract class MediaSession2.SessionCallback {
- ctor public MediaSession2.SessionCallback(android.content.Context);
- method public void onBufferingStateChanged(android.media.MediaSession2, android.media.MediaPlayerBase, android.media.MediaItem2, int);
- method public boolean onCommandRequest(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command);
- method public android.media.MediaSession2.CommandGroup onConnect(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo);
- method public void onCurrentMediaItemChanged(android.media.MediaSession2, android.media.MediaPlayerBase, android.media.MediaItem2);
- method public void onCustomCommand(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver);
- method public void onDisconnected(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo);
- method public void onMediaPrepared(android.media.MediaSession2, android.media.MediaPlayerBase, android.media.MediaItem2);
- method public void onPlayFromMediaId(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle);
- method public void onPlayFromSearch(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle);
- method public void onPlayFromUri(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.net.Uri, android.os.Bundle);
- method public void onPlayerStateChanged(android.media.MediaSession2, android.media.MediaPlayerBase, int);
- method public void onPlaylistChanged(android.media.MediaSession2, android.media.MediaPlaylistAgent, java.util.List<android.media.MediaItem2>, android.media.MediaMetadata2);
- method public void onPlaylistMetadataChanged(android.media.MediaSession2, android.media.MediaPlaylistAgent, android.media.MediaMetadata2);
- method public void onPrepareFromMediaId(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle);
- method public void onPrepareFromSearch(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle);
- method public void onPrepareFromUri(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, android.net.Uri, android.os.Bundle);
- method public void onRepeatModeChanged(android.media.MediaSession2, android.media.MediaPlaylistAgent, int);
- method public void onSetRating(android.media.MediaSession2, android.media.MediaSession2.ControllerInfo, java.lang.String, android.media.Rating2);
- method public void onShuffleModeChanged(android.media.MediaSession2, android.media.MediaPlaylistAgent, int);
- }
-
- public abstract class MediaSessionService2 extends android.app.Service {
- ctor public MediaSessionService2();
- method public final android.media.MediaSession2 getSession();
- method public android.os.IBinder onBind(android.content.Intent);
- method public abstract android.media.MediaSession2 onCreateSession(java.lang.String);
- method public android.media.MediaSessionService2.MediaNotification onUpdateNotification();
- field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaSessionService2";
- field public static final java.lang.String SERVICE_META_DATA = "android.media.session";
- }
-
- public static class MediaSessionService2.MediaNotification {
- ctor public MediaSessionService2.MediaNotification(android.content.Context, int, android.app.Notification);
- method public android.app.Notification getNotification();
- method public int getNotificationId();
- }
-
public final class MediaSync {
ctor public MediaSync();
method public android.view.Surface createInputSurface();
@@ -25355,22 +24634,6 @@ package android.media {
field public static final int URI_COLUMN_INDEX = 2; // 0x2
}
- public final class SessionToken2 {
- ctor public SessionToken2(android.content.Context, java.lang.String, java.lang.String);
- method public static android.media.SessionToken2 fromBundle(android.content.Context, android.os.Bundle);
- method public java.lang.String getId();
- method public java.lang.String getPackageName();
- method public int getType();
- method public int getUid();
- method public android.os.Bundle toBundle();
- field public static final int TYPE_LIBRARY_SERVICE = 2; // 0x2
- field public static final int TYPE_SESSION = 0; // 0x0
- field public static final int TYPE_SESSION_SERVICE = 1; // 0x1
- }
-
- public static abstract class SessionToken2.TokenType implements java.lang.annotation.Annotation {
- }
-
public class SoundPool {
ctor public deprecated SoundPool(int, int, int);
method public final void autoPause();
@@ -25574,19 +24837,6 @@ package android.media {
field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
}
- public abstract class VolumeProvider2 {
- ctor public VolumeProvider2(android.content.Context, int, int, int);
- method public final int getControlType();
- method public final int getCurrentVolume();
- method public final int getMaxVolume();
- method public void onAdjustVolume(int);
- method public void onSetVolumeTo(int);
- method public final void setCurrentVolume(int);
- field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
- field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
- field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
- }
-
public final class VolumeShaper implements java.lang.AutoCloseable {
method public void apply(android.media.VolumeShaper.Operation);
method public void close();
@@ -26529,23 +25779,14 @@ package android.media.session {
public final class MediaSessionManager {
method public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName);
method public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName, android.os.Handler);
- method public void addOnSessionTokensChangedListener(java.util.concurrent.Executor, android.media.session.MediaSessionManager.OnSessionTokensChangedListener);
- method public java.util.List<android.media.SessionToken2> getActiveSessionTokens();
method public java.util.List<android.media.session.MediaController> getActiveSessions(android.content.ComponentName);
- method public java.util.List<android.media.SessionToken2> getAllSessionTokens();
- method public java.util.List<android.media.SessionToken2> getSessionServiceTokens();
method public void removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener);
- method public void removeOnSessionTokensChangedListener(android.media.session.MediaSessionManager.OnSessionTokensChangedListener);
}
public static abstract interface MediaSessionManager.OnActiveSessionsChangedListener {
method public abstract void onActiveSessionsChanged(java.util.List<android.media.session.MediaController>);
}
- public static abstract interface MediaSessionManager.OnSessionTokensChangedListener {
- method public abstract void onSessionTokensChanged(java.util.List<android.media.SessionToken2>);
- }
-
public final class PlaybackState implements android.os.Parcelable {
method public int describeContents();
method public long getActions();
@@ -40043,6 +39284,7 @@ package android.service.notification {
method public int getSuppressedVisualEffects();
method public int getUserSentiment();
method public boolean isAmbient();
+ method public boolean isSuspended();
method public boolean matchesInterruptionFilter();
field public static final int USER_SENTIMENT_NEGATIVE = -1; // 0xffffffff
field public static final int USER_SENTIMENT_NEUTRAL = 0; // 0x0
@@ -41407,7 +40649,7 @@ package android.telecom {
method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
field public static final int HANDOVER_FAILURE_DEST_APP_REJECTED = 1; // 0x1
field public static final int HANDOVER_FAILURE_NOT_SUPPORTED = 2; // 0x2
- field public static final int HANDOVER_FAILURE_ONGOING_EMERG_CALL = 4; // 0x4
+ field public static final int HANDOVER_FAILURE_ONGOING_EMERGENCY_CALL = 4; // 0x4
field public static final int HANDOVER_FAILURE_UNKNOWN = 5; // 0x5
field public static final int HANDOVER_FAILURE_USER_REJECTED = 3; // 0x3
}
@@ -43339,21 +42581,21 @@ package android.telephony.data {
public class ApnSetting implements android.os.Parcelable {
method public int describeContents();
method public java.lang.String getApnName();
+ method public int getApnTypeBitmask();
method public int getAuthType();
method public java.lang.String getEntryName();
method public int getId();
- method public int getMmsPort();
- method public java.net.InetAddress getMmsProxy();
- method public java.net.URL getMmsc();
- method public java.lang.String getMvnoType();
+ method public java.net.InetAddress getMmsProxyAddress();
+ method public int getMmsProxyPort();
+ method public android.net.Uri getMmsc();
+ method public int getMvnoType();
method public int getNetworkTypeBitmask();
method public java.lang.String getOperatorNumeric();
method public java.lang.String getPassword();
- method public int getPort();
- method public java.lang.String getProtocol();
- method public java.net.InetAddress getProxy();
- method public java.lang.String getRoamingProtocol();
- method public java.util.List<java.lang.String> getTypes();
+ method public int getProtocol();
+ method public java.net.InetAddress getProxyAddress();
+ method public int getProxyPort();
+ method public int getRoamingProtocol();
method public java.lang.String getUser();
method public boolean isEnabled();
method public void writeToParcel(android.os.Parcel, int);
@@ -43362,46 +42604,45 @@ package android.telephony.data {
field public static final int AUTH_TYPE_PAP = 1; // 0x1
field public static final int AUTH_TYPE_PAP_OR_CHAP = 3; // 0x3
field public static final android.os.Parcelable.Creator<android.telephony.data.ApnSetting> CREATOR;
- field public static final java.lang.String MVNO_TYPE_GID = "gid";
- field public static final java.lang.String MVNO_TYPE_ICCID = "iccid";
- field public static final java.lang.String MVNO_TYPE_IMSI = "imsi";
- field public static final java.lang.String MVNO_TYPE_SPN = "spn";
- field public static final java.lang.String PROTOCOL_IP = "IP";
- field public static final java.lang.String PROTOCOL_IPV4V6 = "IPV4V6";
- field public static final java.lang.String PROTOCOL_IPV6 = "IPV6";
- field public static final java.lang.String PROTOCOL_PPP = "PPP";
- field public static final java.lang.String TYPE_ALL = "*";
- field public static final java.lang.String TYPE_CBS = "cbs";
- field public static final java.lang.String TYPE_DEFAULT = "default";
- field public static final java.lang.String TYPE_DUN = "dun";
- field public static final java.lang.String TYPE_EMERGENCY = "emergency";
- field public static final java.lang.String TYPE_FOTA = "fota";
- field public static final java.lang.String TYPE_HIPRI = "hipri";
- field public static final java.lang.String TYPE_IA = "ia";
- field public static final java.lang.String TYPE_IMS = "ims";
- field public static final java.lang.String TYPE_MMS = "mms";
- field public static final java.lang.String TYPE_SUPL = "supl";
+ field public static final int MVNO_TYPE_GID = 2; // 0x2
+ field public static final int MVNO_TYPE_ICCID = 3; // 0x3
+ field public static final int MVNO_TYPE_IMSI = 1; // 0x1
+ field public static final int MVNO_TYPE_SPN = 0; // 0x0
+ field public static final int PROTOCOL_IP = 0; // 0x0
+ field public static final int PROTOCOL_IPV4V6 = 2; // 0x2
+ field public static final int PROTOCOL_IPV6 = 1; // 0x1
+ field public static final int PROTOCOL_PPP = 3; // 0x3
+ field public static final int TYPE_CBS = 128; // 0x80
+ field public static final int TYPE_DEFAULT = 17; // 0x11
+ field public static final int TYPE_DUN = 8; // 0x8
+ field public static final int TYPE_EMERGENCY = 512; // 0x200
+ field public static final int TYPE_FOTA = 32; // 0x20
+ field public static final int TYPE_HIPRI = 16; // 0x10
+ field public static final int TYPE_IA = 256; // 0x100
+ field public static final int TYPE_IMS = 64; // 0x40
+ field public static final int TYPE_MMS = 2; // 0x2
+ field public static final int TYPE_SUPL = 4; // 0x4
}
public static class ApnSetting.Builder {
ctor public ApnSetting.Builder();
method public android.telephony.data.ApnSetting build();
method public android.telephony.data.ApnSetting.Builder setApnName(java.lang.String);
+ method public android.telephony.data.ApnSetting.Builder setApnTypeBitmask(int);
method public android.telephony.data.ApnSetting.Builder setAuthType(int);
method public android.telephony.data.ApnSetting.Builder setCarrierEnabled(boolean);
method public android.telephony.data.ApnSetting.Builder setEntryName(java.lang.String);
- method public android.telephony.data.ApnSetting.Builder setMmsPort(int);
- method public android.telephony.data.ApnSetting.Builder setMmsProxy(java.net.InetAddress);
- method public android.telephony.data.ApnSetting.Builder setMmsc(java.net.URL);
- method public android.telephony.data.ApnSetting.Builder setMvnoType(java.lang.String);
+ method public android.telephony.data.ApnSetting.Builder setMmsProxyAddress(java.net.InetAddress);
+ method public android.telephony.data.ApnSetting.Builder setMmsProxyPort(int);
+ method public android.telephony.data.ApnSetting.Builder setMmsc(android.net.Uri);
+ method public android.telephony.data.ApnSetting.Builder setMvnoType(int);
method public android.telephony.data.ApnSetting.Builder setNetworkTypeBitmask(int);
method public android.telephony.data.ApnSetting.Builder setOperatorNumeric(java.lang.String);
method public android.telephony.data.ApnSetting.Builder setPassword(java.lang.String);
- method public android.telephony.data.ApnSetting.Builder setPort(int);
- method public android.telephony.data.ApnSetting.Builder setProtocol(java.lang.String);
- method public android.telephony.data.ApnSetting.Builder setProxy(java.net.InetAddress);
- method public android.telephony.data.ApnSetting.Builder setRoamingProtocol(java.lang.String);
- method public android.telephony.data.ApnSetting.Builder setTypes(java.util.List<java.lang.String>);
+ method public android.telephony.data.ApnSetting.Builder setProtocol(int);
+ method public android.telephony.data.ApnSetting.Builder setProxyAddress(java.net.InetAddress);
+ method public android.telephony.data.ApnSetting.Builder setProxyPort(int);
+ method public android.telephony.data.ApnSetting.Builder setRoamingProtocol(int);
method public android.telephony.data.ApnSetting.Builder setUser(java.lang.String);
}
@@ -44044,7 +43285,7 @@ package android.text {
method public abstract int getSpanTypeId();
}
- public class PrecomputedText implements android.text.Spanned {
+ public class PrecomputedText implements android.text.Spannable {
method public char charAt(int);
method public static android.text.PrecomputedText create(java.lang.CharSequence, android.text.PrecomputedText.Params);
method public int getParagraphCount();
@@ -44058,6 +43299,8 @@ package android.text {
method public java.lang.CharSequence getText();
method public int length();
method public int nextSpanTransition(int, int, java.lang.Class);
+ method public void removeSpan(java.lang.Object);
+ method public void setSpan(java.lang.Object, int, int, int);
method public java.lang.CharSequence subSequence(int, int);
}
@@ -48293,6 +47536,7 @@ package android.view {
method public boolean isOpaque();
method protected boolean isPaddingOffsetRequired();
method public boolean isPaddingRelative();
+ method public boolean isPivotSet();
method public boolean isPressed();
method public boolean isSaveEnabled();
method public boolean isSaveFromParentEnabled();
@@ -48411,6 +47655,7 @@ package android.view {
method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean);
method public final void requestUnbufferedDispatch(android.view.MotionEvent);
method public final <T extends android.view.View> T requireViewById(int);
+ method public void resetPivot();
method public static int resolveSize(int, int);
method public static int resolveSizeAndState(int, int, int);
method public boolean restoreDefaultFocus();
@@ -51578,7 +50823,6 @@ package android.webkit {
field public static final int CATEGORIES_WEB_DEVELOPER = 4; // 0x4
field public static final int RECORD_CONTINUOUSLY = 1; // 0x1
field public static final int RECORD_UNTIL_FULL = 0; // 0x0
- field public static final int RECORD_UNTIL_FULL_LARGE_BUFFER = 2; // 0x2
}
public static class TracingConfig.Builder {
@@ -51985,6 +51229,7 @@ package android.webkit {
method public android.webkit.WebChromeClient getWebChromeClient();
method public static java.lang.ClassLoader getWebViewClassLoader();
method public android.webkit.WebViewClient getWebViewClient();
+ method public android.os.Looper getWebViewLooper();
method public void goBack();
method public void goBackOrForward(int);
method public void goForward();
@@ -53420,20 +52665,6 @@ package android.widget {
method public void update();
}
- public class MediaControlView2 extends android.view.ViewGroup {
- ctor public MediaControlView2(android.content.Context);
- ctor public MediaControlView2(android.content.Context, android.util.AttributeSet);
- ctor public MediaControlView2(android.content.Context, android.util.AttributeSet, int);
- ctor public MediaControlView2(android.content.Context, android.util.AttributeSet, int, int);
- method public void requestPlayButtonFocus();
- method public void setMediaSessionToken(android.media.SessionToken2);
- method public void setOnFullScreenListener(android.widget.MediaControlView2.OnFullScreenListener);
- }
-
- public static abstract interface MediaControlView2.OnFullScreenListener {
- method public abstract void onFullScreen(android.view.View, boolean);
- }
-
public class MediaController extends android.widget.FrameLayout {
ctor public MediaController(android.content.Context, android.util.AttributeSet);
ctor public MediaController(android.content.Context, boolean);
@@ -54824,27 +54055,6 @@ package android.widget {
method public void suspend();
}
- public class VideoView2 extends android.view.ViewGroup {
- ctor public VideoView2(android.content.Context);
- ctor public VideoView2(android.content.Context, android.util.AttributeSet);
- ctor public VideoView2(android.content.Context, android.util.AttributeSet, int);
- ctor public VideoView2(android.content.Context, android.util.AttributeSet, int, int);
- method public android.widget.MediaControlView2 getMediaControlView2();
- method public android.media.SessionToken2 getMediaSessionToken();
- method public int getViewType();
- method public boolean isSubtitleEnabled();
- method public void setAudioAttributes(android.media.AudioAttributes);
- method public void setAudioFocusRequest(int);
- method public void setDataSource(android.media.DataSourceDesc);
- method public void setMediaControlView2(android.widget.MediaControlView2, long);
- method public void setMediaItem(android.media.MediaItem2);
- method public void setSpeed(float);
- method public void setSubtitleEnabled(boolean);
- method public void setViewType(int);
- field public static final int VIEW_TYPE_SURFACEVIEW = 1; // 0x1
- field public static final int VIEW_TYPE_TEXTUREVIEW = 2; // 0x2
- }
-
public class ViewAnimator extends android.widget.FrameLayout {
ctor public ViewAnimator(android.content.Context);
ctor public ViewAnimator(android.content.Context, android.util.AttributeSet);
diff --git a/api/removed.txt b/api/removed.txt
index a5370f48fb3a..1228fd18c71a 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -155,6 +155,13 @@ package android.graphics {
public final class ImageDecoder implements java.lang.AutoCloseable {
method public deprecated boolean getAsAlphaMask();
method public deprecated android.graphics.ImageDecoder setAsAlphaMask(boolean);
+ field public static final deprecated int ERROR_SOURCE_ERROR = 3; // 0x3
+ field public static final deprecated int ERROR_SOURCE_EXCEPTION = 1; // 0x1
+ field public static final deprecated int ERROR_SOURCE_INCOMPLETE = 2; // 0x2
+ }
+
+ public static deprecated class ImageDecoder.IncompleteException extends java.io.IOException {
+ ctor public ImageDecoder.IncompleteException();
}
public deprecated class LayerRasterizer extends android.graphics.Rasterizer {
diff --git a/api/system-current.txt b/api/system-current.txt
index e1b576de15ac..ec84bf091ecb 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -32,6 +32,7 @@ package android {
field public static final java.lang.String BIND_RESOLVER_RANKER_SERVICE = "android.permission.BIND_RESOLVER_RANKER_SERVICE";
field public static final java.lang.String BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE = "android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE";
field public static final java.lang.String BIND_SETTINGS_SUGGESTIONS_SERVICE = "android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE";
+ field public static final java.lang.String BIND_SOUND_TRIGGER_DETECTION_SERVICE = "android.permission.BIND_SOUND_TRIGGER_DETECTION_SERVICE";
field public static final java.lang.String BIND_TELEPHONY_DATA_SERVICE = "android.permission.BIND_TELEPHONY_DATA_SERVICE";
field public static final java.lang.String BIND_TELEPHONY_NETWORK_SERVICE = "android.permission.BIND_TELEPHONY_NETWORK_SERVICE";
field public static final java.lang.String BIND_TEXTCLASSIFIER_SERVICE = "android.permission.BIND_TEXTCLASSIFIER_SERVICE";
@@ -99,6 +100,8 @@ package android {
field public static final java.lang.String MANAGE_CARRIER_OEM_UNLOCK_STATE = "android.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE";
field public static final java.lang.String MANAGE_CA_CERTIFICATES = "android.permission.MANAGE_CA_CERTIFICATES";
field public static final java.lang.String MANAGE_DEVICE_ADMINS = "android.permission.MANAGE_DEVICE_ADMINS";
+ field public static final java.lang.String MANAGE_IPSEC_TUNNELS = "android.permission.MANAGE_IPSEC_TUNNELS";
+ field public static final java.lang.String MANAGE_SOUND_TRIGGER = "android.permission.MANAGE_SOUND_TRIGGER";
field public static final java.lang.String MANAGE_SUBSCRIPTION_PLANS = "android.permission.MANAGE_SUBSCRIPTION_PLANS";
field public static final java.lang.String MANAGE_USB = "android.permission.MANAGE_USB";
field public static final java.lang.String MANAGE_USERS = "android.permission.MANAGE_USERS";
@@ -118,6 +121,7 @@ package android {
field public static final java.lang.String MOVE_PACKAGE = "android.permission.MOVE_PACKAGE";
field public static final java.lang.String NOTIFICATION_DURING_SETUP = "android.permission.NOTIFICATION_DURING_SETUP";
field public static final java.lang.String NOTIFY_TV_INPUTS = "android.permission.NOTIFY_TV_INPUTS";
+ field public static final java.lang.String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE";
field public static final java.lang.String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
field public static final java.lang.String PACKAGE_USAGE_STATS = "android.permission.PACKAGE_USAGE_STATS";
field public static final java.lang.String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT";
@@ -179,6 +183,7 @@ package android {
field public static final java.lang.String STATUS_BAR = "android.permission.STATUS_BAR";
field public static final java.lang.String STOP_APP_SWITCHES = "android.permission.STOP_APP_SWITCHES";
field public static final java.lang.String SUBSTITUTE_NOTIFICATION_APP_NAME = "android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME";
+ field public static final java.lang.String SUSPEND_APPS = "android.permission.SUSPEND_APPS";
field public static final java.lang.String TETHER_PRIVILEGED = "android.permission.TETHER_PRIVILEGED";
field public static final java.lang.String TV_INPUT_HARDWARE = "android.permission.TV_INPUT_HARDWARE";
field public static final java.lang.String TV_VIRTUAL_REMOTE_CONTROLLER = "android.permission.TV_VIRTUAL_REMOTE_CONTROLLER";
@@ -205,7 +210,7 @@ package android {
field public static final int isVrOnly = 16844152; // 0x1010578
field public static final int requiredSystemPropertyName = 16844133; // 0x1010565
field public static final int requiredSystemPropertyValue = 16844134; // 0x1010566
- field public static final int userRestriction = 16844165; // 0x1010585
+ field public static final int userRestriction = 16844164; // 0x1010584
}
public static final class R.raw {
@@ -281,6 +286,7 @@ package android.app {
field public static final java.lang.String OPSTR_GET_ACCOUNTS = "android:get_accounts";
field public static final java.lang.String OPSTR_GPS = "android:gps";
field public static final java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
+ field public static final java.lang.String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
field public static final java.lang.String OPSTR_MUTE_MICROPHONE = "android:mute_microphone";
field public static final java.lang.String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells";
field public static final java.lang.String OPSTR_PLAY_AUDIO = "android:play_audio";
@@ -723,6 +729,13 @@ package android.app.usage {
method public java.lang.String getNotificationChannelId();
field public static final int NOTIFICATION_INTERRUPTION = 12; // 0xc
field public static final int NOTIFICATION_SEEN = 10; // 0xa
+ field public static final int SLICE_PINNED = 14; // 0xe
+ field public static final int SLICE_PINNED_PRIV = 13; // 0xd
+ field public static final int SYSTEM_INTERACTION = 6; // 0x6
+ }
+
+ public final class UsageStats implements android.os.Parcelable {
+ method public int getAppLaunchCount();
}
public final class UsageStatsManager {
@@ -1011,15 +1024,19 @@ package android.content.pm {
method public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(java.lang.String);
method public abstract int getIntentVerificationStatusAsUser(java.lang.String, int);
method public abstract int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public android.os.PersistableBundle getSuspendedPackageAppExtras(java.lang.String);
method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
method public abstract int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public boolean isPackageSuspended(java.lang.String);
method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceiversAsUser(android.content.Intent, int, android.os.UserHandle);
method public abstract void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback);
method public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
method public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
method public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
method public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence);
+ method public java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String);
+ method public void setSuspendedPackageAppExtras(java.lang.String, android.os.PersistableBundle);
method public abstract void setUpdateAvailable(java.lang.String, boolean);
method public abstract boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int);
method public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle);
@@ -1232,7 +1249,9 @@ package android.hardware.display {
public final class DisplayManager {
method public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats();
+ method public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
method public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
+ method public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
method public android.graphics.Point getStableDisplaySize();
method public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
}
@@ -2219,6 +2238,21 @@ package android.hardware.radio {
}
+package android.hardware.soundtrigger {
+
+ public class SoundTrigger {
+ field public static final int STATUS_OK = 0; // 0x0
+ }
+
+ public static class SoundTrigger.RecognitionEvent {
+ method public android.media.AudioFormat getCaptureFormat();
+ method public int getCaptureSession();
+ method public byte[] getData();
+ method public boolean isCaptureAvailable();
+ }
+
+}
+
package android.hardware.usb {
public class UsbDeviceConnection {
@@ -2734,6 +2768,16 @@ package android.media.session {
package android.media.soundtrigger {
+ public abstract class SoundTriggerDetectionService extends android.app.Service {
+ ctor public SoundTriggerDetectionService();
+ method public void onConnected(java.util.UUID, android.os.Bundle);
+ method public void onDisconnected(java.util.UUID, android.os.Bundle);
+ method public void onError(java.util.UUID, android.os.Bundle, int, int);
+ method public void onGenericRecognitionEvent(java.util.UUID, android.os.Bundle, int, android.hardware.soundtrigger.SoundTrigger.RecognitionEvent);
+ method public abstract void onStopOperation(java.util.UUID, android.os.Bundle, int);
+ method public final void operationFinished(java.util.UUID, int);
+ }
+
public final class SoundTriggerDetector {
method public boolean startRecognition(int);
method public boolean stopRecognition();
@@ -2758,6 +2802,7 @@ package android.media.soundtrigger {
public final class SoundTriggerManager {
method public android.media.soundtrigger.SoundTriggerDetector createSoundTriggerDetector(java.util.UUID, android.media.soundtrigger.SoundTriggerDetector.Callback, android.os.Handler);
method public void deleteModel(java.util.UUID);
+ method public int getDetectionServiceOperationsTimeout();
method public android.media.soundtrigger.SoundTriggerManager.Model getModel(java.util.UUID);
method public void updateModel(android.media.soundtrigger.SoundTriggerManager.Model);
}
@@ -3034,8 +3079,10 @@ package android.net {
}
public static final class IpSecManager.IpSecTunnelInterface implements java.lang.AutoCloseable {
+ method public void addAddress(android.net.LinkAddress) throws java.io.IOException;
method public void close();
method public java.lang.String getInterfaceName();
+ method public void removeAddress(android.net.LinkAddress) throws java.io.IOException;
}
public final class IpSecTransform implements java.lang.AutoCloseable {
@@ -4201,7 +4248,7 @@ package android.provider {
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean);
method public static void resetToDefaults(android.content.ContentResolver, java.lang.String);
- field public static final java.lang.String AUTOFILL_COMPAT_ALLOWED_PACKAGES = "autofill_compat_allowed_packages";
+ field public static final java.lang.String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
field public static final java.lang.String CARRIER_APP_NAMES = "carrier_app_names";
field public static final java.lang.String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
field public static final java.lang.String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus";
@@ -4276,7 +4323,6 @@ package android.security.keystore.recovery {
method public int getUserSecretType();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyChainProtectionParams> CREATOR;
- field public static final int TYPE_CUSTOM_PASSWORD = 101; // 0x65
field public static final int TYPE_LOCKSCREEN = 100; // 0x64
field public static final int UI_FORMAT_PASSWORD = 2; // 0x2
field public static final int UI_FORMAT_PATTERN = 3; // 0x3
@@ -4308,11 +4354,14 @@ package android.security.keystore.recovery {
}
public final class KeyDerivationParams implements android.os.Parcelable {
+ method public static android.security.keystore.recovery.KeyDerivationParams createScryptParams(byte[], int);
method public static android.security.keystore.recovery.KeyDerivationParams createSha256Params(byte[]);
method public int describeContents();
method public int getAlgorithm();
+ method public int getMemoryDifficulty();
method public byte[] getSalt();
method public void writeToParcel(android.os.Parcel, int);
+ field public static final int ALGORITHM_SCRYPT = 2; // 0x2
field public static final int ALGORITHM_SHA256 = 1; // 0x1
field public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyDerivationParams> CREATOR;
}
@@ -4331,15 +4380,14 @@ package android.security.keystore.recovery {
method public static android.security.keystore.recovery.RecoveryController getInstance(android.content.Context);
method public java.security.Key getKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, java.security.UnrecoverableKeyException;
method public android.security.keystore.recovery.KeyChainSnapshot getKeyChainSnapshot() throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public int[] getPendingRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public deprecated android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public int getRecoveryStatus(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public java.util.Map<java.lang.String, java.security.cert.X509Certificate> getRootCertificates();
method public java.security.Key importKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
method public deprecated void initRecoveryService(java.lang.String, byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
method public void initRecoveryService(java.lang.String, byte[], byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
- method public void recoverySecretAvailable(android.security.keystore.recovery.KeyChainProtectionParams) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void removeKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void setRecoverySecretTypes(int[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public deprecated void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException;
@@ -4353,9 +4401,11 @@ package android.security.keystore.recovery {
public class RecoverySession implements java.lang.AutoCloseable {
method public void close();
- method public java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
+ method public java.util.Map<java.lang.String, java.security.Key> recoverKeyChainSnapshot(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
+ method public deprecated java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
- method public byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public byte[] start(java.lang.String, java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
}
public class SessionExpiredException extends java.security.GeneralSecurityException {
@@ -5442,6 +5492,7 @@ package android.telephony.euicc {
public class EuiccManager {
method public void continueOperation(android.content.Intent, android.os.Bundle);
+ method public void eraseSubscriptions(android.app.PendingIntent);
method public void getDefaultDownloadableSubscriptionList(android.app.PendingIntent);
method public void getDownloadableSubscriptionMetadata(android.telephony.euicc.DownloadableSubscription, android.app.PendingIntent);
method public int getOtaStatus();
diff --git a/api/test-current.txt b/api/test-current.txt
index e8d27a1e876c..dd16771186f1 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -79,6 +79,7 @@ package android.app {
field public static final java.lang.String OPSTR_GET_ACCOUNTS = "android:get_accounts";
field public static final java.lang.String OPSTR_GPS = "android:gps";
field public static final java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
+ field public static final java.lang.String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
field public static final java.lang.String OPSTR_MUTE_MICROPHONE = "android:mute_microphone";
field public static final java.lang.String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells";
field public static final java.lang.String OPSTR_PLAY_AUDIO = "android:play_audio";
@@ -294,6 +295,14 @@ package android.database.sqlite {
}
+package android.graphics {
+
+ public final class ImageDecoder implements java.lang.AutoCloseable {
+ method public static android.graphics.ImageDecoder.Source createSource(android.content.res.Resources, java.io.InputStream, int);
+ }
+
+}
+
package android.graphics.drawable {
public class AdaptiveIconDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
@@ -370,7 +379,9 @@ package android.hardware.display {
public final class DisplayManager {
method public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats();
+ method public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
method public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
+ method public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
method public android.graphics.Point getStableDisplaySize();
method public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
}
@@ -405,20 +416,20 @@ package android.location {
ctor public GnssMeasurement();
method public void reset();
method public void resetAutomaticGainControlLevel();
- method public void resetCarrierCycles();
+ method public deprecated void resetCarrierCycles();
method public void resetCarrierFrequencyHz();
- method public void resetCarrierPhase();
- method public void resetCarrierPhaseUncertainty();
+ method public deprecated void resetCarrierPhase();
+ method public deprecated void resetCarrierPhaseUncertainty();
method public void resetSnrInDb();
method public void set(android.location.GnssMeasurement);
method public void setAccumulatedDeltaRangeMeters(double);
method public void setAccumulatedDeltaRangeState(int);
method public void setAccumulatedDeltaRangeUncertaintyMeters(double);
method public void setAutomaticGainControlLevelInDb(double);
- method public void setCarrierCycles(long);
+ method public deprecated void setCarrierCycles(long);
method public void setCarrierFrequencyHz(float);
- method public void setCarrierPhase(double);
- method public void setCarrierPhaseUncertainty(double);
+ method public deprecated void setCarrierPhase(double);
+ method public deprecated void setCarrierPhaseUncertainty(double);
method public void setCn0DbHz(double);
method public void setConstellationType(int);
method public void setMultipathIndicator(int);
@@ -430,6 +441,7 @@ package android.location {
method public void setState(int);
method public void setSvid(int);
method public void setTimeOffsetNanos(double);
+ field public static final int ADR_STATE_ALL = 31; // 0x1f
}
public final class GnssMeasurementsEvent implements android.os.Parcelable {
@@ -568,7 +580,7 @@ package android.provider {
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
- field public static final java.lang.String AUTOFILL_COMPAT_ALLOWED_PACKAGES = "autofill_compat_allowed_packages";
+ field public static final java.lang.String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
field public static final java.lang.String HIDDEN_API_BLACKLIST_EXEMPTIONS = "hidden_api_blacklist_exemptions";
field public static final java.lang.String LOCATION_GLOBAL_KILL_SWITCH = "location_global_kill_switch";
field public static final java.lang.String LOW_POWER_MODE = "low_power";
diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp
index 5065a56078d0..ece308393665 100644
--- a/cmds/incidentd/src/Section.cpp
+++ b/cmds/incidentd/src/Section.cpp
@@ -374,9 +374,9 @@ status_t GZipSection::Execute(ReportRequestSet* requests) const {
// ProtoOutputStream is to avoid allocation of another buffer inside ProtoOutputStream.
EncodedBuffer* internalBuffer = buffer.getInternalBuffer();
internalBuffer->writeHeader((uint32_t)GZippedFileProto::FILENAME, WIRE_TYPE_LENGTH_DELIMITED);
- String8 usedFile(mFilenames[index]);
- internalBuffer->writeRawVarint32(usedFile.size());
- for (size_t i = 0; i < usedFile.size(); i++) {
+ size_t fileLen = strlen(mFilenames[index]);
+ internalBuffer->writeRawVarint32(fileLen);
+ for (size_t i = 0; i < fileLen; i++) {
internalBuffer->writeRawByte(mFilenames[index][i]);
}
internalBuffer->writeHeader((uint32_t)GZippedFileProto::GZIPPED_DATA,
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
index 5d6a1d1a6c15..79c0d7145e44 100644
--- a/cmds/statsd/Android.mk
+++ b/cmds/statsd/Android.mk
@@ -135,6 +135,12 @@ LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
LOCAL_MODULE_CLASS := EXECUTABLES
+# Enable sanitizer on eng builds
+ifeq ($(TARGET_BUILD_VARIANT),eng)
+ LOCAL_CLANG := true
+ LOCAL_SANITIZE := address
+endif
+
LOCAL_INIT_RC := statsd.rc
include $(BUILD_EXECUTABLE)
@@ -177,6 +183,7 @@ LOCAL_SRC_FILES := \
tests/LogEvent_test.cpp \
tests/MetricsManager_test.cpp \
tests/StatsLogProcessor_test.cpp \
+ tests/StatsService_test.cpp \
tests/UidMap_test.cpp \
tests/FieldValue_test.cpp \
tests/condition/CombinationConditionTracker_test.cpp \
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index 8b681eddb605..a35570bd7bba 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -239,14 +239,13 @@ void StatsLogProcessor::dumpStates(FILE* out, bool verbose) {
}
}
+/*
+ * onDumpReport dumps serialized ConfigMetricsReportList into outData.
+ */
void StatsLogProcessor::onDumpReport(const ConfigKey& key, const uint64_t dumpTimeStampNs,
vector<uint8_t>* outData) {
std::lock_guard<std::mutex> lock(mMetricsMutex);
- onDumpReportLocked(key, dumpTimeStampNs, outData);
-}
-void StatsLogProcessor::onDumpReportLocked(const ConfigKey& key, const uint64_t dumpTimeStampNs,
- vector<uint8_t>* outData) {
auto it = mMetricsManagers.find(key);
if (it == mMetricsManagers.end()) {
ALOGW("Config source %s does not exist", key.ToString().c_str());
@@ -269,35 +268,14 @@ void StatsLogProcessor::onDumpReportLocked(const ConfigKey& key, const uint64_t
// Start of ConfigMetricsReport (reports).
uint64_t reportsToken =
proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_REPORTS);
-
- int64_t lastReportTimeNs = it->second->getLastReportTimeNs();
- int64_t lastReportWallClockNs = it->second->getLastReportWallClockNs();
-
- // First, fill in ConfigMetricsReport using current data on memory, which
- // starts from filling in StatsLogReport's.
- it->second->onDumpReport(dumpTimeStampNs, &proto);
-
- // Fill in UidMap.
- vector<uint8_t> uidMap;
- mUidMap->getOutput(key, &uidMap);
- proto.write(FIELD_TYPE_MESSAGE | FIELD_ID_UID_MAP, uidMap.data());
-
- // Fill in the timestamps.
- proto.write(FIELD_TYPE_INT64 | FIELD_ID_LAST_REPORT_ELAPSED_NANOS,
- (long long)lastReportTimeNs);
- proto.write(FIELD_TYPE_INT64 | FIELD_ID_CURRENT_REPORT_ELAPSED_NANOS,
- (long long)dumpTimeStampNs);
- proto.write(FIELD_TYPE_INT64 | FIELD_ID_LAST_REPORT_WALL_CLOCK_NANOS,
- (long long)lastReportWallClockNs);
- proto.write(FIELD_TYPE_INT64 | FIELD_ID_CURRENT_REPORT_WALL_CLOCK_NANOS,
- (long long)getWallClockNs());
-
- // End of ConfigMetricsReport (reports).
+ onConfigMetricsReportLocked(key, dumpTimeStampNs, &proto);
proto.end(reportsToken);
+ // End of ConfigMetricsReport (reports).
+
// Then, check stats-data directory to see there's any file containing
// ConfigMetricsReport from previous shutdowns to concatenate to reports.
- StorageManager::appendConfigMetricsReport(proto);
+ StorageManager::appendConfigMetricsReport(key, &proto);
if (outData != nullptr) {
outData->clear();
@@ -315,6 +293,40 @@ void StatsLogProcessor::onDumpReportLocked(const ConfigKey& key, const uint64_t
StatsdStats::getInstance().noteMetricsReportSent(key);
}
+/*
+ * onConfigMetricsReportLocked dumps serialized ConfigMetricsReport into outData.
+ */
+void StatsLogProcessor::onConfigMetricsReportLocked(const ConfigKey& key,
+ const uint64_t dumpTimeStampNs,
+ ProtoOutputStream* proto) {
+ // We already checked whether key exists in mMetricsManagers in
+ // WriteDataToDisk.
+ auto it = mMetricsManagers.find(key);
+ int64_t lastReportTimeNs = it->second->getLastReportTimeNs();
+ int64_t lastReportWallClockNs = it->second->getLastReportWallClockNs();
+
+ // First, fill in ConfigMetricsReport using current data on memory, which
+ // starts from filling in StatsLogReport's.
+ it->second->onDumpReport(dumpTimeStampNs, proto);
+
+ // Fill in UidMap.
+ uint64_t uidMapToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_ID_UID_MAP);
+ mUidMap->appendUidMap(key, proto);
+ proto->end(uidMapToken);
+
+ // Fill in the timestamps.
+ proto->write(FIELD_TYPE_INT64 | FIELD_ID_LAST_REPORT_ELAPSED_NANOS,
+ (long long)lastReportTimeNs);
+ proto->write(FIELD_TYPE_INT64 | FIELD_ID_CURRENT_REPORT_ELAPSED_NANOS,
+ (long long)dumpTimeStampNs);
+ proto->write(FIELD_TYPE_INT64 | FIELD_ID_LAST_REPORT_WALL_CLOCK_NANOS,
+ (long long)lastReportWallClockNs);
+ proto->write(FIELD_TYPE_INT64 | FIELD_ID_CURRENT_REPORT_WALL_CLOCK_NANOS,
+ (long long)getWallClockNs());
+
+
+}
+
void StatsLogProcessor::OnConfigRemoved(const ConfigKey& key) {
std::lock_guard<std::mutex> lock(mMetricsMutex);
auto it = mMetricsManagers.find(key);
@@ -348,7 +360,7 @@ void StatsLogProcessor::flushIfNecessaryLocked(
metricsManager.dropData(timestampNs);
StatsdStats::getInstance().noteDataDropped(key);
VLOG("StatsD had to toss out metrics for %s", key.ToString().c_str());
- } else if (totalBytes > .9 * StatsdStats::kMaxMetricsBytesPerConfig) {
+ } else if (totalBytes > StatsdStats::kBytesPerConfigTriggerGetData) {
// Send broadcast so that receivers can pull data.
auto lastBroadcastTime = mLastBroadcastTimes.find(key);
if (lastBroadcastTime != mLastBroadcastTimes.end()) {
@@ -368,11 +380,17 @@ void StatsLogProcessor::WriteDataToDisk() {
std::lock_guard<std::mutex> lock(mMetricsMutex);
for (auto& pair : mMetricsManagers) {
const ConfigKey& key = pair.first;
- vector<uint8_t> data;
- onDumpReportLocked(key, getElapsedRealtimeNs(), &data);
+ ProtoOutputStream proto;
+ onConfigMetricsReportLocked(key, getElapsedRealtimeNs(), &proto);
string file_name = StringPrintf("%s/%ld_%d_%lld", STATS_DATA_DIR,
(long)getWallClockSec(), key.GetUid(), (long long)key.GetId());
- StorageManager::writeFile(file_name.c_str(), &data[0], data.size());
+ android::base::unique_fd fd(open(file_name.c_str(),
+ O_WRONLY | O_CREAT | O_CLOEXEC, S_IRUSR | S_IWUSR));
+ if (fd == -1) {
+ VLOG("Attempt to write %s but failed", file_name.c_str());
+ return;
+ }
+ proto.flush(fd.get());
}
}
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index 8b42146c6621..1be4dc5d58c7 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -86,8 +86,8 @@ private:
sp<AlarmMonitor> mPeriodicAlarmMonitor;
- void onDumpReportLocked(const ConfigKey& key, const uint64_t dumpTimeNs,
- vector<uint8_t>* outData);
+ void onConfigMetricsReportLocked(const ConfigKey& key, const uint64_t dumpTimeStampNs,
+ util::ProtoOutputStream* proto);
/* Check if we should send a broadcast if approaching memory limits and if we're over, we
* actually delete the data. */
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index c5dfc4488c1b..b86646a32ac8 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -867,14 +867,11 @@ Status StatsService::addConfiguration(int64_t key,
bool* success) {
IPCThreadState* ipc = IPCThreadState::self();
if (checkCallingPermission(String16(kPermissionDump))) {
- ConfigKey configKey(ipc->getCallingUid(), key);
- StatsdConfig cfg;
- if (config.empty() || !cfg.ParseFromArray(&config[0], config.size())) {
+ if (addConfigurationChecked(ipc->getCallingUid(), key, config)) {
+ *success = true;
+ } else {
*success = false;
- return Status::ok();
}
- mConfigManager->UpdateConfig(configKey, cfg);
- *success = true;
return Status::ok();
} else {
*success = false;
@@ -882,6 +879,18 @@ Status StatsService::addConfiguration(int64_t key,
}
}
+bool StatsService::addConfigurationChecked(int uid, int64_t key, const vector<uint8_t>& config) {
+ ConfigKey configKey(uid, key);
+ StatsdConfig cfg;
+ if (config.size() > 0) { // If the config is empty, skip parsing.
+ if (!cfg.ParseFromArray(&config[0], config.size())) {
+ return false;
+ }
+ }
+ mConfigManager->UpdateConfig(configKey, cfg);
+ return true;
+}
+
Status StatsService::removeDataFetchOperation(int64_t key, bool* success) {
IPCThreadState* ipc = IPCThreadState::self();
if (checkCallingPermission(String16(kPermissionDump))) {
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index 02b61244b3bb..0ec31ef81c94 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -17,6 +17,7 @@
#ifndef STATS_SERVICE_H
#define STATS_SERVICE_H
+#include <gtest/gtest_prod.h>
#include "StatsLogProcessor.h"
#include "anomaly/AlarmMonitor.h"
#include "config/ConfigManager.h"
@@ -216,6 +217,11 @@ private:
status_t cmd_clear_puller_cache(FILE* out);
/**
+ * Adds a configuration after checking permissions and obtaining UID from binder call.
+ */
+ bool addConfigurationChecked(int uid, int64_t key, const vector<uint8_t>& config);
+
+ /**
* Update a configuration.
*/
void set_config(int uid, const string& name, const StatsdConfig& config);
@@ -254,6 +260,10 @@ private:
* Whether this is an eng build.
*/
bool mEngBuild;
+
+ FRIEND_TEST(StatsServiceTest, TestAddConfig_simple);
+ FRIEND_TEST(StatsServiceTest, TestAddConfig_empty);
+ FRIEND_TEST(StatsServiceTest, TestAddConfig_invalid);
};
} // namespace statsd
diff --git a/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp b/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp
index d85157c8159a..79067eb982bf 100644
--- a/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp
+++ b/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp
@@ -68,10 +68,10 @@ void DurationAnomalyTracker::stopAlarm(const MetricDimensionKey& dimensionKey,
if (itr->second != nullptr && timestampNs >= NS_PER_SEC * itr->second->timestampSec) {
declareAnomaly(timestampNs, dimensionKey);
}
- mAlarms.erase(dimensionKey);
if (mAlarmMonitor != nullptr) {
mAlarmMonitor->remove(itr->second);
}
+ mAlarms.erase(dimensionKey);
}
void DurationAnomalyTracker::cancelAllAlarms() {
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 40eff4c2bd03..99611f4121d7 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -23,6 +23,7 @@ option java_outer_classname = "AtomsProto";
import "frameworks/base/cmds/statsd/src/atom_field_options.proto";
import "frameworks/base/core/proto/android/app/enums.proto";
+import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/bluetooth/enums.proto";
import "frameworks/base/core/proto/android/os/enums.proto";
import "frameworks/base/core/proto/android/server/enums.proto";
@@ -362,7 +363,10 @@ message ScheduledJobStateChanged {
}
optional State state = 3;
- // TODO: Consider adding the stopReason (int)
+ // The reason a job has stopped.
+ // This is only applicable when the state is FINISHED.
+ // The default value is CANCELED.
+ optional android.app.job.StopReasonEnum stop_reason = 4;
}
/**
diff --git a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp b/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
index 72a00cb6834e..fb0be733bc74 100644
--- a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
+++ b/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
@@ -166,6 +166,11 @@ void StatsPullerManagerImpl::RegisterReceiver(int tagId, wp<PullDataReceiver> re
// Round it to the nearest minutes. This is the limit of alarm manager.
// In practice, we should limit it higher.
long roundedIntervalMs = intervalMs/1000/60 * 1000 * 60;
+ // Scheduled pulling should be at least 1 min apart.
+ // This can be lower in cts tests, in which case we round it to 1 min.
+ if (roundedIntervalMs < 60 * 1000) {
+ roundedIntervalMs = 60 * 1000;
+ }
// There is only one alarm for all pulled events. So only set it to the smallest denom.
if (roundedIntervalMs < mCurrentPullingInterval) {
VLOG("Updating pulling interval %ld", intervalMs);
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index c42514a04925..a4f64ddfd3a5 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -96,9 +96,13 @@ public:
const static int kMaxLogSourceCount = 50;
- // Max memory allowed for storing metrics per configuration. When this limit is approached,
- // statsd will send a broadcast so that the client can fetch the data and clear this memory.
- static const size_t kMaxMetricsBytesPerConfig = 128 * 1024;
+ // Max memory allowed for storing metrics per configuration. If this limit is exceeded, statsd
+ // drops the metrics data in memory.
+ static const size_t kMaxMetricsBytesPerConfig = 256 * 1024;
+
+ // Soft memory limit per configuration. Once this limit is exceeded, we begin notifying the
+ // data subscriber that it's time to call getData.
+ static const size_t kBytesPerConfigTriggerGetData = 128 * 1024;
// Cap the UID map's memory usage to this. This should be fairly high since the UID information
// is critical for understanding the metrics.
diff --git a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
index 335ec4c7cbd5..c9547cf4bf41 100644
--- a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
+++ b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
@@ -205,11 +205,12 @@ bool MaxDurationTracker::flushCurrentBucket(
bool hasPendingEvent =
false; // has either a kStarted or kPaused event across bucket boundaries
// meaning we need to carry them over to the new bucket.
- for (auto it = mInfos.begin(); it != mInfos.end(); ++it) {
+ for (auto it = mInfos.begin(); it != mInfos.end();) {
if (it->second.state == DurationState::kStopped) {
// No need to keep buckets for events that were stopped before.
- mInfos.erase(it);
+ it = mInfos.erase(it);
} else {
+ ++it;
hasPendingEvent = true;
}
}
diff --git a/cmds/statsd/src/packages/UidMap.cpp b/cmds/statsd/src/packages/UidMap.cpp
index e97d8b2af1ae..1cb20bc732d8 100644
--- a/cmds/statsd/src/packages/UidMap.cpp
+++ b/cmds/statsd/src/packages/UidMap.cpp
@@ -331,25 +331,25 @@ size_t UidMap::getBytesUsed() const {
return mBytesUsed;
}
-void UidMap::getOutput(const ConfigKey& key, vector<uint8_t>* outData) {
- getOutput(getElapsedRealtimeNs(), key, outData);
+void UidMap::appendUidMap(const ConfigKey& key, ProtoOutputStream* proto) {
+ appendUidMap(getElapsedRealtimeNs(), key, proto);
}
-void UidMap::getOutput(const int64_t& timestamp, const ConfigKey& key, vector<uint8_t>* outData) {
+void UidMap::appendUidMap(const int64_t& timestamp, const ConfigKey& key,
+ ProtoOutputStream* proto) {
lock_guard<mutex> lock(mMutex); // Lock for updates
- ProtoOutputStream proto;
for (const ChangeRecord& record : mChanges) {
if (record.timestampNs > mLastUpdatePerConfigKey[key]) {
uint64_t changesToken =
- proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_CHANGES);
- proto.write(FIELD_TYPE_BOOL | FIELD_ID_CHANGE_DELETION, (bool)record.deletion);
- proto.write(FIELD_TYPE_INT64 | FIELD_ID_CHANGE_TIMESTAMP,
- (long long)record.timestampNs);
- proto.write(FIELD_TYPE_STRING | FIELD_ID_CHANGE_PACKAGE, record.package);
- proto.write(FIELD_TYPE_INT32 | FIELD_ID_CHANGE_UID, (int)record.uid);
- proto.write(FIELD_TYPE_INT32 | FIELD_ID_CHANGE_VERSION, (int)record.version);
- proto.end(changesToken);
+ proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_CHANGES);
+ proto->write(FIELD_TYPE_BOOL | FIELD_ID_CHANGE_DELETION, (bool)record.deletion);
+ proto->write(FIELD_TYPE_INT64 | FIELD_ID_CHANGE_TIMESTAMP,
+ (long long)record.timestampNs);
+ proto->write(FIELD_TYPE_STRING | FIELD_ID_CHANGE_PACKAGE, record.package);
+ proto->write(FIELD_TYPE_INT32 | FIELD_ID_CHANGE_UID, (int)record.uid);
+ proto->write(FIELD_TYPE_INT32 | FIELD_ID_CHANGE_VERSION, (int)record.version);
+ proto->end(changesToken);
}
}
@@ -360,13 +360,14 @@ void UidMap::getOutput(const int64_t& timestamp, const ConfigKey& key, vector<ui
if ((count == mSnapshots.size() - 1 && !atLeastOneSnapshot) ||
record.timestampNs > mLastUpdatePerConfigKey[key]) {
uint64_t snapshotsToken =
- proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_SNAPSHOTS);
+ proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_SNAPSHOTS);
atLeastOneSnapshot = true;
count++;
- proto.write(FIELD_TYPE_INT64 | FIELD_ID_SNAPSHOT_TIMESTAMP,
- (long long)record.timestampNs);
- proto.write(FIELD_TYPE_MESSAGE | FIELD_ID_SNAPSHOT_PACKAGE_INFO, record.bytes.data());
- proto.end(snapshotsToken);
+ proto->write(FIELD_TYPE_INT64 | FIELD_ID_SNAPSHOT_TIMESTAMP,
+ (long long)record.timestampNs);
+ proto->write(FIELD_TYPE_MESSAGE | FIELD_ID_SNAPSHOT_PACKAGE_INFO, record.bytes.data(),
+ record.bytes.size());
+ proto->end(snapshotsToken);
}
}
@@ -398,47 +399,36 @@ void UidMap::getOutput(const int64_t& timestamp, const ConfigKey& key, vector<ui
// Produce another snapshot. This results in extra data being uploaded but
// helps ensure we can re-construct the UID->app name, versionCode mapping
// in server.
- ProtoOutputStream proto;
- uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
- FIELD_ID_SNAPSHOT_PACKAGE_INFO);
+ ProtoOutputStream snapshotProto;
+ uint64_t token = snapshotProto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+ FIELD_ID_SNAPSHOT_PACKAGE_INFO);
for (const auto& it : mMap) {
- proto.write(FIELD_TYPE_STRING | FIELD_ID_SNAPSHOT_PACKAGE_NAME,
- it.second.packageName);
- proto.write(FIELD_TYPE_INT32 | FIELD_ID_SNAPSHOT_PACKAGE_VERSION,
- (int)it.second.versionCode);
- proto.write(FIELD_TYPE_INT32 | FIELD_ID_SNAPSHOT_PACKAGE_UID, (int)it.first);
+ snapshotProto.write(FIELD_TYPE_STRING | FIELD_ID_SNAPSHOT_PACKAGE_NAME,
+ it.second.packageName);
+ snapshotProto.write(FIELD_TYPE_INT32 | FIELD_ID_SNAPSHOT_PACKAGE_VERSION,
+ (int)it.second.versionCode);
+ snapshotProto.write(FIELD_TYPE_INT32 | FIELD_ID_SNAPSHOT_PACKAGE_UID,
+ (int)it.first);
}
- proto.end(token);
+ snapshotProto.end(token);
// Copy ProtoOutputStream output to
- auto iter = proto.data();
- vector<char> outData(proto.size());
+ auto iter = snapshotProto.data();
+ vector<char> snapshotData(snapshotProto.size());
size_t pos = 0;
while (iter.readBuffer() != NULL) {
size_t toRead = iter.currentToRead();
- std::memcpy(&(outData[pos]), iter.readBuffer(), toRead);
+ std::memcpy(&(snapshotData[pos]), iter.readBuffer(), toRead);
pos += toRead;
iter.rp()->move(toRead);
}
- mSnapshots.emplace_back(timestamp, outData);
- mBytesUsed += kBytesTimestampField + outData.size();
+ mSnapshots.emplace_back(timestamp, snapshotData);
+ mBytesUsed += kBytesTimestampField + snapshotData.size();
}
}
StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
StatsdStats::getInstance().setUidMapChanges(mChanges.size());
StatsdStats::getInstance().setUidMapSnapshots(mSnapshots.size());
- if (outData != nullptr) {
- outData->clear();
- outData->resize(proto.size());
- size_t pos = 0;
- auto iter = proto.data();
- while (iter.readBuffer() != NULL) {
- size_t toRead = iter.currentToRead();
- std::memcpy(&((*outData)[pos]), iter.readBuffer(), toRead);
- pos += toRead;
- iter.rp()->move(toRead);
- }
- }
}
void UidMap::printUidMap(FILE* out) const {
diff --git a/cmds/statsd/src/packages/UidMap.h b/cmds/statsd/src/packages/UidMap.h
index b0181f7280b5..9dc73f4859c6 100644
--- a/cmds/statsd/src/packages/UidMap.h
+++ b/cmds/statsd/src/packages/UidMap.h
@@ -19,6 +19,7 @@
#include "config/ConfigKey.h"
#include "config/ConfigListener.h"
#include "packages/PackageInfoListener.h"
+#include "stats_util.h"
#include <binder/IResultReceiver.h>
#include <binder/IShellCallback.h>
@@ -32,8 +33,11 @@
#include <string>
#include <unordered_map>
+using namespace android;
using namespace std;
+using android::util::ProtoOutputStream;
+
namespace android {
namespace os {
namespace statsd {
@@ -45,8 +49,8 @@ struct AppData {
AppData(const string& a, const int64_t v) : packageName(a), versionCode(v){};
};
-// When calling getOutput, we retrieve all the ChangeRecords since the last
-// timestamp we called getOutput for this configuration key.
+// When calling appendUidMap, we retrieve all the ChangeRecords since the last
+// timestamp we called appendUidMap for this configuration key.
struct ChangeRecord {
const bool deletion;
const int64_t timestampNs;
@@ -70,8 +74,8 @@ const unsigned int kBytesChangeRecord = sizeof(struct ChangeRecord);
// less because of varint encoding).
const unsigned int kBytesTimestampField = 10;
-// When calling getOutput, we retrieve all the snapshots since the last
-// timestamp we called getOutput for this configuration key.
+// When calling appendUidMap, we retrieve all the snapshots since the last
+// timestamp we called appendUidMap for this configuration key.
struct SnapshotRecord {
const int64_t timestampNs;
@@ -135,7 +139,7 @@ public:
// Gets all snapshots and changes that have occurred since the last output.
// If every config key has received a change or snapshot record, then this
// record is deleted.
- void getOutput(const ConfigKey& key, vector<uint8_t>* outData);
+ void appendUidMap(const ConfigKey& key, util::ProtoOutputStream* proto);
// Forces the output to be cleared. We still generate a snapshot based on the current state.
// This results in extra data uploaded but helps us reconstruct the uid mapping on the server
@@ -158,7 +162,8 @@ private:
const int64_t& versionCode);
void removeApp(const int64_t& timestamp, const String16& packageName, const int32_t& uid);
- void getOutput(const int64_t& timestamp, const ConfigKey& key, vector<uint8_t>* outData);
+ void appendUidMap(const int64_t& timestamp, const ConfigKey& key,
+ util::ProtoOutputStream* proto);
void getListenerListCopyLocked(std::vector<wp<PackageInfoListener>>* output);
diff --git a/cmds/statsd/src/storage/StorageManager.cpp b/cmds/statsd/src/storage/StorageManager.cpp
index cd41f533fecf..643d2bf04456 100644
--- a/cmds/statsd/src/storage/StorageManager.cpp
+++ b/cmds/statsd/src/storage/StorageManager.cpp
@@ -160,38 +160,45 @@ void StorageManager::sendBroadcast(const char* path,
}
}
-void StorageManager::appendConfigMetricsReport(ProtoOutputStream& proto) {
+void StorageManager::appendConfigMetricsReport(const ConfigKey& key, ProtoOutputStream* proto) {
unique_ptr<DIR, decltype(&closedir)> dir(opendir(STATS_DATA_DIR), closedir);
if (dir == NULL) {
VLOG("Path %s does not exist", STATS_DATA_DIR);
return;
}
+ string suffix = StringPrintf("%d_%lld", key.GetUid(), (long long)key.GetId());
+
dirent* de;
while ((de = readdir(dir.get()))) {
char* name = de->d_name;
if (name[0] == '.') continue;
- VLOG("file %s", name);
- int64_t result[3];
- parseFileName(name, result);
- if (result[0] == -1) continue;
- int64_t timestamp = result[0];
- int64_t uid = result[1];
- int64_t configID = result[2];
- string file_name = getFilePath(STATS_DATA_DIR, timestamp, uid, configID);
- int fd = open(file_name.c_str(), O_RDONLY | O_CLOEXEC);
- if (fd != -1) {
- string content;
- if (android::base::ReadFdToString(fd, &content)) {
- proto.write(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_REPORTS,
- content.c_str());
+ size_t nameLen = strlen(name);
+ size_t suffixLen = suffix.length();
+ if (suffixLen <= nameLen &&
+ strncmp(name + nameLen - suffixLen, suffix.c_str(), suffixLen) == 0) {
+ int64_t result[3];
+ parseFileName(name, result);
+ if (result[0] == -1) continue;
+ int64_t timestamp = result[0];
+ int64_t uid = result[1];
+ int64_t configID = result[2];
+
+ string file_name = getFilePath(STATS_DATA_DIR, timestamp, uid, configID);
+ int fd = open(file_name.c_str(), O_RDONLY | O_CLOEXEC);
+ if (fd != -1) {
+ string content;
+ if (android::base::ReadFdToString(fd, &content)) {
+ proto->write(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_REPORTS,
+ content.c_str(), content.size());
+ }
+ close(fd);
}
- close(fd);
- }
- // Remove file from disk after reading.
- remove(file_name.c_str());
+ // Remove file from disk after reading.
+ remove(file_name.c_str());
+ }
}
}
@@ -254,8 +261,7 @@ bool StorageManager::hasIdenticalConfig(const ConfigKey& key,
return false;
}
- const char* suffix =
- StringPrintf("%d_%lld", key.GetUid(), (long long)key.GetId()).c_str();
+ string suffix = StringPrintf("%d_%lld", key.GetUid(), (long long)key.GetId());
dirent* de;
while ((de = readdir(dir.get()))) {
@@ -264,10 +270,10 @@ bool StorageManager::hasIdenticalConfig(const ConfigKey& key,
continue;
}
size_t nameLen = strlen(name);
- size_t suffixLen = strlen(suffix);
+ size_t suffixLen = suffix.length();
// There can be at most one file that matches this suffix (config key).
if (suffixLen <= nameLen &&
- strncmp(name + nameLen - suffixLen, suffix, suffixLen) == 0) {
+ strncmp(name + nameLen - suffixLen, suffix.c_str(), suffixLen) == 0) {
int fd = open(StringPrintf("%s/%s", STATS_SERVICE_DIR, name).c_str(),
O_RDONLY | O_CLOEXEC);
if (fd != -1) {
@@ -275,9 +281,11 @@ bool StorageManager::hasIdenticalConfig(const ConfigKey& key,
if (android::base::ReadFdToString(fd, &content)) {
vector<uint8_t> vec(content.begin(), content.end());
if (vec == config) {
+ close(fd);
return true;
}
}
+ close(fd);
}
}
}
diff --git a/cmds/statsd/src/storage/StorageManager.h b/cmds/statsd/src/storage/StorageManager.h
index 4b7562855f30..fb7b0853ec4c 100644
--- a/cmds/statsd/src/storage/StorageManager.h
+++ b/cmds/statsd/src/storage/StorageManager.h
@@ -66,7 +66,7 @@ public:
* Appends ConfigMetricsReport found on disk to the specific proto and
* delete it.
*/
- static void appendConfigMetricsReport(ProtoOutputStream& proto);
+ static void appendConfigMetricsReport(const ConfigKey& key, ProtoOutputStream* proto);
/**
* Call to load the saved configs from disk.
diff --git a/cmds/statsd/tests/StatsService_test.cpp b/cmds/statsd/tests/StatsService_test.cpp
new file mode 100644
index 000000000000..a7b413666266
--- /dev/null
+++ b/cmds/statsd/tests/StatsService_test.cpp
@@ -0,0 +1,67 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "StatsService.h"
+#include "config/ConfigKey.h"
+#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <stdio.h>
+
+using namespace android;
+using namespace testing;
+
+namespace android {
+namespace os {
+namespace statsd {
+
+using android::util::ProtoOutputStream;
+
+#ifdef __ANDROID__
+
+TEST(StatsServiceTest, TestAddConfig_simple) {
+ StatsService service(nullptr);
+ StatsdConfig config;
+ config.set_id(12345);
+ string serialized = config.SerializeAsString();
+
+ EXPECT_TRUE(
+ service.addConfigurationChecked(123, 12345, {serialized.begin(), serialized.end()}));
+}
+
+TEST(StatsServiceTest, TestAddConfig_empty) {
+ StatsService service(nullptr);
+ string serialized = "";
+
+ EXPECT_TRUE(
+ service.addConfigurationChecked(123, 12345, {serialized.begin(), serialized.end()}));
+}
+
+TEST(StatsServiceTest, TestAddConfig_invalid) {
+ StatsService service(nullptr);
+ string serialized = "Invalid config!";
+
+ EXPECT_FALSE(
+ service.addConfigurationChecked(123, 12345, {serialized.begin(), serialized.end()}));
+}
+
+#else
+GTEST_LOG_(INFO) << "This test does nothing.\n";
+#endif
+
+} // namespace statsd
+} // namespace os
+} // namespace android
diff --git a/cmds/statsd/tests/UidMap_test.cpp b/cmds/statsd/tests/UidMap_test.cpp
index ee7d770ec53d..c9492eb609f9 100644
--- a/cmds/statsd/tests/UidMap_test.cpp
+++ b/cmds/statsd/tests/UidMap_test.cpp
@@ -20,6 +20,7 @@
#include "statslog.h"
#include "statsd_test_util.h"
+#include <android/util/ProtoOutputStream.h>
#include <gtest/gtest.h>
#include <stdio.h>
@@ -30,6 +31,8 @@ namespace android {
namespace os {
namespace statsd {
+using android::util::ProtoOutputStream;
+
#ifdef __ANDROID__
const string kApp1 = "app1.sharing.1";
const string kApp2 = "app2.sharing.1";
@@ -156,6 +159,20 @@ TEST(UidMapTest, TestUpdateApp) {
EXPECT_TRUE(name_set.find("new_app1_name") != name_set.end());
}
+static void protoOutputStreamToUidMapping(ProtoOutputStream* proto, UidMapping* results) {
+ vector<uint8_t> bytes;
+ bytes.resize(proto->size());
+ size_t pos = 0;
+ auto iter = proto->data();
+ while (iter.readBuffer() != NULL) {
+ size_t toRead = iter.currentToRead();
+ std::memcpy(&((bytes)[pos]), iter.readBuffer(), toRead);
+ pos += toRead;
+ iter.rp()->move(toRead);
+ }
+ results->ParseFromArray(bytes.data(), bytes.size());
+}
+
TEST(UidMapTest, TestClearingOutput) {
UidMap m;
@@ -176,26 +193,26 @@ TEST(UidMapTest, TestClearingOutput) {
m.updateMap(1, uids, versions, apps);
EXPECT_EQ(1U, m.mSnapshots.size());
- vector<uint8_t> bytes;
- m.getOutput(2, config1, &bytes);
+ ProtoOutputStream proto;
+ m.appendUidMap(2, config1, &proto);
UidMapping results;
- results.ParseFromArray(bytes.data(), bytes.size());
+ protoOutputStreamToUidMapping(&proto, &results);
EXPECT_EQ(1, results.snapshots_size());
// It should be cleared now
EXPECT_EQ(1U, m.mSnapshots.size());
- bytes.clear();
- m.getOutput(2, config1, &bytes);
- results.ParseFromArray(bytes.data(), bytes.size());
+ proto.clear();
+ m.appendUidMap(2, config1, &proto);
+ protoOutputStreamToUidMapping(&proto, &results);
EXPECT_EQ(1, results.snapshots_size());
// Now add another configuration.
m.OnConfigUpdated(config2);
m.updateApp(5, String16(kApp1.c_str()), 1000, 40);
EXPECT_EQ(1U, m.mChanges.size());
- bytes.clear();
- m.getOutput(6, config1, &bytes);
- results.ParseFromArray(bytes.data(), bytes.size());
+ proto.clear();
+ m.appendUidMap(6, config1, &proto);
+ protoOutputStreamToUidMapping(&proto, &results);
EXPECT_EQ(1, results.snapshots_size());
EXPECT_EQ(1, results.changes_size());
EXPECT_EQ(1U, m.mChanges.size());
@@ -205,16 +222,16 @@ TEST(UidMapTest, TestClearingOutput) {
EXPECT_EQ(2U, m.mChanges.size());
// We still can't remove anything.
- bytes.clear();
- m.getOutput(8, config1, &bytes);
- results.ParseFromArray(bytes.data(), bytes.size());
+ proto.clear();
+ m.appendUidMap(8, config1, &proto);
+ protoOutputStreamToUidMapping(&proto, &results);
EXPECT_EQ(1, results.snapshots_size());
EXPECT_EQ(1, results.changes_size());
EXPECT_EQ(2U, m.mChanges.size());
- bytes.clear();
- m.getOutput(9, config2, &bytes);
- results.ParseFromArray(bytes.data(), bytes.size());
+ proto.clear();
+ m.appendUidMap(9, config2, &proto);
+ protoOutputStreamToUidMapping(&proto, &results);
EXPECT_EQ(1, results.snapshots_size());
EXPECT_EQ(2, results.changes_size());
// At this point both should be cleared.
@@ -242,11 +259,12 @@ TEST(UidMapTest, TestMemoryComputed) {
m.updateApp(3, String16(kApp1.c_str()), 1000, 40);
EXPECT_TRUE(m.mBytesUsed > snapshot_bytes);
+ ProtoOutputStream proto;
vector<uint8_t> bytes;
- m.getOutput(2, config1, &bytes);
+ m.appendUidMap(2, config1, &proto);
size_t prevBytes = m.mBytesUsed;
- m.getOutput(4, config1, &bytes);
+ m.appendUidMap(4, config1, &proto);
EXPECT_TRUE(m.mBytesUsed < prevBytes);
}
@@ -286,4 +304,4 @@ GTEST_LOG_(INFO) << "This test does nothing.\n";
} // namespace statsd
} // namespace os
-} // namespace android \ No newline at end of file
+} // namespace android
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 40b266fe29d7..87fb99807ebc 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -3375,8 +3375,6 @@ HPLandroid/location/ICountryListener$Stub;-><init>()V
HPLandroid/location/ICountryListener$Stub;->asBinder()Landroid/os/IBinder;
HPLandroid/location/ICountryListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ICountryListener;
HPLandroid/location/ICountryListener;->onCountryDetected(Landroid/location/Country;)V
-HPLandroid/location/IFusedProvider$Stub;-><init>()V
-HPLandroid/location/IFusedProvider;->onFusedLocationHardwareChange(Landroid/hardware/location/IFusedLocationHardware;)V
HPLandroid/location/IGeocodeProvider$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
HPLandroid/location/IGeocodeProvider$Stub$Proxy;->getFromLocation(DDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
HPLandroid/location/IGeocodeProvider$Stub;-><init>()V
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index e2121dd48679..9cba92649446 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -20,8 +20,20 @@ Landroid/app/ActivityManagerNative;->getDefault()Landroid/app/IActivityManager;
Landroid/app/ActivityManager;->PROCESS_STATE_IMPORTANT_BACKGROUND:I
Landroid/app/ActivityManager;->PROCESS_STATE_TOP:I
Landroid/app/ActivityManager$RecentTaskInfo;->firstActiveTime:J
+Landroid/app/ActivityManager$RecentTaskInfo;->lastActiveTime:J
+Landroid/app/ActivityManager$RecentTaskInfo;->resizeMode:I
+Landroid/app/ActivityManager$RecentTaskInfo;->supportsSplitScreenMultiWindow:Z
+Landroid/app/ActivityManager$RecentTaskInfo;->userId:I
Landroid/app/ActivityManager$RunningAppProcessInfo;->flags:I
Landroid/app/ActivityManager$RunningAppProcessInfo;->processState:I
+Landroid/app/ActivityManager;->setPersistentVrThread(I)V
+Landroid/app/ActivityManager$TaskDescription;->getBackgroundColor()I
+Landroid/app/ActivityManager$TaskDescription;->getInMemoryIcon()Landroid/graphics/Bitmap;
+Landroid/app/ActivityManager$TaskSnapshot;->getContentInsets()Landroid/graphics/Rect;
+Landroid/app/ActivityManager$TaskSnapshot;->getOrientation()I
+Landroid/app/ActivityManager$TaskSnapshot;->getScale()F
+Landroid/app/ActivityManager$TaskSnapshot;->isRealSnapshot()Z
+Landroid/app/ActivityManager$TaskSnapshot;->isReducedResolution()Z
Landroid/app/Activity;->mApplication:Landroid/app/Application;
Landroid/app/Activity;->mComponent:Landroid/content/ComponentName;
Landroid/app/Activity;->mFragments:Landroid/app/FragmentController;
@@ -35,6 +47,7 @@ Landroid/app/Activity;->mResumed:Z
Landroid/app/Activity;->mToken:Landroid/os/IBinder;
Landroid/app/Activity;->mWindow:Landroid/view/Window;
Landroid/app/Activity;->mWindowManager:Landroid/view/WindowManager;
+Landroid/app/ActivityOptions;->makeMultiThumbFutureAspectScaleAnimation(Landroid/content/Context;Landroid/os/Handler;Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/app/ActivityOptions$OnAnimationStartedListener;Z)Landroid/app/ActivityOptions;
Landroid/app/Activity;->setDisablePreviewScreenshots(Z)V
Landroid/app/Activity;->setPersistent(Z)V
Landroid/app/ActivityThread$ActivityClientRecord;->activityInfo:Landroid/content/pm/ActivityInfo;
@@ -317,6 +330,13 @@ Landroid/app/trust/ITrustManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/usage/UsageStatsManager;->mService:Landroid/app/usage/IUsageStatsManager;
Landroid/app/usage/UsageStats;->mLastEvent:I
Landroid/app/usage/UsageStats;->mTotalTimeInForeground:J
+Landroid/app/Vr2dDisplayProperties$Builder;->build()Landroid/app/Vr2dDisplayProperties;
+Landroid/app/Vr2dDisplayProperties$Builder;-><init>()V
+Landroid/app/Vr2dDisplayProperties$Builder;->setEnabled(Z)Landroid/app/Vr2dDisplayProperties$Builder;
+Landroid/app/Vr2dDisplayProperties;-><init>(III)V
+Landroid/app/VrManager;->getPersistentVrModeEnabled()Z
+Landroid/app/VrManager;->registerVrStateCallback(Landroid/app/VrStateCallback;Landroid/os/Handler;)V
+Landroid/app/VrManager;->setVr2dDisplayProperties(Landroid/app/Vr2dDisplayProperties;)V
Landroid/app/WallpaperColors;->getColorHints()I
Landroid/app/WallpaperManager;->getBitmap()Landroid/graphics/Bitmap;
Landroid/app/WallpaperManager;->getBitmap(Z)Landroid/graphics/Bitmap;
@@ -497,6 +517,7 @@ Landroid/content/res/AssetManager;->openNonAsset(Ljava/lang/String;)Ljava/io/Inp
Landroid/content/res/AssetManager;->resolveAttrs(JII[I[I[I[I)Z
Landroid/content/res/AssetManager;->setConfiguration(IILjava/lang/String;IIIIIIIIIIIIIII)V
Landroid/content/res/ColorStateList$ColorStateListFactory;-><init>(Landroid/content/res/ColorStateList;)V
+Landroid/content/res/ColorStateList;->getColors()[I
Landroid/content/res/ColorStateList;->mColors:[I
Landroid/content/res/ColorStateList;->mDefaultColor:I
Landroid/content/res/ColorStateList;->mFactory:Landroid/content/res/ColorStateList$ColorStateListFactory;
@@ -563,6 +584,7 @@ Landroid/database/sqlite/SQLiteDebug$PagerStats;->memoryUsed:I
Landroid/database/sqlite/SQLiteDebug$PagerStats;->pageCacheOverflow:I
Landroid/database/sqlite/SQLiteOpenHelper;->mName:Ljava/lang/String;
Landroid/ddm/DdmHandleAppName;->getAppName()Ljava/lang/String;
+Landroid/graphics/AvoidXfermode$Mode;->TARGET:Landroid/graphics/AvoidXfermode$Mode;
Landroid/graphics/BaseCanvas;->mNativeCanvasWrapper:J
Landroid/graphics/Bitmap$Config;->nativeInt:I
Landroid/graphics/Bitmap$Config;->nativeToConfig(I)Landroid/graphics/Bitmap$Config;
@@ -643,10 +665,10 @@ Landroid/graphics/FontFamily;-><init>()V
Landroid/graphics/fonts/FontVariationAxis;->mStyleValue:F
Landroid/graphics/fonts/FontVariationAxis;->mTag:I
Landroid/graphics/GraphicBuffer;->createFromExisting(IIIIJ)Landroid/graphics/GraphicBuffer;
+Landroid/graphics/GraphicBuffer;->CREATOR:Landroid/os/Parcelable$Creator;
Landroid/graphics/GraphicBuffer;-><init>(IIIIJ)V
Landroid/graphics/GraphicBuffer;->mNativeObject:J
Landroid/graphics/ImageDecoder;-><init>(JIIZ)V
-Landroid/graphics/ImageDecoder;->onPartialImage(I)Z
Landroid/graphics/ImageDecoder;->postProcessAndRelease(Landroid/graphics/Canvas;)I
Landroid/graphics/LinearGradient;->mColors:[I
Landroid/graphics/Matrix;->native_instance:J
@@ -671,8 +693,13 @@ Landroid/graphics/Typeface;->sDefaults:[Landroid/graphics/Typeface;
Landroid/graphics/Typeface;->setDefault(Landroid/graphics/Typeface;)V
Landroid/graphics/Typeface;->sSystemFontMap:Ljava/util/Map;
Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V
+Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V
Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V
+Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_OIS_TIMESTAMPS:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_OIS_X_SHIFTS:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_OIS_Y_SHIFTS:Landroid/hardware/camera2/CaptureResult$Key;
Landroid/hardware/camera2/impl/CameraMetadataNative;->mMetadataPtr:J
Landroid/hardware/Camera;->addCallbackBuffer([BI)V
Landroid/hardware/Camera;->mNativeContext:J
@@ -795,7 +822,6 @@ Landroid/location/Country;->getCountryIso()Ljava/lang/String;
Landroid/location/Country;->getSource()I
Landroid/location/GeocoderParams;->getClientPackage()Ljava/lang/String;
Landroid/location/GeocoderParams;->getLocale()Ljava/util/Locale;
-Landroid/location/IFusedProvider$Stub;-><init>()V
Landroid/location/IGeocodeProvider$Stub;-><init>()V
Landroid/location/IGeofenceProvider$Stub;-><init>()V
Landroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationManager;
@@ -829,6 +855,7 @@ Landroid/media/AudioHandle;->mId:I
Landroid/media/AudioManager;->forceVolumeControlStream(I)V
Landroid/media/AudioManager;->getOutputLatency(I)I
Landroid/media/AudioManager;->getService()Landroid/media/IAudioService;
+Landroid/media/AudioManager;-><init>(Landroid/content/Context;)V
Landroid/media/AudioManager;->mAudioFocusIdListenerMap:Ljava/util/concurrent/ConcurrentHashMap;
Landroid/media/AudioManager;->setMasterMute(ZI)V
Landroid/media/AudioManager;->startBluetoothScoVirtualCall()V
@@ -891,6 +918,7 @@ Landroid/media/IAudioService;->getStreamVolume(I)I
Landroid/media/IAudioService;->setStreamVolume(IIILjava/lang/String;)V
Landroid/media/IAudioService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IAudioService;
Landroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/media/IVolumeController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IVolumeController;
Landroid/media/JetPlayer;->mNativePlayerInJavaObj:J
Landroid/media/JetPlayer;->postEventFromNative(Ljava/lang/Object;III)V
Landroid/media/MediaCodec$CodecException;-><init>(IILjava/lang/String;)V
@@ -948,6 +976,7 @@ Landroid/media/soundtrigger/SoundTriggerDetector$EventPayload;->getCaptureSessio
Landroid/media/soundtrigger/SoundTriggerDetector$EventPayload;->getData()[B
Landroid/media/soundtrigger/SoundTriggerManager;->loadSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;)I
Landroid/media/soundtrigger/SoundTriggerManager;->startRecognition(Ljava/util/UUID;Landroid/app/PendingIntent;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+Landroid/media/soundtrigger/SoundTriggerManager;->startRecognition(Ljava/util/UUID;Landroid/os/Bundle;Landroid/content/ComponentName;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
Landroid/media/soundtrigger/SoundTriggerManager;->stopRecognition(Ljava/util/UUID;)I
Landroid/media/soundtrigger/SoundTriggerManager;->unloadSoundModel(Ljava/util/UUID;)I
Landroid/media/SubtitleController;->mHandler:Landroid/os/Handler;
@@ -1128,6 +1157,8 @@ Landroid/os/BatteryStats$Uid$Sensor;->getSensorTime()Landroid/os/BatteryStats$Ti
Landroid/os/Binder;->execTransact(IJJI)Z
Landroid/os/Binder;->mObject:J
Landroid/os/Build;->getString(Ljava/lang/String;)Ljava/lang/String;
+Landroid/os/Build;->IS_DEBUGGABLE:Z
+Landroid/os/Build;->IS_EMULATOR:Z
Landroid/os/Build$VERSION;->ACTIVE_CODENAMES:[Ljava/lang/String;
Landroid/os/Bundle;->getIBinder(Ljava/lang/String;)Landroid/os/IBinder;
Landroid/os/Bundle;->putIBinder(Ljava/lang/String;Landroid/os/IBinder;)V
@@ -1212,8 +1243,10 @@ Landroid/os/Message;->when:J
Landroid/os/ParcelFileDescriptor;-><init>(Ljava/io/FileDescriptor;)V
Landroid/os/Parcel;->mNativePtr:J
Landroid/os/Parcel;->readArrayMap(Landroid/util/ArrayMap;Ljava/lang/ClassLoader;)V
+Landroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;)Ljava/util/List;
Landroid/os/Parcel$ReadWriteHelper;-><init>()V
Landroid/os/Parcel;->writeArrayMap(Landroid/util/ArrayMap;)V
+Landroid/os/Parcel;->writeParcelableList(Ljava/util/List;I)V
Landroid/os/PowerManager;->getDefaultScreenBrightnessSetting()I
Landroid/os/PowerManager;->getMaximumScreenBrightnessSetting()I
Landroid/os/PowerManager;->getMinimumScreenBrightnessSetting()I
@@ -1584,6 +1617,8 @@ Landroid/R$styleable;->View_filterTouchesWhenObscured:I
Landroid/R$styleable;->View_fitsSystemWindows:I
Landroid/R$styleable;->View_focusable:I
Landroid/R$styleable;->View_focusableInTouchMode:I
+Landroid/R$styleable;->ViewGroup_Layout:[I
+Landroid/R$styleable;->ViewGroup_MarginLayout:[I
Landroid/R$styleable;->View_hapticFeedbackEnabled:I
Landroid/R$styleable;->View:[I
Landroid/R$styleable;->View_id:I
@@ -1673,6 +1708,7 @@ Landroid/service/notification/NotificationListenerService;->registerAsSystemServ
Landroid/service/notification/NotificationListenerService;->unregisterAsSystemService()V
Landroid/service/voice/AlwaysOnHotwordDetector$EventPayload;->getCaptureSession()Ljava/lang/Integer;
Landroid/service/voice/VoiceInteractionService;->isKeyphraseAndLocaleSupportedForHotword(Ljava/lang/String;Ljava/util/Locale;)Z
+Landroid/service/vr/IVrManager;->getVr2dDisplayId()I
Landroid/service/wallpaper/WallpaperService$Engine;->setFixedSizeAllowed(Z)V
Landroid/speech/tts/TextToSpeech;->getCurrentEngine()Ljava/lang/String;
Landroid/system/Int32Ref;->value:I
@@ -1814,6 +1850,7 @@ Landroid/text/DynamicLayout;-><init>(Ljava/lang/CharSequence;Ljava/lang/CharSequ
Landroid/text/DynamicLayout;->sStaticLayout:Landroid/text/StaticLayout;
Landroid/text/Html;->withinStyle(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;II)V
Landroid/text/Layout;->DIRS_ALL_LEFT_TO_RIGHT:Landroid/text/Layout$Directions;
+Landroid/text/Layout;->getPrimaryHorizontal(IZ)F
Landroid/text/method/LinkMovementMethod;->sInstance:Landroid/text/method/LinkMovementMethod;
Landroid/text/SpannableStringBuilder;->mGapLength:I
Landroid/text/SpannableStringBuilder;->mGapStart:I
@@ -1962,9 +1999,11 @@ Landroid/view/inputmethod/InputMethodManager;->sInstance:Landroid/view/inputmeth
Landroid/view/inputmethod/InputMethodManager;->windowDismissed(Landroid/os/IBinder;)V
Landroid/view/inputmethod/InputMethodSubtypeArray;-><init>(Ljava/util/List;)V
Landroid/view/InputQueue;->finishInputEvent(JZ)V
+Landroid/view/IRecentsAnimationController;->setAnimationTargetsBehindSystemBars(Z)V
Landroid/view/IWindowManager;->getAnimationScale(I)F
Landroid/view/IWindowManager;->hasNavigationBar()Z
Landroid/view/IWindowManager;->setAnimationScale(IF)V
+Landroid/view/IWindowManager;->setShelfHeight(ZI)V
Landroid/view/IWindowManager;->setStrictModeVisualIndicatorPreference(Ljava/lang/String;)V
Landroid/view/IWindowManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowManager;
Landroid/view/IWindowManager$Stub$Proxy;->getBaseDisplayDensity(I)I
@@ -2012,6 +2051,18 @@ Landroid/view/PointerIcon;->mDurationPerFrame:I
Landroid/view/PointerIcon;->mHotSpotX:F
Landroid/view/PointerIcon;->mHotSpotY:F
Landroid/view/PointerIcon;->mType:I
+Landroid/view/RemoteAnimationDefinition;->addRemoteAnimation(IILandroid/view/RemoteAnimationAdapter;)V
+Landroid/view/RemoteAnimationTarget;->clipRect:Landroid/graphics/Rect;
+Landroid/view/RemoteAnimationTarget;->contentInsets:Landroid/graphics/Rect;
+Landroid/view/RemoteAnimationTarget;->isNotInRecents:Z
+Landroid/view/RemoteAnimationTarget;->isTranslucent:Z
+Landroid/view/RemoteAnimationTarget;->leash:Landroid/view/SurfaceControl;
+Landroid/view/RemoteAnimationTarget;->mode:I
+Landroid/view/RemoteAnimationTarget;->position:Landroid/graphics/Point;
+Landroid/view/RemoteAnimationTarget;->prefixOrderIndex:I
+Landroid/view/RemoteAnimationTarget;->sourceContainerBounds:Landroid/graphics/Rect;
+Landroid/view/RemoteAnimationTarget;->taskId:I
+Landroid/view/RemoteAnimationTarget;->windowConfiguration:Landroid/app/WindowConfiguration;
Landroid/view/RenderNodeAnimator;->callOnFinished(Landroid/view/RenderNodeAnimator;)V
Landroid/view/ScaleGestureDetector;->mListener:Landroid/view/ScaleGestureDetector$OnScaleGestureListener;
Landroid/view/ScaleGestureDetector;->mMinSpan:I
@@ -2035,6 +2086,7 @@ Landroid/view/SurfaceView;->mRequestedFormat:I
Landroid/view/SurfaceView;->mSurfaceHolder:Landroid/view/SurfaceHolder;
Landroid/view/SurfaceView;->surfacePositionLost_uiRtSync(J)V
Landroid/view/SurfaceView;->updateSurfacePosition_renderWorker(JIIII)V
+Landroid/view/textclassifier/Logger;->DISABLED:Landroid/view/textclassifier/Logger;
Landroid/view/textclassifier/logging/SmartSelectionEventTracker;-><init>(Landroid/content/Context;I)V
Landroid/view/textclassifier/logging/SmartSelectionEventTracker;->logEvent(Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;)V
Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(III)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
@@ -2061,6 +2113,7 @@ Landroid/view/View$AttachInfo;->mStableInsets:Landroid/graphics/Rect;
Landroid/view/View;->clearAccessibilityFocus()V
Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
Landroid/view/View;->computeOpaqueFlags()V
+Landroid/view/ViewConfiguration;->getDeviceGlobalActionKeyTimeout()J
Landroid/view/ViewConfiguration;->getDoubleTapMinTime()I
Landroid/view/ViewConfiguration;->mFadingMarqueeEnabled:Z
Landroid/view/ViewConfiguration;->sHasPermanentMenuKeySet:Z
@@ -2072,11 +2125,15 @@ Landroid/view/View;->dispatchAttachedToWindow(Landroid/view/View$AttachInfo;I)V
Landroid/view/View;->dispatchDetachedFromWindow()V
Landroid/view/View;->fitsSystemWindows()Z
Landroid/view/View;->getAccessibilityDelegate()Landroid/view/View$AccessibilityDelegate;
+Landroid/view/View;->getBoundsOnScreen(Landroid/graphics/Rect;)V
Landroid/view/View;->getInverseMatrix()Landroid/graphics/Matrix;
Landroid/view/View;->getListenerInfo()Landroid/view/View$ListenerInfo;
Landroid/view/View;->getLocationOnScreen()[I
+Landroid/view/View;->getRawTextAlignment()I
+Landroid/view/View;->getRawTextDirection()I
Landroid/view/View;->getTransitionAlpha()F
Landroid/view/View;->getViewRootImpl()Landroid/view/ViewRootImpl;
+Landroid/view/View;->getWindowDisplayFrame(Landroid/graphics/Rect;)V
Landroid/view/ViewGroup;->dispatchViewAdded(Landroid/view/View;)V
Landroid/view/ViewGroup;->dispatchViewRemoved(Landroid/view/View;)V
Landroid/view/ViewGroup;->FLAG_SUPPORT_STATIC_TRANSFORMATIONS:I
@@ -2089,6 +2146,11 @@ Landroid/view/ViewGroup;->mChildren:[Landroid/view/View;
Landroid/view/ViewGroup;->mFirstTouchTarget:Landroid/view/ViewGroup$TouchTarget;
Landroid/view/ViewGroup;->mGroupFlags:I
Landroid/view/ViewGroup;->mOnHierarchyChangeListener:Landroid/view/ViewGroup$OnHierarchyChangeListener;
+Landroid/view/ViewGroup;->resetResolvedDrawables()V
+Landroid/view/ViewGroup;->resetResolvedLayoutDirection()V
+Landroid/view/ViewGroup;->resetResolvedPadding()V
+Landroid/view/ViewGroup;->resetResolvedTextAlignment()V
+Landroid/view/ViewGroup;->resetResolvedTextDirection()V
Landroid/view/ViewGroup;->suppressLayout(Z)V
Landroid/view/View;->initializeScrollbars(Landroid/content/res/TypedArray;)V
Landroid/view/View;->internalSetPadding(IIII)V
@@ -2128,10 +2190,17 @@ Landroid/view/View;->recomputePadding()V
Landroid/view/View;->requestAccessibilityFocus()Z
Landroid/view/View;->resetDisplayList()V
Landroid/view/View;->resetPaddingToInitialValues()V
+Landroid/view/View;->resetResolvedDrawables()V
+Landroid/view/View;->resetResolvedLayoutDirection()V
+Landroid/view/View;->resetResolvedPadding()V
+Landroid/view/View;->resetResolvedTextAlignment()V
+Landroid/view/View;->resetResolvedTextDirection()V
+Landroid/view/View;->resetRtlProperties()V
Landroid/view/ViewRootImpl;->detachFunctor(J)V
Landroid/view/ViewRootImpl;->enqueueInputEvent(Landroid/view/InputEvent;)V
Landroid/view/ViewRootImpl;->invokeFunctor(JZ)V
Landroid/view/ViewRootImpl;->mStopped:Z
+Landroid/view/ViewRootImpl;->mSurface:Landroid/view/Surface;
Landroid/view/ViewRootImpl;->mView:Landroid/view/View;
Landroid/view/View$ScrollabilityCache;->scrollBar:Landroid/widget/ScrollBarDrawable;
Landroid/view/View;->setAlphaNoInvalidation(F)Z
@@ -2241,6 +2310,10 @@ Landroid/widget/AutoCompleteTextView;->ensureImeVisible(Z)V
Landroid/widget/AutoCompleteTextView;->mPopup:Landroid/widget/ListPopupWindow;
Landroid/widget/AutoCompleteTextView;->setDropDownAlwaysVisible(Z)V
Landroid/widget/CompoundButton;->mButtonDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/CursorAdapter;->mChangeObserver:Landroid/widget/CursorAdapter$ChangeObserver;
+Landroid/widget/CursorAdapter;->mDataSetObserver:Landroid/database/DataSetObserver;
+Landroid/widget/CursorAdapter;->mDataValid:Z
+Landroid/widget/CursorAdapter;->mRowIDColumn:I
Landroid/widget/DatePicker;->mDelegate:Landroid/widget/DatePicker$DatePickerDelegate;
Landroid/widget/EdgeEffect;->mPaint:Landroid/graphics/Paint;
Landroid/widget/Editor;->invalidateTextDisplayList()V
@@ -2290,6 +2363,8 @@ Landroid/widget/ListPopupWindow;->setForceIgnoreOutsideTouch(Z)V
Landroid/widget/ListView;->fillDown(II)Landroid/view/View;
Landroid/widget/ListView;->fillSpecific(II)Landroid/view/View;
Landroid/widget/ListView;->fillUp(II)Landroid/view/View;
+Landroid/widget/ListView;->findViewTraversal(I)Landroid/view/View;
+Landroid/widget/ListView;->findViewWithTagTraversal(Ljava/lang/Object;)Landroid/view/View;
Landroid/widget/ListView;->mAreAllItemsSelectable:Z
Landroid/widget/ListView;->setSelectionInt(I)V
Landroid/widget/MediaController;->mAnchor:Landroid/view/View;
@@ -2375,6 +2450,8 @@ Landroid/widget/TabHost$TabSpec;->mContentStrategy:Landroid/widget/TabHost$Conte
Landroid/widget/TabWidget;->setTabSelectionListener(Landroid/widget/TabWidget$OnTabSelectionChanged;)V
Landroid/widget/TextView;->assumeLayout()V
Landroid/widget/TextView;->createEditorIfNeeded()V
+Landroid/widget/TextView;->getHorizontallyScrolling()Z
+Landroid/widget/TextView;->getTextColor(Landroid/content/Context;Landroid/content/res/TypedArray;I)I
Landroid/widget/TextView;->isSingleLine()Z
Landroid/widget/TextView;->mCursorDrawableRes:I
Landroid/widget/TextView;->mCurTextColor:I
@@ -2388,6 +2465,10 @@ Landroid/widget/TextView;->mTextPaint:Landroid/text/TextPaint;
Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;ZI)V
Landroid/widget/Toast;->getService()Landroid/app/INotificationManager;
Landroid/widget/Toast;->sService:Landroid/app/INotificationManager;
+Landroid/widget/VideoView2;->getMediaController()Landroid/media/session/MediaController;
+Landroid/widget/VideoView2$OnViewTypeChangedListener;->onViewTypeChanged(Landroid/view/View;I)V
+Landroid/widget/VideoView2;->setOnViewTypeChangedListener(Landroid/widget/VideoView2$OnViewTypeChangedListener;)V
+Landroid/widget/VideoView2;->setVideoPath(Ljava/lang/String;)V
Landroid/widget/VideoView;->mCurrentBufferPercentage:I
Landroid/widget/VideoView;->mMediaController:Landroid/widget/MediaController;
Landroid/widget/VideoView;->mSHCallback:Landroid/view/SurfaceHolder$Callback;
diff --git a/config/hiddenapi-vendor-list.txt b/config/hiddenapi-vendor-list.txt
index 952b28b8b820..2477b571cb91 100644
--- a/config/hiddenapi-vendor-list.txt
+++ b/config/hiddenapi-vendor-list.txt
@@ -1,9 +1,24 @@
+Landroid/accounts/AccountManager;-><init>(Landroid/content/Context;Landroid/accounts/IAccountManager;Landroid/os/Handler;)V
+Landroid/app/Activity;->managedQuery(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
+Landroid/app/ActivityManagerNative;->broadcastStickyIntent(Landroid/content/Intent;Ljava/lang/String;I)V
Landroid/app/ActivityManager$RecentTaskInfo;->configuration:Landroid/content/res/Configuration;
Landroid/app/ActivityManager$TaskDescription;->loadTaskDescriptionIcon(Ljava/lang/String;I)Landroid/graphics/Bitmap;
Landroid/app/ActivityManager$TaskSnapshot;->getSnapshot()Landroid/graphics/GraphicBuffer;
Landroid/app/ActivityOptions;->makeRemoteAnimation(Landroid/view/RemoteAnimationAdapter;)Landroid/app/ActivityOptions;
Landroid/app/ActivityOptions;->setSplitScreenCreateMode(I)V
Landroid/app/Activity;->registerRemoteAnimations(Landroid/view/RemoteAnimationDefinition;)V
+Landroid/app/ActivityView;-><init>(Landroid/content/Context;)V
+Landroid/app/ActivityView;->release()V
+Landroid/app/ActivityView;->startActivity(Landroid/app/PendingIntent;)V
+Landroid/app/ActivityView;->startActivity(Landroid/content/Intent;)V
+Landroid/app/AppOpsManager;->getPackagesForOps([I)Ljava/util/List;
+Landroid/app/AppOpsManager;->getToken(Lcom/android/internal/app/IAppOpsService;)Landroid/os/IBinder;
+Landroid/app/AppOpsManager$OpEntry;->getOp()I
+Landroid/app/AppOpsManager$OpEntry;->getTime()J
+Landroid/app/AppOpsManager$OpEntry;->isRunning()Z
+Landroid/app/AppOpsManager$PackageOps;->getOps()Ljava/util/List;
+Landroid/app/AppOpsManager$PackageOps;->getPackageName()Ljava/lang/String;
+Landroid/app/AppOpsManager$PackageOps;->getUid()I
Landroid/app/IActivityController$Stub;-><init>()V
Landroid/app/IActivityManager;->cancelRecentsAnimation()V
Landroid/app/IActivityManager;->cancelTaskWindowTransition(I)V
@@ -11,12 +26,18 @@ Landroid/app/IActivityManager;->closeSystemDialogs(Ljava/lang/String;)V
Landroid/app/IActivityManager;->getCurrentUser()Landroid/content/pm/UserInfo;
Landroid/app/IActivityManager;->getFilteredTasks(III)Ljava/util/List;
Landroid/app/IActivityManager;->getLockTaskModeState()I
+Landroid/app/IActivityManager;->getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;
Landroid/app/IActivityManager;->getRecentTasks(III)Landroid/content/pm/ParceledListSlice;
+Landroid/app/IActivityManager;->getRunningAppProcesses()Ljava/util/List;
Landroid/app/IActivityManager;->getTaskSnapshot(IZ)Landroid/app/ActivityManager$TaskSnapshot;
Landroid/app/IActivityManager;->registerTaskStackListener(Landroid/app/ITaskStackListener;)V
Landroid/app/IActivityManager;->removeTask(I)Z
+Landroid/app/IActivityManager;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;I)I
Landroid/app/IActivityManager;->startActivityFromRecents(ILandroid/os/Bundle;)I
+Landroid/app/IActivityManager;->startActivity(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;)I
Landroid/app/IActivityManager;->startRecentsActivity(Landroid/content/Intent;Landroid/app/IAssistDataReceiver;Landroid/view/IRecentsAnimationRunner;)V
+Landroid/app/IAlarmManager;->setTime(J)Z
+Landroid/app/IAlarmManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IAlarmManager;
Landroid/app/IAssistDataReceiver;->onHandleAssistData(Landroid/os/Bundle;)V
Landroid/app/IAssistDataReceiver;->onHandleAssistScreenshot(Landroid/graphics/Bitmap;)V
Landroid/app/IAssistDataReceiver$Stub;-><init>()V
@@ -40,6 +61,8 @@ Landroid/app/TaskStackListener;->onTaskStackChanged()V
Landroid/app/VrStateCallback;-><init>()V
Landroid/app/VrStateCallback;->onPersistentVrStateChanged(Z)V
Landroid/app/WallpaperColors;-><init>(Landroid/graphics/Color;Landroid/graphics/Color;Landroid/graphics/Color;I)V
+Landroid/bluetooth/BluetoothHeadset;->phoneStateChanged(IIILjava/lang/String;I)V
+Landroid/bluetooth/IBluetooth;->sendConnectionStateChange(Landroid/bluetooth/BluetoothDevice;III)V
Landroid/companion/AssociationRequest;->getDeviceFilters()Ljava/util/List;
Landroid/companion/AssociationRequest;->isSingleDevice()Z
Landroid/companion/BluetoothDeviceFilter;->getAddress()Ljava/lang/String;
@@ -53,19 +76,31 @@ Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelected(L
Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelectionCancel()V
Landroid/companion/ICompanionDeviceDiscoveryService$Stub;-><init>()V
Landroid/companion/IFindDeviceCallback;->onSuccess(Landroid/app/PendingIntent;)V
+Landroid/content/ContentProvider;->attachInfoForTesting(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V
+Landroid/content/ContentProvider;->getIContentProvider()Landroid/content/IContentProvider;
+Landroid/content/ContentProvider;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Landroid/content/pm/PathPermission;)V
+Landroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
+Landroid/content/ContentValues;->getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
+Landroid/content/ContentValues;->putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V
Landroid/content/Context;->getOpPackageName()Ljava/lang/String;
Landroid/content/Context;->registerReceiverAsUser(Landroid/content/BroadcastReceiver;Landroid/os/UserHandle;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
Landroid/content/Context;->startActivityAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
Landroid/content/Context;->startServiceAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/ComponentName;
Landroid/content/ContextWrapper;->getThemeResId()I
+Landroid/content/Intent;->getExtra(Ljava/lang/String;)Ljava/lang/Object;
+Landroid/content/Intent;->getIBinderExtra(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/content/Intent;->resolveSystemService(Landroid/content/pm/PackageManager;I)Landroid/content/ComponentName;
Landroid/content/pm/IPackageDataObserver;->onRemoveCompleted(Ljava/lang/String;Z)V
Landroid/content/pm/IPackageDataObserver$Stub;-><init>()V
Landroid/content/pm/IPackageDeleteObserver;->packageDeleted(Ljava/lang/String;I)V
Landroid/content/pm/IPackageDeleteObserver$Stub;-><init>()V
Landroid/content/pm/IPackageManager;->getActivityInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
+Landroid/content/pm/IPackageManager;->getApplicationInfo(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
Landroid/content/pm/IPackageManager;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName;
+Landroid/content/pm/IPackageManager;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
Landroid/content/pm/IPackageStatsObserver;->onGetStatsCompleted(Landroid/content/pm/PackageStats;Z)V
Landroid/database/sqlite/SqliteWrapper;->insert(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;
+Landroid/database/sqlite/SqliteWrapper;->query(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
Landroid/graphics/AvoidXfermode;-><init>(IILandroid/graphics/AvoidXfermode$Mode;)V
Landroid/graphics/Bitmap;->createGraphicBufferHandle()Landroid/graphics/GraphicBuffer;
Landroid/graphics/Bitmap;->createHardwareBitmap(Landroid/graphics/GraphicBuffer;)Landroid/graphics/Bitmap;
@@ -74,17 +109,24 @@ Landroid/graphics/Canvas;->clipRegion(Landroid/graphics/Region;)Z
Landroid/graphics/drawable/Drawable;->isProjected()Z
Landroid/graphics/drawable/Drawable;->updateTintFilter(Landroid/graphics/PorterDuffColorFilter;Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter;
Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
+Landroid/hardware/display/DisplayManagerGlobal;->getInstance()Landroid/hardware/display/DisplayManagerGlobal;
+Landroid/hardware/display/DisplayManagerGlobal;->getRealDisplay(I)Landroid/view/Display;
Landroid/hardware/location/GeofenceHardware;-><init>(Landroid/hardware/location/IGeofenceHardware;)V
Landroid/hardware/location/IActivityRecognitionHardwareClient;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
-Landroid/location/IFusedProvider;->onFusedLocationHardwareChange(Landroid/hardware/location/IFusedLocationHardware;)V
Landroid/location/IGeocodeProvider;->getFromLocation(DDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
Landroid/location/IGeocodeProvider;->getFromLocationName(Ljava/lang/String;DDDDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
Landroid/location/IGeofenceProvider;->setGeofenceHardware(Landroid/hardware/location/IGeofenceHardware;)V
+Landroid/location/ILocationManager;->getNetworkProviderPackage()Ljava/lang/String;
Landroid/location/ILocationManager;->reportLocation(Landroid/location/Location;Z)V
+Landroid/location/INetInitiatedListener;->sendNiResponse(II)Z
+Landroid/location/INetInitiatedListener$Stub;-><init>()V
+Landroid/location/Location;->setExtraLocation(Ljava/lang/String;Landroid/location/Location;)V
Landroid/media/AudioManager;->registerAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V
Landroid/media/AudioManager;->unregisterAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V
Landroid/media/AudioSystem;->checkAudioFlinger()I
+Landroid/media/AudioSystem;->getForceUse(I)I
Landroid/media/AudioSystem;->getParameters(Ljava/lang/String;)Ljava/lang/String;
+Landroid/media/AudioSystem;->setForceUse(II)I
Landroid/media/AudioSystem;->setParameters(Ljava/lang/String;)I
Landroid/media/MediaDrm$Certificate;->getContent()[B
Landroid/media/MediaDrm$Certificate;->getWrappedPrivateKey()[B
@@ -103,14 +145,18 @@ Landroid/media/tv/ITvRemoteServiceInput;->sendPointerDown(Landroid/os/IBinder;II
Landroid/media/tv/ITvRemoteServiceInput;->sendPointerSync(Landroid/os/IBinder;)V
Landroid/media/tv/ITvRemoteServiceInput;->sendPointerUp(Landroid/os/IBinder;I)V
Landroid/media/tv/ITvRemoteServiceInput;->sendTimestamp(Landroid/os/IBinder;J)V
+Landroid/net/ConnectivityManager;->getActiveNetworkQuotaInfo()Landroid/net/NetworkQuotaInfo;
Landroid/net/ConnectivityManager$PacketKeepaliveCallback;-><init>()V
Landroid/net/ConnectivityManager$PacketKeepaliveCallback;->onError(I)V
Landroid/net/ConnectivityManager$PacketKeepaliveCallback;->onStarted()V
Landroid/net/ConnectivityManager$PacketKeepaliveCallback;->onStopped()V
Landroid/net/ConnectivityManager$PacketKeepalive;->stop()V
+Landroid/net/ConnectivityManager;->setAirplaneMode(Z)V
Landroid/net/ConnectivityManager;->startNattKeepalive(Landroid/net/Network;ILandroid/net/ConnectivityManager$PacketKeepaliveCallback;Ljava/net/InetAddress;ILjava/net/InetAddress;)Landroid/net/ConnectivityManager$PacketKeepalive;
Landroid/net/ConnectivityManager;->startUsingNetworkFeature(ILjava/lang/String;)I
Landroid/net/ConnectivityManager;->stopUsingNetworkFeature(ILjava/lang/String;)I
+Landroid/net/ConnectivityManager;->tether(Ljava/lang/String;)I
+Landroid/net/ConnectivityManager;->untether(Ljava/lang/String;)I
Landroid/net/DhcpResults;-><init>(Landroid/net/DhcpResults;)V
Landroid/net/DhcpResults;-><init>(Landroid/net/StaticIpConfiguration;)V
Landroid/net/DhcpResults;-><init>()V
@@ -138,6 +184,8 @@ Landroid/net/LinkProperties;->addRoute(Landroid/net/RouteInfo;)Z
Landroid/net/LinkProperties;->addStackedLink(Landroid/net/LinkProperties;)Z
Landroid/net/LinkProperties;->clear()V
Landroid/net/LinkProperties;->compareProvisioning(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Landroid/net/LinkProperties$ProvisioningChange;
+Landroid/net/LinkProperties;->getAllInterfaceNames()Ljava/util/List;
+Landroid/net/LinkProperties;->getAllRoutes()Ljava/util/List;
Landroid/net/LinkProperties;->getMtu()I
Landroid/net/LinkProperties;->getStackedLinks()Ljava/util/List;
Landroid/net/LinkProperties;->hasGlobalIPv6Address()Z
@@ -226,12 +274,23 @@ Landroid/net/NetworkCapabilities;->getSignalStrength()I
Landroid/net/NetworkCapabilities;->hasSignalStrength()Z
Landroid/net/NetworkCapabilities;->transportNamesOf([I)Ljava/lang/String;
Landroid/net/Network;-><init>(I)V
+Landroid/net/Network;->netId:I
Landroid/net/NetworkQuotaInfo;->getEstimatedBytes()J
Landroid/net/NetworkQuotaInfo;->getHardLimitBytes()J
Landroid/net/NetworkQuotaInfo;->getSoftLimitBytes()J
Landroid/net/NetworkRequest$Builder;->setSignalStrength(I)Landroid/net/NetworkRequest$Builder;
+Landroid/net/NetworkRequest;->networkCapabilities:Landroid/net/NetworkCapabilities;
+Landroid/net/NetworkState;->network:Landroid/net/Network;
Landroid/net/NetworkStats;->combineValues(Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats;
+Landroid/net/NetworkStats$Entry;->iface:Ljava/lang/String;
Landroid/net/NetworkStats$Entry;-><init>()V
+Landroid/net/NetworkStats$Entry;->rxBytes:J
+Landroid/net/NetworkStats$Entry;->rxPackets:J
+Landroid/net/NetworkStats$Entry;->set:I
+Landroid/net/NetworkStats$Entry;->tag:I
+Landroid/net/NetworkStats$Entry;->txBytes:J
+Landroid/net/NetworkStats$Entry;->txPackets:J
+Landroid/net/NetworkStats$Entry;->uid:I
Landroid/net/NetworkStatsHistory$Entry;->txBytes:J
Landroid/net/NetworkStatsHistory;->getStart()J
Landroid/net/NetworkStatsHistory;->getValues(JJLandroid/net/NetworkStatsHistory$Entry;)Landroid/net/NetworkStatsHistory$Entry;
@@ -245,8 +304,10 @@ Landroid/net/NetworkUtils;->netmaskToPrefixLength(Ljava/net/Inet4Address;)I
Landroid/net/NetworkUtils;->protectFromVpn(Ljava/io/FileDescriptor;)Z
Landroid/net/RouteInfo;->hasGateway()Z
Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;Ljava/lang/String;)V
+Landroid/net/RouteInfo;->selectBestRoute(Ljava/util/Collection;Ljava/net/InetAddress;)Landroid/net/RouteInfo;
Landroid/net/SntpClient;->getNtpTime()J
-Landroid/net/SntpClient;->requestTime(Ljava/lang/String;I)Z
+Landroid/net/SntpClient;->getNtpTimeReference()J
+Landroid/net/SntpClient;->getRoundTripTime()J
Landroid/net/StaticIpConfiguration;->dnsServers:Ljava/util/ArrayList;
Landroid/net/StaticIpConfiguration;->domains:Ljava/lang/String;
Landroid/net/StaticIpConfiguration;->gateway:Ljava/net/InetAddress;
@@ -268,27 +329,36 @@ Landroid/os/BatteryStats$HistoryItem;->cmd:B
Landroid/os/BatteryStats$HistoryItem;-><init>()V
Landroid/os/BatteryStats$HistoryItem;->states:I
Landroid/os/BatteryStats$HistoryItem;->time:J
+Landroid/os/BatteryStats$Timer;->getCountLocked(I)I
Landroid/os/BatteryStats$Uid;->getWifiRunningTime(JI)J
Landroid/os/BatteryStats$Uid;-><init>()V
Landroid/os/BatteryStats$Uid$Wakelock;->getWakeTime(I)Landroid/os/BatteryStats$Timer;
+Landroid/os/Broadcaster;->broadcast(Landroid/os/Message;)V
+Landroid/os/Broadcaster;->cancelRequest(ILandroid/os/Handler;I)V
+Landroid/os/Broadcaster;-><init>()V
+Landroid/os/Broadcaster;->request(ILandroid/os/Handler;I)V
+Landroid/os/Environment;->getLegacyExternalStorageDirectory()Ljava/io/File;
Landroid/os/Handler;->getMain()Landroid/os/Handler;
Landroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V
Landroid/os/HwBinder;->reportSyspropChanged()V
Landroid/os/INetworkManagementService;->clearInterfaceAddresses(Ljava/lang/String;)V
Landroid/os/INetworkManagementService;->disableIpv6(Ljava/lang/String;)V
Landroid/os/INetworkManagementService;->enableIpv6(Ljava/lang/String;)V
+Landroid/os/INetworkManagementService;->isBandwidthControlEnabled()Z
Landroid/os/INetworkManagementService;->registerObserver(Landroid/net/INetworkManagementEventObserver;)V
Landroid/os/INetworkManagementService;->setInterfaceConfig(Ljava/lang/String;Landroid/net/InterfaceConfiguration;)V
Landroid/os/INetworkManagementService;->setInterfaceIpv6PrivacyExtensions(Ljava/lang/String;Z)V
Landroid/os/INetworkManagementService;->setIPv6AddrGenMode(Ljava/lang/String;I)V
Landroid/os/INetworkManagementService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/INetworkManagementService;
Landroid/os/INetworkManagementService;->unregisterObserver(Landroid/net/INetworkManagementEventObserver;)V
+Landroid/os/IPowerManager;->goToSleep(JII)V
Landroid/os/IPowerManager;->reboot(ZLjava/lang/String;Z)V
Landroid/os/IRemoteCallback$Stub;-><init>()V
Landroid/os/Message;->setCallback(Ljava/lang/Runnable;)Landroid/os/Message;
Landroid/os/Parcel;->readBlob()[B
Landroid/os/Parcel;->readStringArray()[Ljava/lang/String;
Landroid/os/Parcel;->writeBlob([B)V
+Landroid/os/PowerManager;->goToSleep(J)V
Landroid/os/PowerManager;->isScreenBrightnessBoosted()Z
Landroid/os/Registrant;->clear()V
Landroid/os/Registrant;-><init>(Landroid/os/Handler;ILjava/lang/Object;)V
@@ -303,10 +373,35 @@ Landroid/os/Registrant;->notifyRegistrant(Landroid/os/AsyncResult;)V
Landroid/os/Registrant;->notifyRegistrant()V
Landroid/os/RemoteException;->rethrowFromSystemServer()Ljava/lang/RuntimeException;
Landroid/os/ServiceSpecificException;->errorCode:I
+Landroid/os/storage/DiskInfo;->getId()Ljava/lang/String;
+Landroid/os/storage/StorageEventListener;-><init>()V
+Landroid/os/storage/StorageManager;->findVolumeById(Ljava/lang/String;)Landroid/os/storage/VolumeInfo;
+Landroid/os/storage/StorageManager;->from(Landroid/content/Context;)Landroid/os/storage/StorageManager;
+Landroid/os/storage/StorageManager;->registerListener(Landroid/os/storage/StorageEventListener;)V
+Landroid/os/storage/StorageManager;->unregisterListener(Landroid/os/storage/StorageEventListener;)V
+Landroid/os/storage/StorageVolume;->getId()Ljava/lang/String;
+Landroid/os/storage/VolumeInfo;->getId()Ljava/lang/String;
Landroid/os/SystemProperties;->reportSyspropChanged()V
+Landroid/os/SystemService;->start(Ljava/lang/String;)V
+Landroid/os/SystemService;->stop(Ljava/lang/String;)V
+Landroid/os/SystemVibrator;-><init>()V
+Landroid/os/UserHandle;->isSameApp(II)Z
+Landroid/os/UserManager;->hasUserRestriction(Ljava/lang/String;Landroid/os/UserHandle;)Z
+Landroid/os/UserManager;->isAdminUser()Z
Landroid/print/PrintDocumentAdapter$LayoutResultCallback;-><init>()V
Landroid/print/PrintDocumentAdapter$WriteResultCallback;-><init>()V
Landroid/provider/CalendarContract$Events;->PROVIDER_WRITABLE_COLUMNS:[Ljava/lang/String;
+Landroid/provider/ContactsContract$CommonDataKinds$Phone;->getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;
+Landroid/provider/Settings$Global;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
+Landroid/provider/Settings$Secure;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
+Landroid/provider/Telephony$Mms;->isEmailAddress(Ljava/lang/String;)Z
+Landroid/provider/Telephony$Sms$Draft;->addMessage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms$Outbox;->addMessage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZJ)Landroid/net/Uri;
+Landroid/R$styleable;->CheckBoxPreference:[I
+Landroid/service/dreams/DreamService;->canDoze()Z
+Landroid/service/dreams/DreamService;->isDozing()Z
+Landroid/service/dreams/DreamService;->startDozing()V
+Landroid/service/dreams/DreamService;->stopDozing()V
Landroid/service/vr/VrListenerService;->onCurrentVrActivityChanged(Landroid/content/ComponentName;ZI)V
Landroid/system/NetlinkSocketAddress;-><init>(II)V
Landroid/system/Os;->bind(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)V
@@ -316,6 +411,11 @@ Landroid/system/Os;->setsockoptIfreq(Ljava/io/FileDescriptor;IILjava/lang/String
Landroid/system/Os;->setsockoptTimeval(Ljava/io/FileDescriptor;IILandroid/system/StructTimeval;)V
Landroid/system/PacketSocketAddress;-><init>(I[B)V
Landroid/system/PacketSocketAddress;-><init>(SI)V
+Landroid/telecom/ParcelableCall;->CREATOR:Landroid/os/Parcelable$Creator;
+Landroid/telecom/ParcelableCall;->getConnectTimeMillis()J
+Landroid/telecom/ParcelableCall;->getDisconnectCause()Landroid/telecom/DisconnectCause;
+Landroid/telecom/ParcelableCall;->getHandle()Landroid/net/Uri;
+Landroid/telecom/ParcelableCall;->getId()Ljava/lang/String;
Landroid/telecom/TelecomManager;->from(Landroid/content/Context;)Landroid/telecom/TelecomManager;
Landroid/telecom/VideoProfile$CameraCapabilities;-><init>(IIZF)V
Landroid/telephony/ims/compat/feature/MMTelFeature;-><init>()V
@@ -329,6 +429,14 @@ Landroid/telephony/ims/ImsExternalCallState;-><init>(ILandroid/net/Uri;ZIIZ)V
Landroid/telephony/ims/ImsReasonInfo;-><init>(IILjava/lang/String;)V
Landroid/telephony/ims/ImsReasonInfo;-><init>(II)V
Landroid/telephony/ims/ImsStreamMediaProfile;-><init>()V
+Landroid/telephony/mbms/IMbmsStreamingSessionCallback$Stub;-><init>()V
+Landroid/telephony/mbms/IStreamingServiceCallback$Stub;-><init>()V
+Landroid/telephony/mbms/vendor/IMbmsStreamingService;->getPlaybackUri(ILjava/lang/String;)Landroid/net/Uri;
+Landroid/telephony/mbms/vendor/IMbmsStreamingService;->initialize(Landroid/telephony/mbms/IMbmsStreamingSessionCallback;I)I
+Landroid/telephony/mbms/vendor/IMbmsStreamingService;->requestUpdateStreamingServices(ILjava/util/List;)I
+Landroid/telephony/mbms/vendor/IMbmsStreamingService;->startStreaming(ILjava/lang/String;Landroid/telephony/mbms/IStreamingServiceCallback;)I
+Landroid/telephony/mbms/vendor/IMbmsStreamingService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/telephony/mbms/vendor/IMbmsStreamingService;
+Landroid/telephony/PhoneNumberUtils;->formatNumber(Ljava/lang/String;I)Ljava/lang/String;
Landroid/telephony/PhoneNumberUtils;->isEmergencyNumber(ILjava/lang/String;)Z
Landroid/telephony/PhoneNumberUtils;->isPotentialEmergencyNumber(ILjava/lang/String;)Z
Landroid/telephony/PhoneNumberUtils;->isPotentialLocalEmergencyNumber(Landroid/content/Context;ILjava/lang/String;)Z
@@ -342,12 +450,20 @@ Landroid/telephony/Rlog;->d(Ljava/lang/String;Ljava/lang/String;)I
Landroid/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;)I
Landroid/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
Landroid/telephony/Rlog;->i(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/telephony/ServiceState;->getDataRegState()I
Landroid/telephony/ServiceState;->getDataRoaming()Z
Landroid/telephony/ServiceState;->getRilDataRadioTechnology()I
+Landroid/telephony/ServiceState;->getVoiceNetworkType()I
Landroid/telephony/ServiceState;->getVoiceRegState()I
Landroid/telephony/ServiceState;->isCdma(I)Z
Landroid/telephony/ServiceState;->isEmergencyOnly()Z
+Landroid/telephony/ServiceState;->isGsm(I)Z
Landroid/telephony/ServiceState;->mergeServiceStates(Landroid/telephony/ServiceState;Landroid/telephony/ServiceState;)Landroid/telephony/ServiceState;
+Landroid/telephony/ServiceState;->rilRadioTechnologyToString(I)Ljava/lang/String;
+Landroid/telephony/SubscriptionInfo;->setDisplayName(Ljava/lang/CharSequence;)V
+Landroid/telephony/SubscriptionInfo;->setIconTint(I)V
+Landroid/telephony/SubscriptionManager;->clearDefaultsForInactiveSubIds()V
+Landroid/telephony/SubscriptionManager;->getDefaultVoicePhoneId()I
Landroid/telephony/SubscriptionManager;->getResourcesForSubId(Landroid/content/Context;I)Landroid/content/res/Resources;
Landroid/telephony/SubscriptionManager;->isActiveSubId(I)Z
Landroid/telephony/SubscriptionManager;->isUsableSubIdValue(I)Z
@@ -355,9 +471,18 @@ Landroid/telephony/SubscriptionManager;->isValidPhoneId(I)Z
Landroid/telephony/SubscriptionManager;->isValidSlotIndex(I)Z
Landroid/telephony/SubscriptionManager;->isValidSubscriptionId(I)Z
Landroid/telephony/SubscriptionManager;->putPhoneIdAndSubIdExtra(Landroid/content/Intent;II)V
+Landroid/telephony/SubscriptionManager;->putPhoneIdAndSubIdExtra(Landroid/content/Intent;I)V
+Landroid/telephony/SubscriptionManager;->setDefaultDataSubId(I)V
+Landroid/telephony/SubscriptionManager;->setDisplayName(Ljava/lang/String;IJ)I
+Landroid/telephony/SubscriptionManager;->setIconTint(II)I
Landroid/telephony/TelephonyManager;->getIntAtIndex(Landroid/content/ContentResolver;Ljava/lang/String;I)I
+Landroid/telephony/TelephonyManager;->getNetworkTypeName()Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getVoiceMessageCount()I
Landroid/telephony/TelephonyManager;->getVoiceNetworkType(I)I
+Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDA:Landroid/telephony/TelephonyManager$MultiSimVariants;
+Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDS:Landroid/telephony/TelephonyManager$MultiSimVariants;
Landroid/telephony/TelephonyManager;->putIntAtIndex(Landroid/content/ContentResolver;Ljava/lang/String;II)Z
+Landroid/text/TextUtils;->isPrintableAsciiOnly(Ljava/lang/CharSequence;)Z
Landroid/util/FloatMath;->ceil(F)F
Landroid/util/FloatMath;->cos(F)F
Landroid/util/FloatMath;->exp(F)F
@@ -374,6 +499,9 @@ Landroid/util/LongArray;->add(IJ)V
Landroid/util/LongArray;->get(I)J
Landroid/util/LongArray;-><init>()V
Landroid/util/LongArray;->size()I
+Landroid/util/Slog;->e(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/util/Slog;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
+Landroid/util/Slog;->println(ILjava/lang/String;Ljava/lang/String;)I
Landroid/util/Slog;->wtf(Ljava/lang/String;Ljava/lang/String;)I
Landroid/view/AppTransitionAnimationSpec;-><init>(ILandroid/graphics/GraphicBuffer;Landroid/graphics/Rect;)V
Landroid/view/BatchedInputEventReceiver;-><init>(Landroid/view/InputChannel;Landroid/os/Looper;Landroid/view/Choreographer;)V
@@ -525,6 +653,19 @@ Lcom/android/ims/internal/uce/uceservice/IUceService;->isServiceStarted()Z
Lcom/android/ims/internal/uce/uceservice/IUceService;->startService(Lcom/android/ims/internal/uce/uceservice/IUceListener;)Z
Lcom/android/ims/internal/uce/uceservice/IUceService;->stopService()Z
Lcom/android/ims/internal/uce/uceservice/IUceService$Stub;-><init>()V
+Lcom/android/internal/app/AlertController$AlertParams;->mIconId:I
+Lcom/android/internal/app/AlertController$AlertParams;->mMessage:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController$AlertParams;->mNegativeButtonListener:Landroid/content/DialogInterface$OnClickListener;
+Lcom/android/internal/app/AlertController$AlertParams;->mNegativeButtonText:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController$AlertParams;->mPositiveButtonListener:Landroid/content/DialogInterface$OnClickListener;
+Lcom/android/internal/app/AlertController$AlertParams;->mPositiveButtonText:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController$AlertParams;->mTitle:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController$AlertParams;->mView:Landroid/view/View;
+Lcom/android/internal/app/AlertController;->getButton(I)Landroid/widget/Button;
+Lcom/android/internal/app/IAppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;)V
+Lcom/android/internal/content/PackageMonitor;-><init>()V
+Lcom/android/internal/content/PackageMonitor;->register(Landroid/content/Context;Landroid/os/Looper;Landroid/os/UserHandle;Z)V
+Lcom/android/internal/content/PackageMonitor;->unregister()V
Lcom/android/internal/location/ILocationProvider;->disable()V
Lcom/android/internal/location/ILocationProvider;->enable()V
Lcom/android/internal/location/ILocationProvider;->getProperties()Lcom/android/internal/location/ProviderProperties;
@@ -532,6 +673,11 @@ Lcom/android/internal/location/ILocationProvider;->getStatus(Landroid/os/Bundle;
Lcom/android/internal/location/ILocationProvider;->getStatusUpdateTime()J
Lcom/android/internal/location/ILocationProvider;->sendExtraCommand(Ljava/lang/String;Landroid/os/Bundle;)Z
Lcom/android/internal/location/ILocationProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+Lcom/android/internal/location/ILocationProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProvider;
+Lcom/android/internal/location/ProviderRequest;-><init>()V
+Lcom/android/internal/location/ProviderRequest;->interval:J
+Lcom/android/internal/location/ProviderRequest;->locationRequests:Ljava/util/List;
+Lcom/android/internal/location/ProviderRequest;->reportLocation:Z
Lcom/android/internal/os/BatteryStatsImpl;->getDischargeCurrentLevel()I
Lcom/android/internal/os/BatteryStatsImpl;->getDischargeStartLevel()I
Lcom/android/internal/os/BatteryStatsImpl;->getPhoneOnTime(JI)J
@@ -541,7 +687,22 @@ Lcom/android/internal/os/BatteryStatsImpl;->getScreenBrightnessTime(IJI)J
Lcom/android/internal/os/BatteryStatsImpl;->getWifiOnTime(JI)J
Lcom/android/internal/os/SomeArgs;->obtain()Lcom/android/internal/os/SomeArgs;
Lcom/android/internal/os/SomeArgs;->recycle()V
+Lcom/android/internal/R$styleable;->NumberPicker:[I
+Lcom/android/internal/R$styleable;->TwoLineListItem:[I
+Lcom/android/internal/telephony/GsmAlphabet;->gsm7BitPackedToString([BII)Ljava/lang/String;
+Lcom/android/internal/telephony/GsmAlphabet;->stringToGsm7BitPacked(Ljava/lang/String;)[B
Lcom/android/internal/telephony/ITelephony;->getDataEnabled(I)Z
+Lcom/android/internal/telephony/OperatorInfo;->CREATOR:Landroid/os/Parcelable$Creator;
+Lcom/android/internal/telephony/OperatorInfo;->getOperatorAlphaLong()Ljava/lang/String;
+Lcom/android/internal/telephony/OperatorInfo;->getOperatorAlphaShort()Ljava/lang/String;
+Lcom/android/internal/telephony/OperatorInfo;->getOperatorNumeric()Ljava/lang/String;
+Lcom/android/internal/telephony/OperatorInfo;->getState()Lcom/android/internal/telephony/OperatorInfo$State;
+Lcom/android/internal/telephony/OperatorInfo;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+Lcom/android/internal/telephony/OperatorInfo$State;->CURRENT:Lcom/android/internal/telephony/OperatorInfo$State;
+Lcom/android/internal/telephony/OperatorInfo$State;->FORBIDDEN:Lcom/android/internal/telephony/OperatorInfo$State;
+Lcom/android/internal/util/AsyncChannel;->connect(Landroid/content/Context;Landroid/os/Handler;Landroid/os/Messenger;)V
+Lcom/android/internal/util/AsyncChannel;-><init>()V
+Lcom/android/internal/util/AsyncChannel;->sendMessage(Landroid/os/Message;)V
Lcom/android/internal/util/IndentingPrintWriter;->decreaseIndent()Lcom/android/internal/util/IndentingPrintWriter;
Lcom/android/internal/util/IndentingPrintWriter;->increaseIndent()Lcom/android/internal/util/IndentingPrintWriter;
Lcom/android/internal/util/IndentingPrintWriter;-><init>(Ljava/io/Writer;Ljava/lang/String;)V
@@ -550,3 +711,4 @@ Lcom/android/internal/util/XmlUtils;->nextElement(Lorg/xmlpull/v1/XmlPullParser;
Ljava/lang/System;->arraycopy([BI[BII)V
Ljava/net/Inet4Address;->ALL:Ljava/net/InetAddress;
Ljava/net/Inet4Address;->ANY:Ljava/net/InetAddress;
+Ljava/net/Inet6Address;->ANY:Ljava/net/InetAddress;
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 459a5876b633..baf2d6027ca9 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -30,12 +30,15 @@ import android.annotation.Nullable;
import android.app.assist.AssistContent;
import android.app.assist.AssistStructure;
import android.app.backup.BackupAgent;
+import android.app.servertransaction.ActivityLifecycleItem;
import android.app.servertransaction.ActivityLifecycleItem.LifecycleState;
+import android.app.servertransaction.ActivityRelaunchItem;
import android.app.servertransaction.ActivityResultItem;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.PendingTransactionActions;
import android.app.servertransaction.PendingTransactionActions.StopInfo;
import android.app.servertransaction.TransactionExecutor;
+import android.app.servertransaction.TransactionExecutorHelper;
import android.content.BroadcastReceiver;
import android.content.ComponentCallbacks2;
import android.content.ComponentName;
@@ -144,7 +147,7 @@ import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.org.conscrypt.OpenSSLSocketImpl;
import com.android.org.conscrypt.TrustedCertificateStore;
-import com.android.server.am.proto.MemInfoDumpProto;
+import com.android.server.am.MemInfoDumpProto;
import dalvik.system.BaseDexClassLoader;
import dalvik.system.CloseGuard;
@@ -520,6 +523,10 @@ public final class ActivityThread extends ClientTransactionHandler {
return activityInfo.persistableMode == ActivityInfo.PERSIST_ACROSS_REBOOTS;
}
+ public boolean isVisibleFromServer() {
+ return activity != null && activity.mVisibleFromServer;
+ }
+
public String toString() {
ComponentName componentName = intent != null ? intent.getComponent() : null;
return "ActivityRecord{"
@@ -1797,6 +1804,7 @@ public final class ActivityThread extends ClientTransactionHandler {
// message is handled.
transaction.recycle();
}
+ // TODO(lifecycler): Recycle locally scheduled transactions.
break;
}
Object obj = msg.obj;
@@ -4034,9 +4042,11 @@ public final class ActivityThread extends ClientTransactionHandler {
r.setState(ON_PAUSE);
}
+ /** Called from {@link LocalActivityManager}. */
final void performStopActivity(IBinder token, boolean saveState, String reason) {
ActivityClientRecord r = mActivities.get(token);
- performStopActivityInner(r, null, false, saveState, reason);
+ performStopActivityInner(r, null /* stopInfo */, false /* keepShown */, saveState,
+ false /* finalStateRequest */, reason);
}
private static final class ProviderRefCount {
@@ -4068,9 +4078,16 @@ public final class ActivityThread extends ClientTransactionHandler {
* it the result when it is done, but the window may still be visible.
* For the client, we want to call onStop()/onStart() to indicate when
* the activity's UI visibility changes.
+ * @param r Target activity client record.
+ * @param info Action that will report activity stop to server.
+ * @param keepShown Flag indicating whether the activity is still shown.
+ * @param saveState Flag indicating whether the activity state should be saved.
+ * @param finalStateRequest Flag indicating if this call is handling final lifecycle state
+ * request for a transaction.
+ * @param reason Reason for performing this operation.
*/
private void performStopActivityInner(ActivityClientRecord r, StopInfo info, boolean keepShown,
- boolean saveState, String reason) {
+ boolean saveState, boolean finalStateRequest, String reason) {
if (localLOGV) Slog.v(TAG, "Performing stop of " + r);
if (r != null) {
if (!keepShown && r.stopped) {
@@ -4080,11 +4097,13 @@ public final class ActivityThread extends ClientTransactionHandler {
// if the activity isn't resumed.
return;
}
- RuntimeException e = new RuntimeException(
- "Performing stop of activity that is already stopped: "
- + r.intent.getComponent().toShortString());
- Slog.e(TAG, e.getMessage(), e);
- Slog.e(TAG, r.getStateString());
+ if (!finalStateRequest) {
+ final RuntimeException e = new RuntimeException(
+ "Performing stop of activity that is already stopped: "
+ + r.intent.getComponent().toShortString());
+ Slog.e(TAG, e.getMessage(), e);
+ Slog.e(TAG, r.getStateString());
+ }
}
// One must first be paused before stopped...
@@ -4177,12 +4196,13 @@ public final class ActivityThread extends ClientTransactionHandler {
@Override
public void handleStopActivity(IBinder token, boolean show, int configChanges,
- PendingTransactionActions pendingActions, String reason) {
+ PendingTransactionActions pendingActions, boolean finalStateRequest, String reason) {
final ActivityClientRecord r = mActivities.get(token);
r.activity.mConfigChangeFlags |= configChanges;
final StopInfo stopInfo = new StopInfo();
- performStopActivityInner(r, stopInfo, show, true, reason);
+ performStopActivityInner(r, stopInfo, show, true /* saveState */, finalStateRequest,
+ reason);
if (localLOGV) Slog.v(
TAG, "Finishing stop of " + r + ": show=" + show
@@ -4234,7 +4254,8 @@ public final class ActivityThread extends ClientTransactionHandler {
}
if (!show && !r.stopped) {
- performStopActivityInner(r, null, show, false, "handleWindowVisibility");
+ performStopActivityInner(r, null /* stopInfo */, show, false /* saveState */,
+ false /* finalStateRequest */, "handleWindowVisibility");
} else if (show && r.stopped) {
// If we are getting ready to gc after going to the background, well
// we are back active so skip it.
@@ -4710,14 +4731,25 @@ public final class ActivityThread extends ClientTransactionHandler {
return;
}
- // TODO(b/73747058): Investigate converting this to use transaction to relaunch.
- handleRelaunchActivityInner(r, 0 /* configChanges */, null /* pendingResults */,
- null /* pendingIntents */, null /* pendingActions */, prevState != ON_RESUME,
- r.overrideConfig, "handleRelaunchActivityLocally");
- // Restore back to the previous state before relaunch if needed.
- if (prevState != r.getLifecycleState()) {
- mTransactionExecutor.cycleToPath(r, prevState);
+ // Initialize a relaunch request.
+ final MergedConfiguration mergedConfiguration = new MergedConfiguration(
+ r.createdConfig != null ? r.createdConfig : mConfiguration,
+ r.overrideConfig);
+ final ActivityRelaunchItem activityRelaunchItem = ActivityRelaunchItem.obtain(
+ null /* pendingResults */, null /* pendingIntents */, 0 /* configChanges */,
+ mergedConfiguration, r.mPreserveWindow);
+ // Make sure to match the existing lifecycle state in the end of the transaction.
+ final ActivityLifecycleItem lifecycleRequest =
+ TransactionExecutorHelper.getLifecycleRequestForCurrentState(r);
+ // Schedule the transaction.
+ final ClientTransaction transaction = ClientTransaction.obtain(this.mAppThread, r.token);
+ transaction.addCallback(activityRelaunchItem);
+ transaction.setLifecycleStateRequest(lifecycleRequest);
+ try {
+ mAppThread.scheduleTransaction(transaction);
+ } catch (RemoteException e) {
+ // Local scheduling
}
}
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index 5d0143a505f3..7032a2fe21cf 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -27,6 +27,7 @@ import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
+import android.view.IWindowManager;
import android.view.InputDevice;
import android.view.InputEvent;
import android.view.MotionEvent;
@@ -308,8 +309,14 @@ public class ActivityView extends ViewGroup {
return;
}
- mInputForwarder = InputManager.getInstance().createInputForwarder(
- mVirtualDisplay.getDisplay().getDisplayId());
+ final int displayId = mVirtualDisplay.getDisplay().getDisplayId();
+ final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
+ try {
+ wm.dontOverrideDisplayInfo(displayId);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
+ mInputForwarder = InputManager.getInstance().createInputForwarder(displayId);
mTaskStackListener = new TaskBackgroundChangeListener();
try {
mActivityManager.registerTaskStackListener(mTaskStackListener);
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 4690211f4667..ea8c71c9f398 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -270,8 +270,10 @@ public class AppOpsManager {
public static final int OP_BIND_ACCESSIBILITY_SERVICE = 73;
/** @hide Continue handover of a call from another app */
public static final int OP_ACCEPT_HANDOVER = 74;
+ /** @hide Create and Manage IPsec Tunnels */
+ public static final int OP_MANAGE_IPSEC_TUNNELS = 75;
/** @hide */
- public static final int _NUM_OP = 75;
+ public static final int _NUM_OP = 76;
/** Access to coarse location information. */
public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -507,6 +509,9 @@ public class AppOpsManager {
@SystemApi @TestApi
public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE =
"android:bind_accessibility_service";
+ /** @hide */
+ @SystemApi @TestApi
+ public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels";
// Warning: If an permission is added here it also has to be added to
// com.android.packageinstaller.permission.utils.EventLogger
@@ -641,6 +646,7 @@ public class AppOpsManager {
OP_REQUEST_DELETE_PACKAGES,
OP_BIND_ACCESSIBILITY_SERVICE,
OP_ACCEPT_HANDOVER,
+ OP_MANAGE_IPSEC_TUNNELS,
};
/**
@@ -722,6 +728,7 @@ public class AppOpsManager {
OPSTR_REQUEST_DELETE_PACKAGES,
OPSTR_BIND_ACCESSIBILITY_SERVICE,
OPSTR_ACCEPT_HANDOVER,
+ OPSTR_MANAGE_IPSEC_TUNNELS,
};
/**
@@ -804,6 +811,7 @@ public class AppOpsManager {
"REQUEST_DELETE_PACKAGES",
"BIND_ACCESSIBILITY_SERVICE",
"ACCEPT_HANDOVER",
+ "MANAGE_IPSEC_TUNNELS",
};
/**
@@ -886,6 +894,7 @@ public class AppOpsManager {
Manifest.permission.REQUEST_DELETE_PACKAGES,
Manifest.permission.BIND_ACCESSIBILITY_SERVICE,
Manifest.permission.ACCEPT_HANDOVER,
+ null, // no permission for OP_MANAGE_IPSEC_TUNNELS
};
/**
@@ -969,6 +978,7 @@ public class AppOpsManager {
null, // REQUEST_DELETE_PACKAGES
null, // OP_BIND_ACCESSIBILITY_SERVICE
null, // ACCEPT_HANDOVER
+ null, // MANAGE_IPSEC_TUNNELS
};
/**
@@ -1051,6 +1061,7 @@ public class AppOpsManager {
false, // OP_REQUEST_DELETE_PACKAGES
false, // OP_BIND_ACCESSIBILITY_SERVICE
false, // ACCEPT_HANDOVER
+ false, // MANAGE_IPSEC_HANDOVERS
};
/**
@@ -1132,6 +1143,7 @@ public class AppOpsManager {
AppOpsManager.MODE_ALLOWED, // REQUEST_DELETE_PACKAGES
AppOpsManager.MODE_ALLOWED, // OP_BIND_ACCESSIBILITY_SERVICE
AppOpsManager.MODE_ALLOWED, // ACCEPT_HANDOVER
+ AppOpsManager.MODE_ERRORED, // MANAGE_IPSEC_TUNNELS
};
/**
@@ -1217,6 +1229,7 @@ public class AppOpsManager {
false, // OP_REQUEST_DELETE_PACKAGES
false, // OP_BIND_ACCESSIBILITY_SERVICE
false, // ACCEPT_HANDOVER
+ false, // MANAGE_IPSEC_TUNNELS
};
/**
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 21fb18a212a8..fb8ded1e7a43 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -20,6 +20,7 @@ import android.annotation.DrawableRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringRes;
+import android.annotation.UserIdInt;
import android.annotation.XmlRes;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -69,6 +70,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemProperties;
@@ -1031,19 +1033,25 @@ public class ApplicationPackageManager extends PackageManager {
}
@Override
- public ResolveInfo resolveService(Intent intent, int flags) {
+ public ResolveInfo resolveServiceAsUser(Intent intent, @ResolveInfoFlags int flags,
+ @UserIdInt int userId) {
try {
return mPM.resolveService(
intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
flags,
- mContext.getUserId());
+ userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@Override
+ public ResolveInfo resolveService(Intent intent, int flags) {
+ return resolveServiceAsUser(intent, flags, mContext.getUserId());
+ }
+
+ @Override
@SuppressWarnings("unchecked")
public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
try {
@@ -2144,16 +2152,42 @@ public class ApplicationPackageManager extends PackageManager {
}
@Override
- public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean suspended,
- int userId) {
+ public String[] setPackagesSuspended(String[] packageNames, boolean suspended,
+ PersistableBundle appExtras, PersistableBundle launcherExtras,
+ String dialogMessage) {
+ // TODO (b/75332201): Pass in the dialogMessage and use it in the interceptor dialog
try {
- return mPM.setPackagesSuspendedAsUser(packageNames, suspended, userId);
+ return mPM.setPackagesSuspendedAsUser(packageNames, suspended, appExtras,
+ launcherExtras, mContext.getOpPackageName(), mContext.getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@Override
+ public PersistableBundle getSuspendedPackageAppExtras(String packageName) {
+ try {
+ return mPM.getPackageSuspendedAppExtras(packageName, mContext.getUserId());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ @Override
+ public PersistableBundle getSuspendedPackageAppExtras() {
+ return getSuspendedPackageAppExtras(mContext.getOpPackageName());
+ }
+
+ @Override
+ public void setSuspendedPackageAppExtras(String packageName, PersistableBundle appExtras) {
+ try {
+ mPM.setSuspendedPackageAppExtras(packageName, appExtras, mContext.getUserId());
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ @Override
public boolean isPackageSuspendedForUser(String packageName, int userId) {
try {
return mPM.isPackageSuspendedForUser(packageName, userId);
@@ -2164,6 +2198,17 @@ public class ApplicationPackageManager extends PackageManager {
/** @hide */
@Override
+ public boolean isPackageSuspended(String packageName) {
+ return isPackageSuspendedForUser(packageName, mContext.getUserId());
+ }
+
+ @Override
+ public boolean isPackageSuspended() {
+ return isPackageSuspendedForUser(mContext.getOpPackageName(), mContext.getUserId());
+ }
+
+ /** @hide */
+ @Override
public void setApplicationCategoryHint(String packageName, int categoryHint) {
try {
mPM.setApplicationCategoryHint(packageName, categoryHint,
diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java
index 206495d0db6c..961bca23c91a 100644
--- a/core/java/android/app/ClientTransactionHandler.java
+++ b/core/java/android/app/ClientTransactionHandler.java
@@ -78,9 +78,19 @@ public abstract class ClientTransactionHandler {
public abstract void handleResumeActivity(IBinder token, boolean finalStateRequest,
boolean isForward, String reason);
- /** Stop the activity. */
+ /**
+ * Stop the activity.
+ * @param token Target activity token.
+ * @param show Flag indicating whether activity is still shown.
+ * @param configChanges Activity configuration changes.
+ * @param pendingActions Pending actions to be used on this or later stages of activity
+ * transaction.
+ * @param finalStateRequest Flag indicating if this call is handling final lifecycle state
+ * request for a transaction.
+ * @param reason Reason for performing this operation.
+ */
public abstract void handleStopActivity(IBinder token, boolean show, int configChanges,
- PendingTransactionActions pendingActions, String reason);
+ PendingTransactionActions pendingActions, boolean finalStateRequest, String reason);
/** Report that activity was stopped to server. */
public abstract void reportStop(PendingTransactionActions pendingActions);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 2ac3e2314f89..d3c1e99f1523 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -89,6 +89,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
@@ -2599,6 +2600,80 @@ public class Notification implements Parcelable
};
/**
+ * @hide
+ */
+ public static boolean areActionsVisiblyDifferent(Notification first, Notification second) {
+ Notification.Action[] firstAs = first.actions;
+ Notification.Action[] secondAs = second.actions;
+ if (firstAs == null && secondAs != null || firstAs != null && secondAs == null) {
+ return true;
+ }
+ if (firstAs != null && secondAs != null) {
+ if (firstAs.length != secondAs.length) {
+ return true;
+ }
+ for (int i = 0; i < firstAs.length; i++) {
+ if (!Objects.equals(firstAs[i].title, secondAs[i].title)) {
+ return true;
+ }
+ RemoteInput[] firstRs = firstAs[i].getRemoteInputs();
+ RemoteInput[] secondRs = secondAs[i].getRemoteInputs();
+ if (firstRs == null) {
+ firstRs = new RemoteInput[0];
+ }
+ if (secondRs == null) {
+ secondRs = new RemoteInput[0];
+ }
+ if (firstRs.length != secondRs.length) {
+ return true;
+ }
+ for (int j = 0; j < firstRs.length; j++) {
+ if (!Objects.equals(firstRs[j].getLabel(), secondRs[j].getLabel())) {
+ return true;
+ }
+ CharSequence[] firstCs = firstRs[j].getChoices();
+ CharSequence[] secondCs = secondRs[j].getChoices();
+ if (firstCs == null) {
+ firstCs = new CharSequence[0];
+ }
+ if (secondCs == null) {
+ secondCs = new CharSequence[0];
+ }
+ if (firstCs.length != secondCs.length) {
+ return true;
+ }
+ for (int k = 0; k < firstCs.length; k++) {
+ if (!Objects.equals(firstCs[k], secondCs[k])) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @hide
+ */
+ public static boolean areStyledNotificationsVisiblyDifferent(Builder first, Builder second) {
+ if (first.getStyle() == null) {
+ return second.getStyle() != null;
+ }
+ if (second.getStyle() == null) {
+ return true;
+ }
+ return first.getStyle().areNotificationsVisiblyDifferent(second.getStyle());
+ }
+
+ /**
+ * @hide
+ */
+ public static boolean areRemoteViewsChanged(Builder first, Builder second) {
+ return !first.usesStandardHeader() || !second.usesStandardHeader();
+ }
+
+ /**
* Parcelling creates multiple copies of objects in {@code extras}. Fix them.
* <p>
* For backwards compatibility {@code extras} holds some references to "real" member data such
@@ -3043,7 +3118,6 @@ public class Notification implements Parcelable
private int mActionBarColor = COLOR_INVALID;
private int mBackgroundColor = COLOR_INVALID;
private int mForegroundColor = COLOR_INVALID;
- private int mBackgroundColorHint = COLOR_INVALID;
/**
* A temporary location where actions are stored. If != null the view originally has action
* but doesn't have any for this inflation.
@@ -4039,6 +4113,13 @@ public class Notification implements Parcelable
}
/**
+ * Returns the style set by {@link #setStyle(Style)}.
+ */
+ public Style getStyle() {
+ return mStyle;
+ }
+
+ /**
* Specify the value of {@link #visibility}.
*
* @return The same Builder.
@@ -4305,8 +4386,7 @@ public class Notification implements Parcelable
backgroundColor);
mSecondaryTextColor = NotificationColorUtil.resolveSecondaryColor(mContext,
backgroundColor);
- if (backgroundColor != COLOR_DEFAULT
- && (mBackgroundColorHint != COLOR_INVALID || isColorized())) {
+ if (backgroundColor != COLOR_DEFAULT && isColorized()) {
mPrimaryTextColor = NotificationColorUtil.findAlphaToMeetContrast(
mPrimaryTextColor, backgroundColor, 4.5);
mSecondaryTextColor = NotificationColorUtil.findAlphaToMeetContrast(
@@ -4513,21 +4593,13 @@ public class Notification implements Parcelable
}
private void bindExpandButton(RemoteViews contentView) {
- int color = getPrimaryHighlightColor();
+ int color = isColorized() ? getPrimaryTextColor() : getSecondaryTextColor();
contentView.setDrawableTint(R.id.expand_button, false, color,
PorterDuff.Mode.SRC_ATOP);
contentView.setInt(R.id.notification_header, "setOriginalNotificationColor",
color);
}
- /**
- * @return the color that is used as the first primary highlight color. This is applied
- * in several places like the action buttons or the app name in the header.
- */
- private int getPrimaryHighlightColor() {
- return isColorized() ? getPrimaryTextColor() : resolveContrastColor();
- }
-
private void bindHeaderChronometerAndTime(RemoteViews contentView) {
if (showsTimeOrChronometer()) {
contentView.setViewVisibility(R.id.time_divider, View.VISIBLE);
@@ -4624,7 +4696,7 @@ public class Notification implements Parcelable
setTextViewColorPrimary(contentView, R.id.app_name_text);
} else {
contentView.setTextColor(R.id.app_name_text,
- ambient ? resolveAmbientColor() : resolveContrastColor());
+ ambient ? resolveAmbientColor() : getSecondaryTextColor());
}
}
@@ -5152,7 +5224,14 @@ public class Notification implements Parcelable
private void processSmallIconColor(Icon smallIcon, RemoteViews contentView,
boolean ambient) {
boolean colorable = !isLegacy() || getColorUtil().isGrayscaleIcon(mContext, smallIcon);
- int color = ambient ? resolveAmbientColor() : getPrimaryHighlightColor();
+ int color;
+ if (ambient) {
+ color = resolveAmbientColor();
+ } else if (isColorized()) {
+ color = getPrimaryTextColor();
+ } else {
+ color = resolveContrastColor();
+ }
if (colorable) {
contentView.setDrawableTint(R.id.icon, false, color,
PorterDuff.Mode.SRC_ATOP);
@@ -5188,14 +5267,11 @@ public class Notification implements Parcelable
}
int color;
- int background = mBackgroundColorHint;
- if (mBackgroundColorHint == COLOR_INVALID) {
- background = mContext.getColor(
- com.android.internal.R.color.notification_material_background_color);
- }
+ int background = mContext.getColor(
+ com.android.internal.R.color.notification_material_background_color);
if (mN.color == COLOR_DEFAULT) {
ensureColors();
- color = mSecondaryTextColor;
+ color = NotificationColorUtil.resolveDefaultColor(mContext, background);
} else {
color = NotificationColorUtil.resolveContrastColor(mContext, mN.color,
background, mInNightMode);
@@ -5435,8 +5511,7 @@ public class Notification implements Parcelable
if (isColorized()) {
return mBackgroundColor != COLOR_INVALID ? mBackgroundColor : mN.color;
} else {
- return mBackgroundColorHint != COLOR_INVALID ? mBackgroundColorHint
- : COLOR_DEFAULT;
+ return COLOR_DEFAULT;
}
}
@@ -5473,18 +5548,6 @@ public class Notification implements Parcelable
}
/**
- * Sets the background color for this notification to be a different one then the default.
- * This is mainly used to calculate contrast and won't necessarily be applied to the
- * background.
- *
- * @hide
- */
- public void setBackgroundColorHint(int backgroundColor) {
- mBackgroundColorHint = backgroundColor;
- }
-
-
- /**
* Forces all styled remoteViews to be built from scratch and not use any cached
* RemoteViews.
* This is needed for legacy apps that are baking in their remoteviews into the
@@ -5495,6 +5558,24 @@ public class Notification implements Parcelable
public void setRebuildStyledRemoteViews(boolean rebuild) {
mRebuildStyledRemoteViews = rebuild;
}
+
+ /**
+ * Get the text that should be displayed in the statusBar when heads upped. This is
+ * usually just the app name, but may be different depending on the style.
+ *
+ * @param publicMode If true, return a text that is safe to display in public.
+ *
+ * @hide
+ */
+ public CharSequence getHeadsUpStatusBarText(boolean publicMode) {
+ if (mStyle != null && !publicMode) {
+ CharSequence text = mStyle.getHeadsUpStatusBarText();
+ if (!TextUtils.isEmpty(text)) {
+ return text;
+ }
+ }
+ return loadHeaderAppName();
+ }
}
/**
@@ -5867,6 +5948,21 @@ public class Notification implements Parcelable
*/
public void validate(Context context) {
}
+
+ /**
+ * @hide
+ */
+ public abstract boolean areNotificationsVisiblyDifferent(Style other);
+
+ /**
+ * @return the the text that should be displayed in the statusBar when heads-upped.
+ * If {@code null} is returned, the default implementation will be used.
+ *
+ * @hide
+ */
+ public CharSequence getHeadsUpStatusBarText() {
+ return null;
+ }
}
/**
@@ -5920,6 +6016,13 @@ public class Notification implements Parcelable
}
/**
+ * @hide
+ */
+ public Bitmap getBigPicture() {
+ return mPicture;
+ }
+
+ /**
* Provide the bitmap to be used as the payload for the BigPicture notification.
*/
public BigPictureStyle bigPicture(Bitmap b) {
@@ -6059,6 +6162,18 @@ public class Notification implements Parcelable
public boolean hasSummaryInHeader() {
return false;
}
+
+ /**
+ * @hide
+ */
+ @Override
+ public boolean areNotificationsVisiblyDifferent(Style other) {
+ if (other == null || getClass() != other.getClass()) {
+ return true;
+ }
+ BigPictureStyle otherS = (BigPictureStyle) other;
+ return !Objects.equals(getBigPicture(), otherS.getBigPicture());
+ }
}
/**
@@ -6122,6 +6237,13 @@ public class Notification implements Parcelable
/**
* @hide
*/
+ public CharSequence getBigText() {
+ return mBigText;
+ }
+
+ /**
+ * @hide
+ */
public void addExtras(Bundle extras) {
super.addExtras(extras);
@@ -6191,6 +6313,18 @@ public class Notification implements Parcelable
return contentView;
}
+ /**
+ * @hide
+ */
+ @Override
+ public boolean areNotificationsVisiblyDifferent(Style other) {
+ if (other == null || getClass() != other.getClass()) {
+ return true;
+ }
+ BigTextStyle newS = (BigTextStyle) other;
+ return !Objects.equals(getBigText(), newS.getBigText());
+ }
+
static void applyBigTextContentView(Builder builder,
RemoteViews contentView, CharSequence bigTextText) {
contentView.setTextViewText(R.id.big_text, builder.processTextSpans(bigTextText));
@@ -6278,6 +6412,23 @@ public class Notification implements Parcelable
}
/**
+ * @return the the text that should be displayed in the statusBar when heads upped.
+ * If {@code null} is returned, the default implementation will be used.
+ *
+ * @hide
+ */
+ @Override
+ public CharSequence getHeadsUpStatusBarText() {
+ CharSequence conversationTitle = !TextUtils.isEmpty(super.mBigContentTitle)
+ ? super.mBigContentTitle
+ : mConversationTitle;
+ if (!TextUtils.isEmpty(conversationTitle) && !hasOnlyWhiteSpaceSenders()) {
+ return conversationTitle;
+ }
+ return null;
+ }
+
+ /**
* @return the user to be displayed for any replies sent by the user
*/
public Person getUser() {
@@ -6533,6 +6684,58 @@ public class Notification implements Parcelable
return remoteViews;
}
+ /**
+ * @hide
+ */
+ @Override
+ public boolean areNotificationsVisiblyDifferent(Style other) {
+ if (other == null || getClass() != other.getClass()) {
+ return true;
+ }
+ MessagingStyle newS = (MessagingStyle) other;
+ List<MessagingStyle.Message> oldMs = getMessages();
+ List<MessagingStyle.Message> newMs = newS.getMessages();
+
+ if (oldMs == null) {
+ oldMs = new ArrayList<>();
+ }
+ if (newMs == null) {
+ newMs = new ArrayList<>();
+ }
+
+ int n = oldMs.size();
+ if (n != newMs.size()) {
+ return true;
+ }
+ for (int i = 0; i < n; i++) {
+ MessagingStyle.Message oldM = oldMs.get(i);
+ MessagingStyle.Message newM = newMs.get(i);
+ if (!Objects.equals(oldM.getText(), newM.getText())) {
+ return true;
+ }
+ if (!Objects.equals(oldM.getDataUri(), newM.getDataUri())) {
+ return true;
+ }
+ CharSequence oldSender = oldM.getSenderPerson() == null ? oldM.getSender()
+ : oldM.getSenderPerson().getName();
+ CharSequence newSender = newM.getSenderPerson() == null ? newM.getSender()
+ : newM.getSenderPerson().getName();
+ if (!Objects.equals(oldSender, newSender)) {
+ return true;
+ }
+
+ String oldKey = oldM.getSenderPerson() == null
+ ? null : oldM.getSenderPerson().getKey();
+ String newKey = newM.getSenderPerson() == null
+ ? null : newM.getSenderPerson().getKey();
+ if (!Objects.equals(oldKey, newKey)) {
+ return true;
+ }
+ // Other fields (like timestamp) intentionally excluded
+ }
+ return false;
+ }
+
private Message findLatestIncomingMessage() {
return findLatestIncomingMessage(mMessages);
}
@@ -6964,6 +7167,13 @@ public class Notification implements Parcelable
/**
* @hide
*/
+ public ArrayList<CharSequence> getLines() {
+ return mTexts;
+ }
+
+ /**
+ * @hide
+ */
public void addExtras(Bundle extras) {
super.addExtras(extras);
@@ -7042,6 +7252,18 @@ public class Notification implements Parcelable
return contentView;
}
+ /**
+ * @hide
+ */
+ @Override
+ public boolean areNotificationsVisiblyDifferent(Style other) {
+ if (other == null || getClass() != other.getClass()) {
+ return true;
+ }
+ InboxStyle newS = (InboxStyle) other;
+ return !Objects.equals(getLines(), newS.getLines());
+ }
+
private void handleInboxImageMargin(RemoteViews contentView, int id, boolean first) {
int endMargin = 0;
if (first) {
@@ -7205,6 +7427,18 @@ public class Notification implements Parcelable
}
}
+ /**
+ * @hide
+ */
+ @Override
+ public boolean areNotificationsVisiblyDifferent(Style other) {
+ if (other == null || getClass() != other.getClass()) {
+ return true;
+ }
+ // All fields to compare are on the Notification object
+ return false;
+ }
+
private RemoteViews generateMediaActionButton(Action action, int color) {
final boolean tombstone = (action.actionIntent == null);
RemoteViews button = new BuilderRemoteViews(mBuilder.mContext.getApplicationInfo(),
@@ -7245,8 +7479,7 @@ public class Notification implements Parcelable
}
final Action action = mBuilder.mActions.get(mActionsToShowInCompact[i]);
- final RemoteViews button = generateMediaActionButton(action,
- getPrimaryHighlightColor());
+ final RemoteViews button = generateMediaActionButton(action, getActionColor());
view.addView(com.android.internal.R.id.media_actions, button);
}
}
@@ -7260,8 +7493,9 @@ public class Notification implements Parcelable
return view;
}
- private int getPrimaryHighlightColor() {
- return mBuilder.getPrimaryHighlightColor();
+ private int getActionColor() {
+ return mBuilder.isColorized() ? mBuilder.getPrimaryTextColor()
+ : mBuilder.resolveContrastColor();
}
private RemoteViews makeMediaBigContentView() {
@@ -7281,7 +7515,7 @@ public class Notification implements Parcelable
big.removeAllViews(com.android.internal.R.id.media_actions);
for (int i = 0; i < actionCount; i++) {
final RemoteViews button = generateMediaActionButton(mBuilder.mActions.get(i),
- getPrimaryHighlightColor());
+ getActionColor());
big.addView(com.android.internal.R.id.media_actions, button);
}
}
@@ -7414,6 +7648,18 @@ public class Notification implements Parcelable
}
remoteViews.setViewLayoutMarginEndDimen(R.id.notification_main_column, endMargin);
}
+
+ /**
+ * @hide
+ */
+ @Override
+ public boolean areNotificationsVisiblyDifferent(Style other) {
+ if (other == null || getClass() != other.getClass()) {
+ return true;
+ }
+ // Comparison done for all custom RemoteViews, independent of style
+ return false;
+ }
}
/**
@@ -7504,6 +7750,18 @@ public class Notification implements Parcelable
return makeBigContentViewWithCustomContent(customRemoteView);
}
+ /**
+ * @hide
+ */
+ @Override
+ public boolean areNotificationsVisiblyDifferent(Style other) {
+ if (other == null || getClass() != other.getClass()) {
+ return true;
+ }
+ // Comparison done for all custom RemoteViews, independent of style
+ return false;
+ }
+
private RemoteViews buildIntoRemoteView(RemoteViews remoteViews, int id,
RemoteViews customContent) {
if (customContent != null) {
diff --git a/core/java/android/app/RemoteInput.java b/core/java/android/app/RemoteInput.java
index b7100e6f4d87..6feb38e9d791 100644
--- a/core/java/android/app/RemoteInput.java
+++ b/core/java/android/app/RemoteInput.java
@@ -16,6 +16,7 @@
package android.app;
+import android.annotation.IntDef;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.Intent;
@@ -25,6 +26,8 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArraySet;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@@ -74,9 +77,14 @@ public final class RemoteInput implements Parcelable {
private static final String EXTRA_DATA_TYPE_RESULTS_DATA =
"android.remoteinput.dataTypeResultsData";
- /** Extra added to a clip data intent object identifying the source of the results. */
+ /** Extra added to a clip data intent object identifying the {@link Source} of the results. */
private static final String EXTRA_RESULTS_SOURCE = "android.remoteinput.resultsSource";
+ /** @hide */
+ @IntDef(prefix = {"SOURCE_"}, value = {SOURCE_FREE_FORM_INPUT, SOURCE_CHOICE})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Source {}
+
/** The user manually entered the data. */
public static final int SOURCE_FREE_FORM_INPUT = 0;
@@ -437,10 +445,9 @@ public final class RemoteInput implements Parcelable {
*
* @param intent The intent to add remote input source to. The {@link ClipData}
* field of the intent will be modified to contain the source.
- * field of the intent will be modified to contain the source.
* @param source The source of the results.
*/
- public static void setResultsSource(Intent intent, int source) {
+ public static void setResultsSource(Intent intent, @Source int source) {
Intent clipDataIntent = getClipDataIntentFromIntent(intent);
if (clipDataIntent == null) {
clipDataIntent = new Intent(); // First time we've added a result.
@@ -460,6 +467,7 @@ public final class RemoteInput implements Parcelable {
* @return The source of the results. If no source was set, {@link #SOURCE_FREE_FORM_INPUT} will
* be returned.
*/
+ @Source
public static int getResultsSource(Intent intent) {
Intent clipDataIntent = getClipDataIntentFromIntent(intent);
if (clipDataIntent == null) {
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 02e77df7a1ba..4cb7f89cec5c 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -8877,15 +8877,20 @@ public class DevicePolicyManager {
* <p>If backups were disabled and a non-null backup transport {@link ComponentName} is
* specified, backups will be enabled.
*
+ * <p>NOTE: The method shouldn't be called on the main thread.
+ *
* @param admin admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param backupTransportComponent The backup transport layer to be used for mandatory backups.
+ * @return {@code true} if the backup transport was successfully set; {@code false} otherwise.
* @throws SecurityException if {@code admin} is not a device owner.
*/
- public void setMandatoryBackupTransport(
- @NonNull ComponentName admin, @Nullable ComponentName backupTransportComponent) {
+ @WorkerThread
+ public boolean setMandatoryBackupTransport(
+ @NonNull ComponentName admin,
+ @Nullable ComponentName backupTransportComponent) {
throwIfParentInstance("setMandatoryBackupTransport");
try {
- mService.setMandatoryBackupTransport(admin, backupTransportComponent);
+ return mService.setMandatoryBackupTransport(admin, backupTransportComponent);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index c29369fe96a8..c46402faa07b 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -364,7 +364,7 @@ interface IDevicePolicyManager {
void setBackupServiceEnabled(in ComponentName admin, boolean enabled);
boolean isBackupServiceEnabled(in ComponentName admin);
- void setMandatoryBackupTransport(in ComponentName admin, in ComponentName backupTransportComponent);
+ boolean setMandatoryBackupTransport(in ComponentName admin, in ComponentName backupTransportComponent);
ComponentName getMandatoryBackupTransport();
void setNetworkLoggingEnabled(in ComponentName admin, boolean enabled);
diff --git a/core/java/android/app/job/JobParameters.java b/core/java/android/app/job/JobParameters.java
index c71bf2e65731..d67f11bb6c2b 100644
--- a/core/java/android/app/job/JobParameters.java
+++ b/core/java/android/app/job/JobParameters.java
@@ -36,15 +36,16 @@ import android.os.RemoteException;
public class JobParameters implements Parcelable {
/** @hide */
- public static final int REASON_CANCELED = 0;
+ public static final int REASON_CANCELED = JobProtoEnums.STOP_REASON_CANCELLED; // 0.
/** @hide */
- public static final int REASON_CONSTRAINTS_NOT_SATISFIED = 1;
+ public static final int REASON_CONSTRAINTS_NOT_SATISFIED =
+ JobProtoEnums.STOP_REASON_CONSTRAINTS_NOT_SATISFIED; //1.
/** @hide */
- public static final int REASON_PREEMPT = 2;
+ public static final int REASON_PREEMPT = JobProtoEnums.STOP_REASON_PREEMPT; // 2.
/** @hide */
- public static final int REASON_TIMEOUT = 3;
+ public static final int REASON_TIMEOUT = JobProtoEnums.STOP_REASON_TIMEOUT; // 3.
/** @hide */
- public static final int REASON_DEVICE_IDLE = 4;
+ public static final int REASON_DEVICE_IDLE = JobProtoEnums.STOP_REASON_DEVICE_IDLE; // 4.
/** @hide */
public static String getReasonName(int reason) {
diff --git a/core/java/android/app/servertransaction/StopActivityItem.java b/core/java/android/app/servertransaction/StopActivityItem.java
index 0a61fab2a8ea..8db38d36c57e 100644
--- a/core/java/android/app/servertransaction/StopActivityItem.java
+++ b/core/java/android/app/servertransaction/StopActivityItem.java
@@ -39,7 +39,7 @@ public class StopActivityItem extends ActivityLifecycleItem {
PendingTransactionActions pendingActions) {
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
client.handleStopActivity(token, mShowWindow, mConfigChanges, pendingActions,
- "STOP_ACTIVITY_ITEM");
+ true /* finalStateRequest */, "STOP_ACTIVITY_ITEM");
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
diff --git a/core/java/android/app/servertransaction/TransactionExecutor.java b/core/java/android/app/servertransaction/TransactionExecutor.java
index 0d995e866512..553c3ae15387 100644
--- a/core/java/android/app/servertransaction/TransactionExecutor.java
+++ b/core/java/android/app/servertransaction/TransactionExecutor.java
@@ -204,7 +204,8 @@ public class TransactionExecutor {
break;
case ON_STOP:
mTransactionHandler.handleStopActivity(r.token, false /* show */,
- 0 /* configChanges */, mPendingActions, "LIFECYCLER_STOP_ACTIVITY");
+ 0 /* configChanges */, mPendingActions, false /* finalStateRequest */,
+ "LIFECYCLER_STOP_ACTIVITY");
break;
case ON_DESTROY:
mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */,
diff --git a/core/java/android/app/servertransaction/TransactionExecutorHelper.java b/core/java/android/app/servertransaction/TransactionExecutorHelper.java
index 7e66fd7a2ead..01b13a28aed1 100644
--- a/core/java/android/app/servertransaction/TransactionExecutorHelper.java
+++ b/core/java/android/app/servertransaction/TransactionExecutorHelper.java
@@ -26,7 +26,7 @@ import static android.app.servertransaction.ActivityLifecycleItem.ON_STOP;
import static android.app.servertransaction.ActivityLifecycleItem.PRE_ON_CREATE;
import static android.app.servertransaction.ActivityLifecycleItem.UNDEFINED;
-import android.app.ActivityThread;
+import android.app.ActivityThread.ActivityClientRecord;
import android.util.IntArray;
import com.android.internal.annotations.VisibleForTesting;
@@ -124,7 +124,7 @@ public class TransactionExecutorHelper {
* {@link ActivityLifecycleItem#UNDEFINED} if there is not path.
*/
@VisibleForTesting
- public int getClosestPreExecutionState(ActivityThread.ActivityClientRecord r,
+ public int getClosestPreExecutionState(ActivityClientRecord r,
int postExecutionState) {
switch (postExecutionState) {
case UNDEFINED:
@@ -147,7 +147,7 @@ public class TransactionExecutorHelper {
* were provided or there is not path.
*/
@VisibleForTesting
- public int getClosestOfStates(ActivityThread.ActivityClientRecord r, int[] finalStates) {
+ public int getClosestOfStates(ActivityClientRecord r, int[] finalStates) {
if (finalStates == null || finalStates.length == 0) {
return UNDEFINED;
}
@@ -168,6 +168,27 @@ public class TransactionExecutorHelper {
return closestState;
}
+ /** Get the lifecycle state request to match the current state in the end of a transaction. */
+ public static ActivityLifecycleItem getLifecycleRequestForCurrentState(ActivityClientRecord r) {
+ final int prevState = r.getLifecycleState();
+ final ActivityLifecycleItem lifecycleItem;
+ switch (prevState) {
+ // TODO(lifecycler): Extend to support all possible states.
+ case ON_PAUSE:
+ lifecycleItem = PauseActivityItem.obtain();
+ break;
+ case ON_STOP:
+ lifecycleItem = StopActivityItem.obtain(r.isVisibleFromServer(),
+ 0 /* configChanges */);
+ break;
+ default:
+ lifecycleItem = ResumeActivityItem.obtain(false /* isForward */);
+ break;
+ }
+
+ return lifecycleItem;
+ }
+
/**
* Check if there is a destruction involved in the path. We want to avoid a lifecycle sequence
* that involves destruction and recreation if there is another path.
diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java
index d6f23521bf3c..61679cb4d631 100644
--- a/core/java/android/app/slice/Slice.java
+++ b/core/java/android/app/slice/Slice.java
@@ -66,10 +66,27 @@ public final class Slice implements Parcelable {
HINT_HORIZONTAL,
HINT_PARTIAL,
HINT_SEE_MORE,
- HINT_KEY_WORDS
+ HINT_KEY_WORDS,
+ HINT_ERROR,
})
@Retention(RetentionPolicy.SOURCE)
public @interface SliceHint {}
+ /**
+ * @hide
+ */
+ @StringDef(prefix = { "SUBTYPE_" }, value = {
+ SUBTYPE_COLOR,
+ SUBTYPE_CONTENT_DESCRIPTION,
+ SUBTYPE_MAX,
+ SUBTYPE_MESSAGE,
+ SUBTYPE_PRIORITY,
+ SUBTYPE_RANGE,
+ SUBTYPE_SOURCE,
+ SUBTYPE_TOGGLE,
+ SUBTYPE_VALUE,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SliceSubtype {}
/**
* Hint that this content is a title of other content in the slice. This can also indicate that
@@ -149,9 +166,14 @@ public final class Slice implements Parcelable {
/**
* A hint to indicate that the contents of this subslice represent a list of keywords
* related to the parent slice.
+ * Expected to be on an item of format {@link SliceItem#FORMAT_SLICE}.
*/
public static final String HINT_KEY_WORDS = "key_words";
/**
+ * A hint to indicate that this slice represents an error.
+ */
+ public static final String HINT_ERROR = "error";
+ /**
* Key to retrieve an extra added to an intent when a control is changed.
*/
public static final String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
@@ -168,14 +190,18 @@ public final class Slice implements Parcelable {
/**
* Subtype to indicate that this is a message as part of a communication
* sequence in this slice.
+ * Expected to be on an item of format {@link SliceItem#FORMAT_SLICE}.
*/
public static final String SUBTYPE_MESSAGE = "message";
/**
* Subtype to tag the source (i.e. sender) of a {@link #SUBTYPE_MESSAGE}.
+ * Expected to be on an item of format {@link SliceItem#FORMAT_TEXT},
+ * {@link SliceItem#FORMAT_IMAGE} or an {@link SliceItem#FORMAT_SLICE} containing them.
*/
public static final String SUBTYPE_SOURCE = "source";
/**
* Subtype to tag an item as representing a color.
+ * Expected to be on an item of format {@link SliceItem#FORMAT_INT}.
*/
public static final String SUBTYPE_COLOR = "color";
/**
@@ -186,14 +212,18 @@ public final class Slice implements Parcelable {
public static final String SUBTYPE_SLIDER = "slider";
/**
* Subtype to tag an item as representing a range.
+ * Expected to be on an item of format {@link SliceItem#FORMAT_SLICE} containing
+ * a {@link #SUBTYPE_VALUE} and possibly a {@link #SUBTYPE_MAX}.
*/
public static final String SUBTYPE_RANGE = "range";
/**
* Subtype to tag an item as representing the max int value for a {@link #SUBTYPE_RANGE}.
+ * Expected to be on an item of format {@link SliceItem#FORMAT_INT}.
*/
public static final String SUBTYPE_MAX = "max";
/**
* Subtype to tag an item as representing the current int value for a {@link #SUBTYPE_RANGE}.
+ * Expected to be on an item of format {@link SliceItem#FORMAT_INT}.
*/
public static final String SUBTYPE_VALUE = "value";
/**
@@ -205,10 +235,12 @@ public final class Slice implements Parcelable {
public static final String SUBTYPE_TOGGLE = "toggle";
/**
* Subtype to tag an item representing priority.
+ * Expected to be on an item of format {@link SliceItem#FORMAT_INT}.
*/
public static final String SUBTYPE_PRIORITY = "priority";
/**
* Subtype to tag an item to use as a content description.
+ * Expected to be on an item of format {@link SliceItem#FORMAT_TEXT}.
*/
public static final String SUBTYPE_CONTENT_DESCRIPTION = "content_description";
@@ -305,14 +337,24 @@ public final class Slice implements Parcelable {
private SliceSpec mSpec;
/**
- * Create a builder which will construct a {@link Slice} for the Given Uri.
- * @param uri Uri to tag for this slice.
+ * @deprecated TO BE REMOVED
*/
+ @Deprecated
public Builder(@NonNull Uri uri) {
mUri = uri;
}
/**
+ * Create a builder which will construct a {@link Slice} for the given Uri.
+ * @param uri Uri to tag for this slice.
+ * @param spec the spec for this slice.
+ */
+ public Builder(@NonNull Uri uri, SliceSpec spec) {
+ mUri = uri;
+ mSpec = spec;
+ }
+
+ /**
* Create a builder for a {@link Slice} that is a sub-slice of the slice
* being constructed by the provided builder.
* @param parent The builder constructing the parent slice
@@ -340,20 +382,13 @@ public final class Slice implements Parcelable {
/**
* Add hints to the Slice being constructed
*/
- public Builder addHints(@SliceHint String... hints) {
- mHints.addAll(Arrays.asList(hints));
- return this;
- }
-
- /**
- * Add hints to the Slice being constructed
- */
public Builder addHints(@SliceHint List<String> hints) {
- return addHints(hints.toArray(new String[hints.size()]));
+ mHints.addAll(hints);
+ return this;
}
/**
- * Add the spec for this slice.
+ * @deprecated TO BE REMOVED
*/
public Builder setSpec(SliceSpec spec) {
mSpec = spec;
@@ -362,17 +397,10 @@ public final class Slice implements Parcelable {
/**
* Add a sub-slice to the slice being constructed
- */
- public Builder addSubSlice(@NonNull Slice slice) {
- return addSubSlice(slice, null);
- }
-
- /**
- * Add a sub-slice to the slice being constructed
* @param subType Optional template-specific type information
* @see {@link SliceItem#getSubType()}
*/
- public Builder addSubSlice(@NonNull Slice slice, @Nullable String subType) {
+ public Builder addSubSlice(@NonNull Slice slice, @Nullable @SliceSubtype String subType) {
mItems.add(new SliceItem(slice, SliceItem.FORMAT_SLICE, subType,
slice.getHints().toArray(new String[slice.getHints().size()])));
return this;
@@ -380,18 +408,11 @@ public final class Slice implements Parcelable {
/**
* Add an action to the slice being constructed
- */
- public Slice.Builder addAction(@NonNull PendingIntent action, @NonNull Slice s) {
- return addAction(action, s, null);
- }
-
- /**
- * Add an action to the slice being constructed
* @param subType Optional template-specific type information
* @see {@link SliceItem#getSubType()}
*/
public Slice.Builder addAction(@NonNull PendingIntent action, @NonNull Slice s,
- @Nullable String subType) {
+ @Nullable @SliceSubtype String subType) {
List<String> hints = s.getHints();
s.mSpec = null;
mItems.add(new SliceItem(action, s, SliceItem.FORMAT_ACTION, subType, hints.toArray(
@@ -404,58 +425,31 @@ public final class Slice implements Parcelable {
* @param subType Optional template-specific type information
* @see {@link SliceItem#getSubType()}
*/
- public Builder addText(CharSequence text, @Nullable String subType,
- @SliceHint String... hints) {
+ public Builder addText(CharSequence text, @Nullable @SliceSubtype String subType,
+ @SliceHint List<String> hints) {
mItems.add(new SliceItem(text, SliceItem.FORMAT_TEXT, subType, hints));
return this;
}
/**
- * Add text to the slice being constructed
- * @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
- */
- public Builder addText(CharSequence text, @Nullable String subType,
- @SliceHint List<String> hints) {
- return addText(text, subType, hints.toArray(new String[hints.size()]));
- }
-
- /**
* Add an image to the slice being constructed
* @param subType Optional template-specific type information
* @see {@link SliceItem#getSubType()}
*/
- public Builder addIcon(Icon icon, @Nullable String subType, @SliceHint String... hints) {
+ public Builder addIcon(Icon icon, @Nullable @SliceSubtype String subType,
+ @SliceHint List<String> hints) {
mItems.add(new SliceItem(icon, SliceItem.FORMAT_IMAGE, subType, hints));
return this;
}
/**
- * Add an image to the slice being constructed
- * @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
- */
- public Builder addIcon(Icon icon, @Nullable String subType, @SliceHint List<String> hints) {
- return addIcon(icon, subType, hints.toArray(new String[hints.size()]));
- }
-
- /**
* Add remote input to the slice being constructed
* @param subType Optional template-specific type information
* @see {@link SliceItem#getSubType()}
*/
- public Slice.Builder addRemoteInput(RemoteInput remoteInput, @Nullable String subType,
+ public Slice.Builder addRemoteInput(RemoteInput remoteInput,
+ @Nullable @SliceSubtype String subType,
@SliceHint List<String> hints) {
- return addRemoteInput(remoteInput, subType, hints.toArray(new String[hints.size()]));
- }
-
- /**
- * Add remote input to the slice being constructed
- * @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
- */
- public Slice.Builder addRemoteInput(RemoteInput remoteInput, @Nullable String subType,
- @SliceHint String... hints) {
mItems.add(new SliceItem(remoteInput, SliceItem.FORMAT_REMOTE_INPUT,
subType, hints));
return this;
@@ -466,41 +460,31 @@ public final class Slice implements Parcelable {
* @param subType Optional template-specific type information
* @see {@link SliceItem#getSubType()}
*/
- public Builder addInt(int value, @Nullable String subType, @SliceHint String... hints) {
+ public Builder addInt(int value, @Nullable @SliceSubtype String subType,
+ @SliceHint List<String> hints) {
mItems.add(new SliceItem(value, SliceItem.FORMAT_INT, subType, hints));
return this;
}
/**
- * Add an integer to the slice being constructed
- * @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
+ * @deprecated TO BE REMOVED.
*/
- public Builder addInt(int value, @Nullable String subType,
+ @Deprecated
+ public Slice.Builder addTimestamp(long time, @Nullable @SliceSubtype String subType,
@SliceHint List<String> hints) {
- return addInt(value, subType, hints.toArray(new String[hints.size()]));
+ return addLong(time, subType, hints);
}
/**
- * Add a timestamp to the slice being constructed
+ * Add a long to the slice being constructed
* @param subType Optional template-specific type information
* @see {@link SliceItem#getSubType()}
*/
- public Slice.Builder addTimestamp(long time, @Nullable String subType,
- @SliceHint String... hints) {
- mItems.add(new SliceItem(time, SliceItem.FORMAT_TIMESTAMP, subType,
- hints));
- return this;
- }
-
- /**
- * Add a timestamp to the slice being constructed
- * @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
- */
- public Slice.Builder addTimestamp(long time, @Nullable String subType,
+ public Slice.Builder addLong(long value, @Nullable @SliceSubtype String subType,
@SliceHint List<String> hints) {
- return addTimestamp(time, subType, hints.toArray(new String[hints.size()]));
+ mItems.add(new SliceItem(value, SliceItem.FORMAT_LONG, subType,
+ hints.toArray(new String[hints.size()])));
+ return this;
}
/**
@@ -510,26 +494,14 @@ public final class Slice implements Parcelable {
* @param subType Optional template-specific type information
* @see {@link SliceItem#getSubType()}
*/
- public Slice.Builder addBundle(Bundle bundle, @Nullable String subType,
- @SliceHint String... hints) {
+ public Slice.Builder addBundle(Bundle bundle, @Nullable @SliceSubtype String subType,
+ @SliceHint List<String> hints) {
mItems.add(new SliceItem(bundle, SliceItem.FORMAT_BUNDLE, subType,
hints));
return this;
}
/**
- * Add a bundle to the slice being constructed.
- * <p>Expected to be used for support library extension, should not be used for general
- * development
- * @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
- */
- public Slice.Builder addBundle(Bundle bundle, @Nullable String subType,
- @SliceHint List<String> hints) {
- return addBundle(bundle, subType, hints.toArray(new String[hints.size()]));
- }
-
- /**
* Construct the slice.
*/
public Slice build() {
diff --git a/core/java/android/app/slice/SliceItem.java b/core/java/android/app/slice/SliceItem.java
index 9eb2bb896356..019ae4926636 100644
--- a/core/java/android/app/slice/SliceItem.java
+++ b/core/java/android/app/slice/SliceItem.java
@@ -67,7 +67,7 @@ public final class SliceItem implements Parcelable {
FORMAT_IMAGE,
FORMAT_ACTION,
FORMAT_INT,
- FORMAT_TIMESTAMP,
+ FORMAT_LONG,
FORMAT_REMOTE_INPUT,
FORMAT_BUNDLE,
})
@@ -98,9 +98,14 @@ public final class SliceItem implements Parcelable {
*/
public static final String FORMAT_INT = "int";
/**
- * A {@link SliceItem} that contains a timestamp.
+ * A {@link SliceItem} that contains a long.
*/
- public static final String FORMAT_TIMESTAMP = "timestamp";
+ public static final String FORMAT_LONG = "long";
+ /**
+ * @deprecated TO BE REMOVED
+ */
+ @Deprecated
+ public static final String FORMAT_TIMESTAMP = FORMAT_LONG;
/**
* A {@link SliceItem} that contains a {@link RemoteInput}.
*/
@@ -123,6 +128,14 @@ public final class SliceItem implements Parcelable {
* @hide
*/
public SliceItem(Object obj, @SliceType String format, String subType,
+ List<String> hints) {
+ this(obj, format, subType, hints.toArray(new String[hints.size()]));
+ }
+
+ /**
+ * @hide
+ */
+ public SliceItem(Object obj, @SliceType String format, String subType,
@Slice.SliceHint String[] hints) {
mHints = hints;
mFormat = format;
diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java
index aa2cf46891d8..dd892937be71 100644
--- a/core/java/android/app/slice/SliceProvider.java
+++ b/core/java/android/app/slice/SliceProvider.java
@@ -41,6 +41,7 @@ import android.os.UserHandle;
import android.util.Log;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -430,9 +431,11 @@ public abstract class SliceProvider extends ContentProvider {
return new Slice.Builder(sliceUri)
.addAction(createPermissionIntent(context, sliceUri, callingPackage),
new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build())
- .addText(getPermissionString(context, callingPackage), null)
- .build())
- .addHints(Slice.HINT_LIST_ITEM)
+ .addText(getPermissionString(context, callingPackage), null,
+ Collections.emptyList())
+ .build(),
+ null)
+ .addHints(Arrays.asList(Slice.HINT_LIST_ITEM))
.build();
}
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index 4c7e97bcb8da..b354e8122a98 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -81,6 +81,7 @@ public final class UsageEvents implements Parcelable {
* An event type denoting that a package was interacted with in some way by the system.
* @hide
*/
+ @SystemApi
public static final int SYSTEM_INTERACTION = 6;
/**
@@ -124,6 +125,20 @@ public final class UsageEvents implements Parcelable {
@SystemApi
public static final int NOTIFICATION_INTERRUPTION = 12;
+ /**
+ * A Slice was pinned by the default launcher or the default assistant.
+ * @hide
+ */
+ @SystemApi
+ public static final int SLICE_PINNED_PRIV = 13;
+
+ /**
+ * A Slice was pinned by an app.
+ * @hide
+ */
+ @SystemApi
+ public static final int SLICE_PINNED = 14;
+
/** @hide */
public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0;
diff --git a/core/java/android/app/usage/UsageStats.java b/core/java/android/app/usage/UsageStats.java
index 7eef85c44139..2b14841fb34b 100644
--- a/core/java/android/app/usage/UsageStats.java
+++ b/core/java/android/app/usage/UsageStats.java
@@ -16,6 +16,7 @@
package android.app.usage;
+import android.annotation.SystemApi;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -61,6 +62,11 @@ public final class UsageStats implements Parcelable {
/**
* {@hide}
*/
+ public int mAppLaunchCount;
+
+ /**
+ * {@hide}
+ */
public int mLastEvent;
/**
@@ -81,6 +87,7 @@ public final class UsageStats implements Parcelable {
mLastTimeUsed = stats.mLastTimeUsed;
mTotalTimeInForeground = stats.mTotalTimeInForeground;
mLaunchCount = stats.mLaunchCount;
+ mAppLaunchCount = stats.mAppLaunchCount;
mLastEvent = stats.mLastEvent;
mChooserCounts = stats.mChooserCounts;
}
@@ -137,6 +144,16 @@ public final class UsageStats implements Parcelable {
}
/**
+ * Returns the number of times the app was launched as an activity from outside of the app.
+ * Excludes intra-app activity transitions.
+ * @hide
+ */
+ @SystemApi
+ public int getAppLaunchCount() {
+ return mAppLaunchCount;
+ }
+
+ /**
* Add the statistics from the right {@link UsageStats} to the left. The package name for
* both {@link UsageStats} objects must be the same.
* @param right The {@link UsageStats} object to merge into this one.
@@ -161,6 +178,7 @@ public final class UsageStats implements Parcelable {
mEndTimeStamp = Math.max(mEndTimeStamp, right.mEndTimeStamp);
mTotalTimeInForeground += right.mTotalTimeInForeground;
mLaunchCount += right.mLaunchCount;
+ mAppLaunchCount += right.mAppLaunchCount;
if (mChooserCounts == null) {
mChooserCounts = right.mChooserCounts;
} else if (right.mChooserCounts != null) {
@@ -196,6 +214,7 @@ public final class UsageStats implements Parcelable {
dest.writeLong(mLastTimeUsed);
dest.writeLong(mTotalTimeInForeground);
dest.writeInt(mLaunchCount);
+ dest.writeInt(mAppLaunchCount);
dest.writeInt(mLastEvent);
Bundle allCounts = new Bundle();
if (mChooserCounts != null) {
@@ -224,6 +243,7 @@ public final class UsageStats implements Parcelable {
stats.mLastTimeUsed = in.readLong();
stats.mTotalTimeInForeground = in.readLong();
stats.mLaunchCount = in.readInt();
+ stats.mAppLaunchCount = in.readInt();
stats.mLastEvent = in.readInt();
Bundle allCounts = in.readBundle();
if (allCounts != null) {
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 59f001c5a7c3..47441476f95b 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -17,6 +17,7 @@
package android.app.usage;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
@@ -107,25 +108,35 @@ public final class UsageStatsManager {
public static final int STANDBY_BUCKET_EXEMPTED = 5;
/**
- * The app was used very recently, currently in use or likely to be used very soon.
+ * The app was used very recently, currently in use or likely to be used very soon. Standby
+ * bucket values that are &le; {@link #STANDBY_BUCKET_ACTIVE} will not be throttled by the
+ * system while they are in this bucket. Buckets &gt; {@link #STANDBY_BUCKET_ACTIVE} will most
+ * likely be restricted in some way. For instance, jobs and alarms may be deferred.
* @see #getAppStandbyBucket()
*/
public static final int STANDBY_BUCKET_ACTIVE = 10;
/**
- * The app was used recently and/or likely to be used in the next few hours.
+ * The app was used recently and/or likely to be used in the next few hours. Restrictions will
+ * apply to these apps, such as deferral of jobs and alarms.
* @see #getAppStandbyBucket()
*/
public static final int STANDBY_BUCKET_WORKING_SET = 20;
/**
* The app was used in the last few days and/or likely to be used in the next few days.
+ * Restrictions will apply to these apps, such as deferral of jobs and alarms. The delays may be
+ * greater than for apps in higher buckets (lower bucket value). Bucket values &gt;
+ * {@link #STANDBY_BUCKET_FREQUENT} may additionally have network access limited.
* @see #getAppStandbyBucket()
*/
public static final int STANDBY_BUCKET_FREQUENT = 30;
/**
* The app has not be used for several days and/or is unlikely to be used for several days.
+ * Apps in this bucket will have the most restrictions, including network restrictions, except
+ * during certain short periods (at a minimum, once a day) when they are allowed to execute
+ * jobs, access the network, etc.
* @see #getAppStandbyBucket()
*/
public static final int STANDBY_BUCKET_RARE = 40;
@@ -393,11 +404,19 @@ public final class UsageStatsManager {
/**
* Returns the current standby bucket of the calling app. The system determines the standby
* state of the app based on app usage patterns. Standby buckets determine how much an app will
- * be restricted from running background tasks such as jobs, alarms and certain PendingIntent
- * callbacks.
+ * be restricted from running background tasks such as jobs and alarms.
* <p>Restrictions increase progressively from {@link #STANDBY_BUCKET_ACTIVE} to
* {@link #STANDBY_BUCKET_RARE}, with {@link #STANDBY_BUCKET_ACTIVE} being the least
* restrictive. The battery level of the device might also affect the restrictions.
+ * <p>Apps in buckets &le; {@link #STANDBY_BUCKET_ACTIVE} have no standby restrictions imposed.
+ * Apps in buckets &gt; {@link #STANDBY_BUCKET_FREQUENT} may have network access restricted when
+ * running in the background.
+ * <p>The standby state of an app can change at any time either due to a user interaction or a
+ * system interaction or some algorithm determining that the app can be restricted for a period
+ * of time before the user has a need for it.
+ * <p>You can also query the recent history of standby bucket changes by calling
+ * {@link #queryEventsForSelf(long, long)} and searching for
+ * {@link UsageEvents.Event#STANDBY_BUCKET_CHANGED}.
*
* @return the current standby bucket of the calling app. One of STANDBY_BUCKET_* constants.
*/
@@ -500,26 +519,28 @@ public final class UsageStatsManager {
/**
* @hide
* Register an app usage limit observer that receives a callback on the provided intent when
- * the sum of usages of apps in the packages array exceeds the timeLimit specified. The
+ * the sum of usages of apps in the packages array exceeds the {@code timeLimit} specified. The
* observer will automatically be unregistered when the time limit is reached and the intent
- * is delivered.
+ * is delivered. Registering an {@code observerId} that was already registered will override
+ * the previous one.
* @param observerId A unique id associated with the group of apps to be monitored. There can
* be multiple groups with common packages and different time limits.
- * @param packages The list of packages to observe for foreground activity time. Must include
- * at least one package.
+ * @param packages The list of packages to observe for foreground activity time. Cannot be null
+ * and must include at least one package.
* @param timeLimit The total time the set of apps can be in the foreground before the
* callbackIntent is delivered. Must be greater than 0.
- * @param timeUnit The unit for time specified in timeLimit.
+ * @param timeUnit The unit for time specified in {@code timeLimit}. Cannot be null.
* @param callbackIntent The PendingIntent that will be dispatched when the time limit is
* exceeded by the group of apps. The delivered Intent will also contain
* the extras {@link #EXTRA_OBSERVER_ID}, {@link #EXTRA_TIME_LIMIT} and
- * {@link #EXTRA_TIME_USED}.
- * @throws SecurityException if the caller doesn't have the PACKAGE_USAGE_STATS permission.
+ * {@link #EXTRA_TIME_USED}. Cannot be null.
+ * @throws SecurityException if the caller doesn't have the OBSERVE_APP_USAGE permission or
+ * is not the profile owner of this user.
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)
- public void registerAppUsageObserver(int observerId, String[] packages, long timeLimit,
- TimeUnit timeUnit, PendingIntent callbackIntent) {
+ @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE)
+ public void registerAppUsageObserver(int observerId, @NonNull String[] packages, long timeLimit,
+ @NonNull TimeUnit timeUnit, @NonNull PendingIntent callbackIntent) {
try {
mService.registerAppUsageObserver(observerId, packages, timeUnit.toMillis(timeLimit),
callbackIntent, mContext.getOpPackageName());
@@ -529,14 +550,15 @@ public final class UsageStatsManager {
/**
* @hide
- * Unregister the app usage observer specified by the observerId. This will only apply to any
- * observer registered by this application. Unregistering an observer that was already
+ * Unregister the app usage observer specified by the {@code observerId}. This will only apply
+ * to any observer registered by this application. Unregistering an observer that was already
* unregistered or never registered will have no effect.
* @param observerId The id of the observer that was previously registered.
- * @throws SecurityException if the caller doesn't have the PACKAGE_USAGE_STATS permission.
+ * @throws SecurityException if the caller doesn't have the OBSERVE_APP_USAGE permission or is
+ * not the profile owner of this user.
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)
+ @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE)
public void unregisterAppUsageObserver(int observerId) {
try {
mService.unregisterAppUsageObserver(observerId, mContext.getOpPackageName());
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index b9e80e406799..ee667c220779 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -680,10 +680,6 @@ public final class BluetoothAdapter {
if (!getLeAccess()) {
return null;
}
- if (!isMultipleAdvertisementSupported()) {
- Log.e(TAG, "Bluetooth LE advertising not supported");
- return null;
- }
synchronized (mLock) {
if (sBluetoothLeAdvertiser == null) {
sBluetoothLeAdvertiser = new BluetoothLeAdvertiser(mManagerService);
diff --git a/core/java/android/bluetooth/BluetoothHearingAid.java b/core/java/android/bluetooth/BluetoothHearingAid.java
index 647e0d033fb7..8f8083ed73e2 100644
--- a/core/java/android/bluetooth/BluetoothHearingAid.java
+++ b/core/java/android/bluetooth/BluetoothHearingAid.java
@@ -17,6 +17,7 @@
package android.bluetooth;
import android.Manifest;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
@@ -379,6 +380,76 @@ public final class BluetoothHearingAid implements BluetoothProfile {
}
/**
+ * Select a connected device as active.
+ *
+ * The active device selection is per profile. An active device's
+ * purpose is profile-specific. For example, Hearing Aid audio
+ * streaming is to the active Hearing Aid device. If a remote device
+ * is not connected, it cannot be selected as active.
+ *
+ * <p> This API returns false in scenarios like the profile on the
+ * device is not connected or Bluetooth is not turned on.
+ * When this API returns true, it is guaranteed that the
+ * {@link #ACTION_ACTIVE_DEVICE_CHANGED} intent will be broadcasted
+ * with the active device.
+ *
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
+ * permission.
+ *
+ * @param device the remote Bluetooth device. Could be null to clear
+ * the active device and stop streaming audio to a Bluetooth device.
+ * @return false on immediate error, true otherwise
+ * @hide
+ */
+ public boolean setActiveDevice(@Nullable BluetoothDevice device) {
+ if (DBG) log("setActiveDevice(" + device + ")");
+ try {
+ mServiceLock.readLock().lock();
+ if (mService != null && isEnabled()
+ && ((device == null) || isValidDevice(device))) {
+ mService.setActiveDevice(device);
+ return true;
+ }
+ if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ return false;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
+ return false;
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+ }
+
+ /**
+ * Check whether the device is active.
+ *
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH}
+ * permission.
+ *
+ * @return the connected device that is active or null if no device
+ * is active
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
+ public boolean isActiveDevice(@Nullable BluetoothDevice device) {
+ if (VDBG) log("isActiveDevice()");
+ try {
+ mServiceLock.readLock().lock();
+ if (mService != null && isEnabled()
+ && ((device == null) || isValidDevice(device))) {
+ return mService.isActiveDevice(device);
+ }
+ if (mService == null) Log.w(TAG, "Proxy not attached to service");
+ return false;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
+ return false;
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+ }
+
+ /**
* Set priority of the profile
*
* <p> The device should already be paired.
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index ce7d3af8404a..440103a6d8a4 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -2464,8 +2464,9 @@ public abstract class ContentResolver {
* @param account the account to specify in the sync
* @param authority the provider to specify in the sync request
* @param extras extra parameters to go along with the sync request
- * @param pollFrequency how frequently the sync should be performed, in seconds. A minimum value
- * of 1 hour is enforced.
+ * @param pollFrequency how frequently the sync should be performed, in seconds.
+ * On Android API level 24 and above, a minmam interval of 15 minutes is enforced.
+ * On previous versions, the minimum interval is 1 hour.
* @throws IllegalArgumentException if an illegal extra was set or if any of the parameters
* are null.
*/
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 36a74a489890..f4352f976316 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -50,8 +50,8 @@ import android.content.pm.VersionedPackage;
import android.content.pm.dex.IArtManager;
import android.graphics.Bitmap;
import android.net.Uri;
-import android.os.Bundle;
import android.os.ParcelFileDescriptor;
+import android.os.PersistableBundle;
import android.content.IntentSender;
/**
@@ -272,9 +272,17 @@ interface IPackageManager {
void clearCrossProfileIntentFilters(int sourceUserId, String ownerPackage);
- String[] setPackagesSuspendedAsUser(in String[] packageNames, boolean suspended, int userId);
+ String[] setPackagesSuspendedAsUser(in String[] packageNames, boolean suspended,
+ in PersistableBundle launcherExtras, in PersistableBundle appExtras,
+ String callingPackage, int userId);
+
boolean isPackageSuspendedForUser(String packageName, int userId);
+ PersistableBundle getPackageSuspendedAppExtras(String pacakgeName, int userId);
+
+ void setSuspendedPackageAppExtras(String packageName, in PersistableBundle appExtras,
+ int userId);
+
/**
* Backup/restore support - only the system uid may use these.
*/
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index bd7961fffca8..4d8773c27d93 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -51,6 +51,7 @@ import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
+import android.os.PersistableBundle;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
@@ -4183,6 +4184,12 @@ public abstract class PackageManager {
public abstract ResolveInfo resolveService(Intent intent, @ResolveInfoFlags int flags);
/**
+ * @hide
+ */
+ public abstract ResolveInfo resolveServiceAsUser(Intent intent, @ResolveInfoFlags int flags,
+ @UserIdInt int userId);
+
+ /**
* Retrieve all services that can match the given intent.
*
* @param intent The desired intent as per resolveService().
@@ -5504,28 +5511,49 @@ public abstract class PackageManager {
/**
* Puts the package in a suspended state, where attempts at starting activities are denied.
*
- * <p>It doesn't remove the data or the actual package file. The application notifications
- * will be hidden, the application will not show up in recents, will not be able to show
- * toasts or dialogs or ring the device.
+ * <p>It doesn't remove the data or the actual package file. The application's notifications
+ * will be hidden, any of the it's started activities will be stopped and it will not be able to
+ * show toasts or dialogs or ring the device. When the user tries to launch a suspended app, a
+ * system dialog with the given {@code dialogMessage} will be shown instead.</p>
*
* <p>The package must already be installed. If the package is uninstalled while suspended
- * the package will no longer be suspended.
+ * the package will no longer be suspended. </p>
+ *
+ * <p>Optionally, the suspending app can provide extra information in the form of
+ * {@link PersistableBundle} objects to be shared with the apps being suspended and the
+ * launcher to support customization that they might need to handle the suspended state. </p>
+ *
+ * <p>The caller must hold {@link Manifest.permission#SUSPEND_APPS} or
+ * {@link Manifest.permission#MANAGE_USERS} to use this api.</p>
*
* @param packageNames The names of the packages to set the suspended status.
* @param suspended If set to {@code true} than the packages will be suspended, if set to
- * {@code false} the packages will be unsuspended.
- * @param userId The user id.
+ * {@code false}, the packages will be unsuspended.
+ * @param appExtras An optional {@link PersistableBundle} that the suspending app can provide
+ * which will be shared with the apps being suspended. Ignored if
+ * {@code suspended} is false.
+ * @param launcherExtras An optional {@link PersistableBundle} that the suspending app can
+ * provide which will be shared with the launcher. Ignored if
+ * {@code suspended} is false.
+ * @param dialogMessage The message to be displayed to the user, when they try to launch a
+ * suspended app.
*
* @return an array of package names for which the suspended status is not set as requested in
* this method.
*
* @hide
*/
- public abstract String[] setPackagesSuspendedAsUser(
- String[] packageNames, boolean suspended, @UserIdInt int userId);
+ @SystemApi
+ @RequiresPermission(anyOf = {Manifest.permission.SUSPEND_APPS,
+ Manifest.permission.MANAGE_USERS})
+ public String[] setPackagesSuspended(String[] packageNames, boolean suspended,
+ @Nullable PersistableBundle appExtras, @Nullable PersistableBundle launcherExtras,
+ String dialogMessage) {
+ throw new UnsupportedOperationException("setPackagesSuspended not implemented");
+ }
/**
- * @see #setPackageSuspendedAsUser(String, boolean, int)
+ * @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String)
* @param packageName The name of the package to get the suspended status of.
* @param userId The user id.
* @return {@code true} if the package is suspended or {@code false} if the package is not
@@ -5535,6 +5563,86 @@ public abstract class PackageManager {
public abstract boolean isPackageSuspendedForUser(String packageName, int userId);
/**
+ * Query if an app is currently suspended.
+ *
+ * @return {@code true} if the given package is suspended, {@code false} otherwise
+ *
+ * @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String)
+ * @hide
+ */
+ @SystemApi
+ public boolean isPackageSuspended(String packageName) {
+ throw new UnsupportedOperationException("isPackageSuspended not implemented");
+ }
+
+ /**
+ * Apps can query this to know if they have been suspended.
+ *
+ * @return {@code true} if the calling package has been suspended, {@code false} otherwise.
+ *
+ * @see #getSuspendedPackageAppExtras()
+ */
+ public boolean isPackageSuspended() {
+ throw new UnsupportedOperationException("isPackageSuspended not implemented");
+ }
+
+ /**
+ * Retrieve the {@link PersistableBundle} that was passed as {@code appExtras} when the given
+ * package was suspended.
+ *
+ * <p> The caller must hold permission {@link Manifest.permission#SUSPEND_APPS} to use this
+ * api.</p>
+ *
+ * @param packageName The package to retrieve extras for.
+ * @return The {@code appExtras} for the suspended package.
+ *
+ * @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String)
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.SUSPEND_APPS)
+ public PersistableBundle getSuspendedPackageAppExtras(String packageName) {
+ throw new UnsupportedOperationException("getSuspendedPackageAppExtras not implemented");
+ }
+
+ /**
+ * Set the app extras for a suspended package. This method can be used to update the appExtras
+ * for a package that was earlier suspended using
+ * {@link #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle,
+ * String)}
+ * Does nothing if the given package is not already in a suspended state.
+ *
+ * @param packageName The package for which the appExtras need to be updated
+ * @param appExtras The new appExtras for the given package
+ *
+ * @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String)
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.SUSPEND_APPS)
+ public void setSuspendedPackageAppExtras(String packageName,
+ @Nullable PersistableBundle appExtras) {
+ throw new UnsupportedOperationException("setSuspendedPackageAppExtras not implemented");
+ }
+
+ /**
+ * Returns any extra information supplied as {@code appExtras} to the system when the calling
+ * app was suspended.
+ *
+ * <p> Note: This just returns whatever {@link PersistableBundle} was passed to the system via
+ * {@code setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle,
+ * String)} when suspending the package, <em> which might be {@code null}. </em></p>
+ *
+ * @return A {@link PersistableBundle} containing the extras for the app, or {@code null} if the
+ * package is not currently suspended.
+ * @see #isPackageSuspended()
+ */
+ public @Nullable PersistableBundle getSuspendedPackageAppExtras() {
+ throw new UnsupportedOperationException("getSuspendedPackageAppExtras not implemented");
+ }
+
+ /**
* Provide a hint of what the {@link ApplicationInfo#category} value should
* be for the given package.
* <p>
diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java
index 293beb2bf7bb..f7b6e09178d7 100644
--- a/core/java/android/content/pm/PackageUserState.java
+++ b/core/java/android/content/pm/PackageUserState.java
@@ -27,6 +27,8 @@ import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
import static android.content.pm.PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
+import android.os.BaseBundle;
+import android.os.PersistableBundle;
import android.util.ArraySet;
import com.android.internal.util.ArrayUtils;
@@ -44,6 +46,9 @@ public class PackageUserState {
public boolean notLaunched;
public boolean hidden; // Is the app restricted by owner / admin
public boolean suspended;
+ public String suspendingPackage;
+ public PersistableBundle suspendedAppExtras;
+ public PersistableBundle suspendedLauncherExtras;
public boolean instantApp;
public boolean virtualPreload;
public int enabled;
@@ -76,6 +81,9 @@ public class PackageUserState {
notLaunched = o.notLaunched;
hidden = o.hidden;
suspended = o.suspended;
+ suspendingPackage = o.suspendingPackage;
+ suspendedAppExtras = o.suspendedAppExtras;
+ suspendedLauncherExtras = o.suspendedLauncherExtras;
instantApp = o.instantApp;
virtualPreload = o.virtualPreload;
enabled = o.enabled;
@@ -195,6 +203,20 @@ public class PackageUserState {
if (suspended != oldState.suspended) {
return false;
}
+ if (suspended) {
+ if (suspendingPackage == null
+ || !suspendingPackage.equals(oldState.suspendingPackage)) {
+ return false;
+ }
+ if (!BaseBundle.kindofEquals(suspendedAppExtras,
+ oldState.suspendedAppExtras)) {
+ return false;
+ }
+ if (!BaseBundle.kindofEquals(suspendedLauncherExtras,
+ oldState.suspendedLauncherExtras)) {
+ return false;
+ }
+ }
if (instantApp != oldState.instantApp) {
return false;
}
diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java
index 2a791ec9a42e..316c796f17ed 100644
--- a/core/java/android/database/sqlite/SQLiteConnection.java
+++ b/core/java/android/database/sqlite/SQLiteConnection.java
@@ -293,9 +293,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen
(mConfiguration.openFlags & SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING) != 0;
// Use compatibility WAL unless an app explicitly set journal/synchronous mode
// or DISABLE_COMPATIBILITY_WAL flag is set
- final boolean useCompatibilityWal = mConfiguration.journalMode == null
- && mConfiguration.syncMode == null
- && (mConfiguration.openFlags & SQLiteDatabase.DISABLE_COMPATIBILITY_WAL) == 0;
+ final boolean useCompatibilityWal = mConfiguration.useCompatibilityWal();
if (walEnabled || useCompatibilityWal) {
setJournalMode("WAL");
if (useCompatibilityWal && SQLiteCompatibilityWalFlags.areFlagsSet()) {
diff --git a/core/java/android/database/sqlite/SQLiteConnectionPool.java b/core/java/android/database/sqlite/SQLiteConnectionPool.java
index dadb95b7a741..e51930237527 100644
--- a/core/java/android/database/sqlite/SQLiteConnectionPool.java
+++ b/core/java/android/database/sqlite/SQLiteConnectionPool.java
@@ -23,6 +23,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.OperationCanceledException;
import android.os.SystemClock;
+import android.text.TextUtils;
import android.util.Log;
import android.util.PrefixPrinter;
import android.util.Printer;
@@ -1111,6 +1112,11 @@ public final class SQLiteConnectionPool implements Closeable {
printer.println(" Open: " + mIsOpen);
printer.println(" Max connections: " + mMaxConnectionPoolSize);
printer.println(" Total execution time: " + mTotalExecutionTimeCounter);
+ printer.println(" Configuration: openFlags=" + mConfiguration.openFlags
+ + ", useCompatibilityWal=" + mConfiguration.useCompatibilityWal()
+ + ", journalMode=" + TextUtils.emptyIfNull(mConfiguration.journalMode)
+ + ", syncMode=" + TextUtils.emptyIfNull(mConfiguration.syncMode));
+
if (SQLiteCompatibilityWalFlags.areFlagsSet()) {
printer.println(" Compatibility WAL settings: compatibility_wal_supported="
+ SQLiteCompatibilityWalFlags
diff --git a/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java
index 275043f83743..8b9dfcf51ce5 100644
--- a/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java
+++ b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java
@@ -194,6 +194,11 @@ public final class SQLiteDatabaseConfiguration {
return path.equalsIgnoreCase(MEMORY_DB_PATH);
}
+ boolean useCompatibilityWal() {
+ return journalMode == null && syncMode == null
+ && (openFlags & SQLiteDatabase.DISABLE_COMPATIBILITY_WAL) == 0;
+ }
+
private static String stripPathForLogs(String path) {
if (path.indexOf('@') == -1) {
return path;
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index d5b052e485c4..390b83fe10cf 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -1242,7 +1242,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* from the main sensor along the +X axis (to the right from the user's perspective) will
* report <code>(0.03, 0, 0)</code>.</p>
* <p>To transform a pixel coordinates between two cameras facing the same direction, first
- * the source camera {@link CameraCharacteristics#LENS_RADIAL_DISTORTION android.lens.radialDistortion} must be corrected for. Then the source
+ * the source camera {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} must be corrected for. Then the source
* camera {@link CameraCharacteristics#LENS_INTRINSIC_CALIBRATION android.lens.intrinsicCalibration} needs to be applied, followed by the
* {@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation} of the source camera, the translation of the source camera
* relative to the destination camera, the {@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation} of the destination
@@ -1256,10 +1256,10 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Units</b>: Meters</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
+ * @see CameraCharacteristics#LENS_DISTORTION
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
* @see CameraCharacteristics#LENS_POSE_REFERENCE
* @see CameraCharacteristics#LENS_POSE_ROTATION
- * @see CameraCharacteristics#LENS_RADIAL_DISTORTION
*/
@PublicKey
public static final Key<float[]> LENS_POSE_TRANSLATION =
@@ -1305,7 +1305,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* where <code>(0,0)</code> is the top-left of the
* preCorrectionActiveArraySize rectangle. Once the pose and
* intrinsic calibration transforms have been applied to a
- * world point, then the {@link CameraCharacteristics#LENS_RADIAL_DISTORTION android.lens.radialDistortion}
+ * world point, then the {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion}
* transform needs to be applied, and the result adjusted to
* be in the {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} coordinate
* system (where <code>(0, 0)</code> is the top-left of the
@@ -1318,9 +1318,9 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* coordinate system.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
+ * @see CameraCharacteristics#LENS_DISTORTION
* @see CameraCharacteristics#LENS_POSE_ROTATION
* @see CameraCharacteristics#LENS_POSE_TRANSLATION
- * @see CameraCharacteristics#LENS_RADIAL_DISTORTION
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@@ -1362,7 +1362,14 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
+ * @deprecated
+ * <p>This field was inconsistently defined in terms of its
+ * normalization. Use {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} instead.</p>
+ *
+ * @see CameraCharacteristics#LENS_DISTORTION
+
*/
+ @Deprecated
@PublicKey
public static final Key<float[]> LENS_RADIAL_DISTORTION =
new Key<float[]>("android.lens.radialDistortion", float[].class);
@@ -1387,6 +1394,46 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
new Key<Integer>("android.lens.poseReference", int.class);
/**
+ * <p>The correction coefficients to correct for this camera device's
+ * radial and tangential lens distortion.</p>
+ * <p>Replaces the deprecated {@link CameraCharacteristics#LENS_RADIAL_DISTORTION android.lens.radialDistortion} field, which was
+ * inconsistently defined.</p>
+ * <p>Three radial distortion coefficients <code>[kappa_1, kappa_2,
+ * kappa_3]</code> and two tangential distortion coefficients
+ * <code>[kappa_4, kappa_5]</code> that can be used to correct the
+ * lens's geometric distortion with the mapping equations:</p>
+ * <pre><code> x_c = x_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
+ * kappa_4 * (2 * x_i * y_i) + kappa_5 * ( r^2 + 2 * x_i^2 )
+ * y_c = y_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
+ * kappa_5 * (2 * x_i * y_i) + kappa_4 * ( r^2 + 2 * y_i^2 )
+ * </code></pre>
+ * <p>Here, <code>[x_c, y_c]</code> are the coordinates to sample in the
+ * input image that correspond to the pixel values in the
+ * corrected image at the coordinate <code>[x_i, y_i]</code>:</p>
+ * <pre><code> correctedImage(x_i, y_i) = sample_at(x_c, y_c, inputImage)
+ * </code></pre>
+ * <p>The pixel coordinates are defined in a coordinate system
+ * related to the {@link CameraCharacteristics#LENS_INTRINSIC_CALIBRATION android.lens.intrinsicCalibration}
+ * calibration fields; see that entry for details of the mapping stages.
+ * Both <code>[x_i, y_i]</code> and <code>[x_c, y_c]</code>
+ * have <code>(0,0)</code> at the lens optical center <code>[c_x, c_y]</code>, and
+ * the range of the coordinates depends on the focal length
+ * terms of the intrinsic calibration.</p>
+ * <p>Finally, <code>r</code> represents the radial distance from the
+ * optical center, <code>r^2 = x_i^2 + y_i^2</code>.</p>
+ * <p>The distortion model used is the Brown-Conrady model.</p>
+ * <p><b>Units</b>:
+ * Unitless coefficients.</p>
+ * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ *
+ * @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
+ * @see CameraCharacteristics#LENS_RADIAL_DISTORTION
+ */
+ @PublicKey
+ public static final Key<float[]> LENS_DISTORTION =
+ new Key<float[]>("android.lens.distortion", float[].class);
+
+ /**
* <p>List of noise reduction modes for {@link CaptureRequest#NOISE_REDUCTION_MODE android.noiseReduction.mode} that are supported
* by this camera device.</p>
* <p>Full-capability camera devices will always support OFF and FAST.</p>
@@ -1418,6 +1465,8 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* consideration of future support.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* @deprecated
+ * <p>Not used in HALv3 or newer; replaced by better partials mechanism</p>
+
* @hide
*/
@Deprecated
@@ -1808,6 +1857,8 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>When set to YUV_420_888, application can access the YUV420 data directly.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* @deprecated
+ * <p>Not used in HALv3 or newer</p>
+
* @hide
*/
@Deprecated
@@ -1828,6 +1879,8 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* TODO: Remove property.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* @deprecated
+ * <p>Not used in HALv3 or newer</p>
+
* @hide
*/
@Deprecated
@@ -1844,6 +1897,8 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
*
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
* @deprecated
+ * <p>Not used in HALv3 or newer</p>
+
* @hide
*/
@Deprecated
@@ -1883,6 +1938,8 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Units</b>: Nanoseconds</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* @deprecated
+ * <p>Not used in HALv3 or newer</p>
+
* @hide
*/
@Deprecated
@@ -1905,6 +1962,8 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* check if it limits the maximum size for image data.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* @deprecated
+ * <p>Not used in HALv3 or newer</p>
+
* @hide
*/
@Deprecated
@@ -2544,7 +2603,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.</p>
* <p>The currently supported fields that correct for geometric distortion are:</p>
* <ol>
- * <li>{@link CameraCharacteristics#LENS_RADIAL_DISTORTION android.lens.radialDistortion}.</li>
+ * <li>{@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion}.</li>
* </ol>
* <p>If all of the geometric distortion fields are no-ops, this rectangle will be the same
* as the post-distortion-corrected rectangle given in
@@ -2557,7 +2616,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Units</b>: Pixel coordinates on the image sensor</p>
* <p>This key is available on all devices.</p>
*
- * @see CameraCharacteristics#LENS_RADIAL_DISTORTION
+ * @see CameraCharacteristics#LENS_DISTORTION
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
* @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index 72db33f90c20..f47d4640c09c 100644
--- a/core/java/android/hardware/camera2/CameraDevice.java
+++ b/core/java/android/hardware/camera2/CameraDevice.java
@@ -819,7 +819,8 @@ public abstract class CameraDevice implements AutoCloseable {
* @param config A session configuration (see {@link SessionConfiguration}).
*
* @throws IllegalArgumentException In case the session configuration is invalid; or the output
- * configurations are empty.
+ * configurations are empty; or the session configuration
+ * executor is invalid.
* @throws CameraAccessException In case the camera device is no longer connected or has
* encountered a fatal error.
* @see #createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index a2bc91e0cda6..4d642956b135 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -25,6 +25,7 @@ import android.hardware.CameraInfo;
import android.hardware.CameraStatus;
import android.hardware.ICameraService;
import android.hardware.ICameraServiceListener;
+import android.hardware.camera2.impl.CameraDeviceImpl;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.legacy.CameraDeviceUserShim;
import android.hardware.camera2.legacy.LegacyMetadataMapper;
@@ -41,6 +42,11 @@ import android.util.ArrayMap;
import android.util.Log;
import java.util.ArrayList;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
/**
* <p>A system service manager for detecting, characterizing, and connecting to
@@ -123,16 +129,8 @@ public final class CameraManager {
*/
public void registerAvailabilityCallback(@NonNull AvailabilityCallback callback,
@Nullable Handler handler) {
- if (handler == null) {
- Looper looper = Looper.myLooper();
- if (looper == null) {
- throw new IllegalArgumentException(
- "No handler given, and current thread has no looper!");
- }
- handler = new Handler(looper);
- }
-
- CameraManagerGlobal.get().registerAvailabilityCallback(callback, handler);
+ CameraManagerGlobal.get().registerAvailabilityCallback(callback,
+ CameraDeviceImpl.checkAndWrapHandler(handler));
}
/**
@@ -170,15 +168,8 @@ public final class CameraManager {
* no looper.
*/
public void registerTorchCallback(@NonNull TorchCallback callback, @Nullable Handler handler) {
- if (handler == null) {
- Looper looper = Looper.myLooper();
- if (looper == null) {
- throw new IllegalArgumentException(
- "No handler given, and current thread has no looper!");
- }
- handler = new Handler(looper);
- }
- CameraManagerGlobal.get().registerTorchCallback(callback, handler);
+ CameraManagerGlobal.get().registerTorchCallback(callback,
+ CameraDeviceImpl.checkAndWrapHandler(handler));
}
/**
@@ -728,12 +719,13 @@ public final class CameraManager {
*/
private static final String CAMERA_SERVICE_BINDER_NAME = "media.camera";
+ private final ScheduledExecutorService mScheduler = Executors.newScheduledThreadPool(1);
// Camera ID -> Status map
private final ArrayMap<String, Integer> mDeviceStatus = new ArrayMap<String, Integer>();
- // Registered availablility callbacks and their handlers
- private final ArrayMap<AvailabilityCallback, Handler> mCallbackMap =
- new ArrayMap<AvailabilityCallback, Handler>();
+ // Registered availablility callbacks and their executors
+ private final ArrayMap<AvailabilityCallback, Executor> mCallbackMap =
+ new ArrayMap<AvailabilityCallback, Executor>();
// torch client binder to set the torch mode with.
private Binder mTorchClientBinder = new Binder();
@@ -741,9 +733,9 @@ public final class CameraManager {
// Camera ID -> Torch status map
private final ArrayMap<String, Integer> mTorchStatus = new ArrayMap<String, Integer>();
- // Registered torch callbacks and their handlers
- private final ArrayMap<TorchCallback, Handler> mTorchCallbackMap =
- new ArrayMap<TorchCallback, Handler>();
+ // Registered torch callbacks and their executors
+ private final ArrayMap<TorchCallback, Executor> mTorchCallbackMap =
+ new ArrayMap<TorchCallback, Executor>();
private final Object mLock = new Object();
@@ -925,49 +917,63 @@ public final class CameraManager {
}
}
- private void postSingleUpdate(final AvailabilityCallback callback, final Handler handler,
+ private void postSingleUpdate(final AvailabilityCallback callback, final Executor executor,
final String id, final int status) {
if (isAvailable(status)) {
- handler.post(
- new Runnable() {
- @Override
- public void run() {
- callback.onCameraAvailable(id);
- }
- });
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(
+ new Runnable() {
+ @Override
+ public void run() {
+ callback.onCameraAvailable(id);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
} else {
- handler.post(
- new Runnable() {
- @Override
- public void run() {
- callback.onCameraUnavailable(id);
- }
- });
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(
+ new Runnable() {
+ @Override
+ public void run() {
+ callback.onCameraUnavailable(id);
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
}
- private void postSingleTorchUpdate(final TorchCallback callback, final Handler handler,
+ private void postSingleTorchUpdate(final TorchCallback callback, final Executor executor,
final String id, final int status) {
switch(status) {
case ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON:
- case ICameraServiceListener.TORCH_STATUS_AVAILABLE_OFF:
- handler.post(
- new Runnable() {
- @Override
- public void run() {
- callback.onTorchModeChanged(id, status ==
- ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON);
- }
+ case ICameraServiceListener.TORCH_STATUS_AVAILABLE_OFF: {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> {
+ callback.onTorchModeChanged(id, status ==
+ ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON);
});
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
break;
- default:
- handler.post(
- new Runnable() {
- @Override
- public void run() {
- callback.onTorchModeUnavailable(id);
- }
+ default: {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> {
+ callback.onTorchModeUnavailable(id);
});
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
break;
}
}
@@ -976,11 +982,11 @@ public final class CameraManager {
* Send the state of all known cameras to the provided listener, to initialize
* the listener's knowledge of camera state.
*/
- private void updateCallbackLocked(AvailabilityCallback callback, Handler handler) {
+ private void updateCallbackLocked(AvailabilityCallback callback, Executor executor) {
for (int i = 0; i < mDeviceStatus.size(); i++) {
String id = mDeviceStatus.keyAt(i);
Integer status = mDeviceStatus.valueAt(i);
- postSingleUpdate(callback, handler, id, status);
+ postSingleUpdate(callback, executor, id, status);
}
}
@@ -1039,18 +1045,18 @@ public final class CameraManager {
final int callbackCount = mCallbackMap.size();
for (int i = 0; i < callbackCount; i++) {
- Handler handler = mCallbackMap.valueAt(i);
+ Executor executor = mCallbackMap.valueAt(i);
final AvailabilityCallback callback = mCallbackMap.keyAt(i);
- postSingleUpdate(callback, handler, id, status);
+ postSingleUpdate(callback, executor, id, status);
}
} // onStatusChangedLocked
- private void updateTorchCallbackLocked(TorchCallback callback, Handler handler) {
+ private void updateTorchCallbackLocked(TorchCallback callback, Executor executor) {
for (int i = 0; i < mTorchStatus.size(); i++) {
String id = mTorchStatus.keyAt(i);
Integer status = mTorchStatus.valueAt(i);
- postSingleTorchUpdate(callback, handler, id, status);
+ postSingleTorchUpdate(callback, executor, id, status);
}
}
@@ -1078,9 +1084,9 @@ public final class CameraManager {
final int callbackCount = mTorchCallbackMap.size();
for (int i = 0; i < callbackCount; i++) {
- final Handler handler = mTorchCallbackMap.valueAt(i);
+ final Executor executor = mTorchCallbackMap.valueAt(i);
final TorchCallback callback = mTorchCallbackMap.keyAt(i);
- postSingleTorchUpdate(callback, handler, id, status);
+ postSingleTorchUpdate(callback, executor, id, status);
}
} // onTorchStatusChangedLocked
@@ -1089,16 +1095,16 @@ public final class CameraManager {
* global listener singleton.
*
* @param callback the new callback to send camera availability notices to
- * @param handler The handler on which the callback should be invoked. May not be null.
+ * @param executor The executor which should invoke the callback. May not be null.
*/
- public void registerAvailabilityCallback(AvailabilityCallback callback, Handler handler) {
+ public void registerAvailabilityCallback(AvailabilityCallback callback, Executor executor) {
synchronized (mLock) {
connectCameraServiceLocked();
- Handler oldHandler = mCallbackMap.put(callback, handler);
+ Executor oldExecutor = mCallbackMap.put(callback, executor);
// For new callbacks, provide initial availability information
- if (oldHandler == null) {
- updateCallbackLocked(callback, handler);
+ if (oldExecutor == null) {
+ updateCallbackLocked(callback, executor);
}
// If not connected to camera service, schedule a reconnect to camera service.
@@ -1120,14 +1126,14 @@ public final class CameraManager {
}
}
- public void registerTorchCallback(TorchCallback callback, Handler handler) {
+ public void registerTorchCallback(TorchCallback callback, Executor executor) {
synchronized(mLock) {
connectCameraServiceLocked();
- Handler oldHandler = mTorchCallbackMap.put(callback, handler);
+ Executor oldExecutor = mTorchCallbackMap.put(callback, executor);
// For new callbacks, provide initial torch information
- if (oldHandler == null) {
- updateTorchCallbackLocked(callback, handler);
+ if (oldExecutor == null) {
+ updateTorchCallbackLocked(callback, executor);
}
// If not connected to camera service, schedule a reconnect to camera service.
@@ -1165,13 +1171,7 @@ public final class CameraManager {
* availability callback or torch status callback.
*/
private void scheduleCameraServiceReconnectionLocked() {
- final Handler handler;
-
- if (mCallbackMap.size() > 0) {
- handler = mCallbackMap.valueAt(0);
- } else if (mTorchCallbackMap.size() > 0) {
- handler = mTorchCallbackMap.valueAt(0);
- } else {
+ if (mCallbackMap.isEmpty() && mTorchCallbackMap.isEmpty()) {
// Not necessary to reconnect camera service if no client registers a callback.
return;
}
@@ -1181,22 +1181,21 @@ public final class CameraManager {
" ms");
}
- handler.postDelayed(
- new Runnable() {
- @Override
- public void run() {
- ICameraService cameraService = getCameraService();
- if (cameraService == null) {
- synchronized(mLock) {
- if (DEBUG) {
- Log.v(TAG, "Reconnecting Camera Service failed.");
- }
- scheduleCameraServiceReconnectionLocked();
- }
+ try {
+ mScheduler.schedule(() -> {
+ ICameraService cameraService = getCameraService();
+ if (cameraService == null) {
+ synchronized(mLock) {
+ if (DEBUG) {
+ Log.v(TAG, "Reconnecting Camera Service failed.");
}
+ scheduleCameraServiceReconnectionLocked();
}
- },
- CAMERA_SERVICE_RECONNECT_DELAY_MS);
+ }
+ }, CAMERA_SERVICE_RECONNECT_DELAY_MS, TimeUnit.MILLISECONDS);
+ } catch (RejectedExecutionException e) {
+ Log.e(TAG, "Failed to schedule camera service re-connect: " + e);
+ }
}
/**
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 14c2865cf3e3..7669c018acd1 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -684,7 +684,7 @@ public abstract class CameraMetadata<TKey> {
* <li>{@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation}</li>
* <li>{@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation}</li>
* <li>{@link CameraCharacteristics#LENS_INTRINSIC_CALIBRATION android.lens.intrinsicCalibration}</li>
- * <li>{@link CameraCharacteristics#LENS_RADIAL_DISTORTION android.lens.radialDistortion}</li>
+ * <li>{@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion}</li>
* </ul>
* </li>
* <li>The {@link CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE android.depth.depthIsExclusive} entry is listed by this device.</li>
@@ -702,12 +702,12 @@ public abstract class CameraMetadata<TKey> {
* rate, including depth stall time.</p>
*
* @see CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE
+ * @see CameraCharacteristics#LENS_DISTORTION
* @see CameraCharacteristics#LENS_FACING
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
* @see CameraCharacteristics#LENS_POSE_REFERENCE
* @see CameraCharacteristics#LENS_POSE_ROTATION
* @see CameraCharacteristics#LENS_POSE_TRANSLATION
- * @see CameraCharacteristics#LENS_RADIAL_DISTORTION
* @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
*/
public static final int REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT = 8;
@@ -826,7 +826,7 @@ public abstract class CameraMetadata<TKey> {
* <li>{@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation}</li>
* <li>{@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation}</li>
* <li>{@link CameraCharacteristics#LENS_INTRINSIC_CALIBRATION android.lens.intrinsicCalibration}</li>
- * <li>{@link CameraCharacteristics#LENS_RADIAL_DISTORTION android.lens.radialDistortion}</li>
+ * <li>{@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion}</li>
* </ul>
* </li>
* <li>The SENSOR_INFO_TIMESTAMP_SOURCE of the logical device and physical devices must be
@@ -852,11 +852,11 @@ public abstract class CameraMetadata<TKey> {
* not slow down the frame rate of the capture, as long as the minimum frame duration
* of the physical and logical streams are the same.</p>
*
+ * @see CameraCharacteristics#LENS_DISTORTION
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
* @see CameraCharacteristics#LENS_POSE_REFERENCE
* @see CameraCharacteristics#LENS_POSE_ROTATION
* @see CameraCharacteristics#LENS_POSE_TRANSLATION
- * @see CameraCharacteristics#LENS_RADIAL_DISTORTION
* @see CameraCharacteristics#LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
* @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
*/
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index d7c55645e20c..b0cbec71dfe6 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -2791,8 +2791,10 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <li>{@link #STATISTICS_OIS_DATA_MODE_ON ON}</li>
* </ul></p>
* <p><b>Available values for this device:</b><br>
- * android.Statistics.info.availableOisDataModes</p>
+ * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES android.statistics.info.availableOisDataModes}</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ *
+ * @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES
* @see #STATISTICS_OIS_DATA_MODE_OFF
* @see #STATISTICS_OIS_DATA_MODE_ON
*/
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index e84e48f8fbcb..633194243512 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -2783,7 +2783,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* from the main sensor along the +X axis (to the right from the user's perspective) will
* report <code>(0.03, 0, 0)</code>.</p>
* <p>To transform a pixel coordinates between two cameras facing the same direction, first
- * the source camera {@link CameraCharacteristics#LENS_RADIAL_DISTORTION android.lens.radialDistortion} must be corrected for. Then the source
+ * the source camera {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} must be corrected for. Then the source
* camera {@link CameraCharacteristics#LENS_INTRINSIC_CALIBRATION android.lens.intrinsicCalibration} needs to be applied, followed by the
* {@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation} of the source camera, the translation of the source camera
* relative to the destination camera, the {@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation} of the destination
@@ -2797,10 +2797,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: Meters</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
+ * @see CameraCharacteristics#LENS_DISTORTION
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
* @see CameraCharacteristics#LENS_POSE_REFERENCE
* @see CameraCharacteristics#LENS_POSE_ROTATION
- * @see CameraCharacteristics#LENS_RADIAL_DISTORTION
*/
@PublicKey
public static final Key<float[]> LENS_POSE_TRANSLATION =
@@ -2846,7 +2846,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* where <code>(0,0)</code> is the top-left of the
* preCorrectionActiveArraySize rectangle. Once the pose and
* intrinsic calibration transforms have been applied to a
- * world point, then the {@link CameraCharacteristics#LENS_RADIAL_DISTORTION android.lens.radialDistortion}
+ * world point, then the {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion}
* transform needs to be applied, and the result adjusted to
* be in the {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} coordinate
* system (where <code>(0, 0)</code> is the top-left of the
@@ -2859,9 +2859,9 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* coordinate system.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
+ * @see CameraCharacteristics#LENS_DISTORTION
* @see CameraCharacteristics#LENS_POSE_ROTATION
* @see CameraCharacteristics#LENS_POSE_TRANSLATION
- * @see CameraCharacteristics#LENS_RADIAL_DISTORTION
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@@ -2903,12 +2903,59 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
+ * @deprecated
+ * <p>This field was inconsistently defined in terms of its
+ * normalization. Use {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} instead.</p>
+ *
+ * @see CameraCharacteristics#LENS_DISTORTION
+
*/
+ @Deprecated
@PublicKey
public static final Key<float[]> LENS_RADIAL_DISTORTION =
new Key<float[]>("android.lens.radialDistortion", float[].class);
/**
+ * <p>The correction coefficients to correct for this camera device's
+ * radial and tangential lens distortion.</p>
+ * <p>Replaces the deprecated {@link CameraCharacteristics#LENS_RADIAL_DISTORTION android.lens.radialDistortion} field, which was
+ * inconsistently defined.</p>
+ * <p>Three radial distortion coefficients <code>[kappa_1, kappa_2,
+ * kappa_3]</code> and two tangential distortion coefficients
+ * <code>[kappa_4, kappa_5]</code> that can be used to correct the
+ * lens's geometric distortion with the mapping equations:</p>
+ * <pre><code> x_c = x_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
+ * kappa_4 * (2 * x_i * y_i) + kappa_5 * ( r^2 + 2 * x_i^2 )
+ * y_c = y_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
+ * kappa_5 * (2 * x_i * y_i) + kappa_4 * ( r^2 + 2 * y_i^2 )
+ * </code></pre>
+ * <p>Here, <code>[x_c, y_c]</code> are the coordinates to sample in the
+ * input image that correspond to the pixel values in the
+ * corrected image at the coordinate <code>[x_i, y_i]</code>:</p>
+ * <pre><code> correctedImage(x_i, y_i) = sample_at(x_c, y_c, inputImage)
+ * </code></pre>
+ * <p>The pixel coordinates are defined in a coordinate system
+ * related to the {@link CameraCharacteristics#LENS_INTRINSIC_CALIBRATION android.lens.intrinsicCalibration}
+ * calibration fields; see that entry for details of the mapping stages.
+ * Both <code>[x_i, y_i]</code> and <code>[x_c, y_c]</code>
+ * have <code>(0,0)</code> at the lens optical center <code>[c_x, c_y]</code>, and
+ * the range of the coordinates depends on the focal length
+ * terms of the intrinsic calibration.</p>
+ * <p>Finally, <code>r</code> represents the radial distance from the
+ * optical center, <code>r^2 = x_i^2 + y_i^2</code>.</p>
+ * <p>The distortion model used is the Brown-Conrady model.</p>
+ * <p><b>Units</b>:
+ * Unitless coefficients.</p>
+ * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ *
+ * @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
+ * @see CameraCharacteristics#LENS_RADIAL_DISTORTION
+ */
+ @PublicKey
+ public static final Key<float[]> LENS_DISTORTION =
+ new Key<float[]>("android.lens.distortion", float[].class);
+
+ /**
* <p>Mode of operation for the noise reduction algorithm.</p>
* <p>The noise reduction algorithm attempts to improve image quality by removing
* excessive noise added by the capture process, especially in dark conditions.</p>
@@ -2981,6 +3028,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* Optional. Default value is FINAL.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* @deprecated
+ * <p>Not used in HALv3 or newer</p>
+
* @hide
*/
@Deprecated
@@ -2997,6 +3046,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* &gt; 0</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* @deprecated
+ * <p>Not used in HALv3 or newer</p>
+
* @hide
*/
@Deprecated
@@ -3777,6 +3828,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
*
* @see CaptureRequest#COLOR_CORRECTION_GAINS
* @deprecated
+ * <p>Never fully implemented or specified; do not use</p>
+
* @hide
*/
@Deprecated
@@ -3801,6 +3854,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* regardless of the android.control.* current values.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
* @deprecated
+ * <p>Never fully implemented or specified; do not use</p>
+
* @hide
*/
@Deprecated
@@ -3919,8 +3974,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #STATISTICS_OIS_DATA_MODE_ON ON}</li>
* </ul></p>
* <p><b>Available values for this device:</b><br>
- * android.Statistics.info.availableOisDataModes</p>
+ * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES android.statistics.info.availableOisDataModes}</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ *
+ * @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES
* @see #STATISTICS_OIS_DATA_MODE_OFF
* @see #STATISTICS_OIS_DATA_MODE_ON
*/
diff --git a/core/java/android/hardware/camera2/dispatch/ArgumentReplacingDispatcher.java b/core/java/android/hardware/camera2/dispatch/ArgumentReplacingDispatcher.java
deleted file mode 100644
index 866f370f5d5d..000000000000
--- a/core/java/android/hardware/camera2/dispatch/ArgumentReplacingDispatcher.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.camera2.dispatch;
-
-import java.lang.reflect.Method;
-
-import static com.android.internal.util.Preconditions.*;
-
-/**
- * A dispatcher that replaces one argument with another; replaces any argument at an index
- * with another argument.
- *
- * <p>For example, we can override an {@code void onSomething(int x)} calls to have {@code x} always
- * equal to 1. Or, if using this with a duck typing dispatcher, we could even overwrite {@code x} to
- * be something
- * that's not an {@code int}.</p>
- *
- * @param <T>
- * source dispatch type, whose methods with {@link #dispatch} will be called
- * @param <TArg>
- * argument replacement type, args in {@link #dispatch} matching {@code argumentIndex}
- * will be overriden to objects of this type
- */
-public class ArgumentReplacingDispatcher<T, TArg> implements Dispatchable<T> {
-
- private final Dispatchable<T> mTarget;
- private final int mArgumentIndex;
- private final TArg mReplaceWith;
-
- /**
- * Create a new argument replacing dispatcher; dispatches are forwarded to {@code target}
- * after the argument is replaced.
- *
- * <p>For example, if a method {@code onAction(T1 a, Integer b, T2 c)} is invoked, and we wanted
- * to replace all occurrences of {@code b} with {@code 0xDEADBEEF}, we would set
- * {@code argumentIndex = 1} and {@code replaceWith = 0xDEADBEEF}.</p>
- *
- * <p>If a method dispatched has less arguments than {@code argumentIndex}, it is
- * passed through with the arguments unchanged.</p>
- *
- * @param target destination dispatch type, methods will be redirected to this dispatcher
- * @param argumentIndex the numeric index of the argument {@code >= 0}
- * @param replaceWith arguments matching {@code argumentIndex} will be replaced with this object
- */
- public ArgumentReplacingDispatcher(Dispatchable<T> target, int argumentIndex,
- TArg replaceWith) {
- mTarget = checkNotNull(target, "target must not be null");
- mArgumentIndex = checkArgumentNonnegative(argumentIndex,
- "argumentIndex must not be negative");
- mReplaceWith = checkNotNull(replaceWith, "replaceWith must not be null");
- }
-
- @Override
- public Object dispatch(Method method, Object[] args) throws Throwable {
-
- if (args.length > mArgumentIndex) {
- args = arrayCopy(args); // don't change in-place since it can affect upstream dispatches
- args[mArgumentIndex] = mReplaceWith;
- }
-
- return mTarget.dispatch(method, args);
- }
-
- private static Object[] arrayCopy(Object[] array) {
- int length = array.length;
- Object[] newArray = new Object[length];
- for (int i = 0; i < length; ++i) {
- newArray[i] = array[i];
- }
- return newArray;
- }
-}
diff --git a/core/java/android/hardware/camera2/dispatch/BroadcastDispatcher.java b/core/java/android/hardware/camera2/dispatch/BroadcastDispatcher.java
deleted file mode 100644
index fe575b277616..000000000000
--- a/core/java/android/hardware/camera2/dispatch/BroadcastDispatcher.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.camera2.dispatch;
-
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.List;
-
-import static com.android.internal.util.Preconditions.*;
-
-/**
- * Broadcast a single dispatch into multiple other dispatchables.
- *
- * <p>Every time {@link #dispatch} is invoked, all the broadcast targets will
- * see the same dispatch as well. The first target's return value is returned.</p>
- *
- * <p>This enables a single listener to be converted into a multi-listener.</p>
- */
-public class BroadcastDispatcher<T> implements Dispatchable<T> {
-
- private final List<Dispatchable<T>> mDispatchTargets;
-
- /**
- * Create a broadcast dispatcher from the supplied dispatch targets.
- *
- * @param dispatchTargets one or more targets to dispatch to
- */
- @SafeVarargs
- public BroadcastDispatcher(Dispatchable<T>... dispatchTargets) {
- mDispatchTargets = Arrays.asList(
- checkNotNull(dispatchTargets, "dispatchTargets must not be null"));
- }
-
- @Override
- public Object dispatch(Method method, Object[] args) throws Throwable {
- Object result = null;
- boolean gotResult = false;
-
- for (Dispatchable<T> dispatchTarget : mDispatchTargets) {
- Object localResult = dispatchTarget.dispatch(method, args);
-
- if (!gotResult) {
- gotResult = true;
- result = localResult;
- }
- }
-
- return result;
- }
-}
diff --git a/core/java/android/hardware/camera2/dispatch/Dispatchable.java b/core/java/android/hardware/camera2/dispatch/Dispatchable.java
deleted file mode 100644
index 753103f45ea8..000000000000
--- a/core/java/android/hardware/camera2/dispatch/Dispatchable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.camera2.dispatch;
-
-import java.lang.reflect.Method;
-
-/**
- * Dynamically dispatch a method and its argument to some object.
- *
- * <p>This can be used to intercept method calls and do work around them, redirect work,
- * or block calls entirely.</p>
- */
-public interface Dispatchable<T> {
- /**
- * Dispatch the method and arguments to this object.
- * @param method a method defined in class {@code T}
- * @param args arguments corresponding to said {@code method}
- * @return the object returned when invoking {@code method}
- * @throws Throwable any exception that might have been raised while invoking the method
- */
- public Object dispatch(Method method, Object[] args) throws Throwable;
-}
diff --git a/core/java/android/hardware/camera2/dispatch/DuckTypingDispatcher.java b/core/java/android/hardware/camera2/dispatch/DuckTypingDispatcher.java
deleted file mode 100644
index 75f97e4656aa..000000000000
--- a/core/java/android/hardware/camera2/dispatch/DuckTypingDispatcher.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.camera2.dispatch;
-
-
-import java.lang.reflect.Method;
-
-import static com.android.internal.util.Preconditions.*;
-
-/**
- * Duck typing dispatcher; converts dispatch methods calls from one class to another by
- * looking up equivalently methods at runtime by name.
- *
- * <p>For example, if two types have identical method names and arguments, but
- * are not subclasses/subinterfaces of each other, this dispatcher will allow calls to be
- * made from one type to the other.</p>
- *
- * @param <TFrom> source dispatch type, whose methods with {@link #dispatch} will be called
- * @param <T> destination dispatch type, methods will be converted to the class of {@code T}
- */
-public class DuckTypingDispatcher<TFrom, T> implements Dispatchable<TFrom> {
-
- private final MethodNameInvoker<T> mDuck;
-
- /**
- * Create a new duck typing dispatcher.
- *
- * @param target destination dispatch type, methods will be redirected to this dispatcher
- * @param targetClass destination dispatch class, methods will be converted to this class's
- */
- public DuckTypingDispatcher(Dispatchable<T> target, Class<T> targetClass) {
- checkNotNull(targetClass, "targetClass must not be null");
- checkNotNull(target, "target must not be null");
-
- mDuck = new MethodNameInvoker<T>(target, targetClass);
- }
-
- @Override
- public Object dispatch(Method method, Object[] args) {
- return mDuck.invoke(method.getName(), args);
- }
-}
diff --git a/core/java/android/hardware/camera2/dispatch/HandlerDispatcher.java b/core/java/android/hardware/camera2/dispatch/HandlerDispatcher.java
deleted file mode 100644
index f8e9d49a95c6..000000000000
--- a/core/java/android/hardware/camera2/dispatch/HandlerDispatcher.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.camera2.dispatch;
-
-import android.hardware.camera2.utils.UncheckedThrow;
-import android.os.Handler;
-import android.util.Log;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import static com.android.internal.util.Preconditions.*;
-
-/**
- * Forward all interface calls into a handler by posting it as a {@code Runnable}.
- *
- * <p>All calls will return immediately; functions with return values will return a default
- * value of {@code null}, {@code 0}, or {@code false} where that value is legal.</p>
- *
- * <p>Any exceptions thrown on the handler while trying to invoke a method
- * will be re-thrown. Throwing checked exceptions on a handler which doesn't expect any
- * checked exceptions to be thrown will result in "undefined" behavior
- * (although in practice it is usually thrown as normal).</p>
- */
-public class HandlerDispatcher<T> implements Dispatchable<T> {
-
- private static final String TAG = "HandlerDispatcher";
-
- private final Dispatchable<T> mDispatchTarget;
- private final Handler mHandler;
-
- /**
- * Create a dispatcher that forwards it's dispatch calls by posting
- * them onto the {@code handler} as a {@code Runnable}.
- *
- * @param dispatchTarget the destination whose method calls will be redirected into the handler
- * @param handler all calls into {@code dispatchTarget} will be posted onto this handler
- * @param <T> the type of the element you want to wrap.
- * @return a dispatcher that will forward it's dispatch calls to a handler
- */
- public HandlerDispatcher(Dispatchable<T> dispatchTarget, Handler handler) {
- mDispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
- mHandler = checkNotNull(handler, "handler must not be null");
- }
-
- @Override
- public Object dispatch(final Method method, final Object[] args) throws Throwable {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- try {
- mDispatchTarget.dispatch(method, args);
- } catch (InvocationTargetException e) {
- Throwable t = e.getTargetException();
- // Potential UB. Hopefully 't' is a runtime exception.
- UncheckedThrow.throwAnyException(t);
- } catch (IllegalAccessException e) {
- // Impossible
- Log.wtf(TAG, "IllegalAccessException while invoking " + method, e);
- } catch (IllegalArgumentException e) {
- // Impossible
- Log.wtf(TAG, "IllegalArgumentException while invoking " + method, e);
- } catch (Throwable e) {
- UncheckedThrow.throwAnyException(e);
- }
- }
- });
-
- // TODO handle primitive return values that would avoid NPE if unboxed
- return null;
- }
-}
diff --git a/core/java/android/hardware/camera2/dispatch/InvokeDispatcher.java b/core/java/android/hardware/camera2/dispatch/InvokeDispatcher.java
deleted file mode 100644
index ac5f52676df4..000000000000
--- a/core/java/android/hardware/camera2/dispatch/InvokeDispatcher.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.camera2.dispatch;
-
-import android.hardware.camera2.utils.UncheckedThrow;
-import android.util.Log;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import static com.android.internal.util.Preconditions.*;
-
-
-public class InvokeDispatcher<T> implements Dispatchable<T> {
-
- private static final String TAG = "InvocationSink";
- private final T mTarget;
-
- public InvokeDispatcher(T target) {
- mTarget = checkNotNull(target, "target must not be null");
- }
-
- @Override
- public Object dispatch(Method method, Object[] args) {
- try {
- return method.invoke(mTarget, args);
- } catch (InvocationTargetException e) {
- Throwable t = e.getTargetException();
- // Potential UB. Hopefully 't' is a runtime exception.
- UncheckedThrow.throwAnyException(t);
- } catch (IllegalAccessException e) {
- // Impossible
- Log.wtf(TAG, "IllegalAccessException while invoking " + method, e);
- } catch (IllegalArgumentException e) {
- // Impossible
- Log.wtf(TAG, "IllegalArgumentException while invoking " + method, e);
- }
-
- // unreachable
- return null;
- }
-}
diff --git a/core/java/android/hardware/camera2/dispatch/MethodNameInvoker.java b/core/java/android/hardware/camera2/dispatch/MethodNameInvoker.java
deleted file mode 100644
index 8296b7a915a4..000000000000
--- a/core/java/android/hardware/camera2/dispatch/MethodNameInvoker.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.hardware.camera2.dispatch;
-
-import static com.android.internal.util.Preconditions.checkNotNull;
-
-import android.hardware.camera2.utils.UncheckedThrow;
-
-import java.lang.reflect.Method;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Invoke a method on a dispatchable by its name (without knowing the {@code Method} ahead of time).
- *
- * @param <T> destination dispatch type, methods will be looked up in the class of {@code T}
- */
-public class MethodNameInvoker<T> {
-
- private final Dispatchable<T> mTarget;
- private final Class<T> mTargetClass;
- private final Method[] mTargetClassMethods;
- private final ConcurrentHashMap<String, Method> mMethods =
- new ConcurrentHashMap<>();
-
- /**
- * Create a new method name invoker.
- *
- * @param target destination dispatch type, invokes will be redirected to this dispatcher
- * @param targetClass destination dispatch class, the invoked methods will be from this class
- */
- public MethodNameInvoker(Dispatchable<T> target, Class<T> targetClass) {
- mTargetClass = targetClass;
- mTargetClassMethods = targetClass.getMethods();
- mTarget = target;
- }
-
- /**
- * Invoke a method by its name.
- *
- * <p>If more than one method exists in {@code targetClass}, the first method with the right
- * number of arguments will be used, and later calls will all use that method.</p>
- *
- * @param methodName
- * The name of the method, which will be matched 1:1 to the destination method
- * @param params
- * Variadic parameter list.
- * @return
- * The same kind of value that would normally be returned by calling {@code methodName}
- * statically.
- *
- * @throws IllegalArgumentException if {@code methodName} does not exist on the target class
- * @throws Throwable will rethrow anything that the target method would normally throw
- */
- @SuppressWarnings("unchecked")
- public <K> K invoke(String methodName, Object... params) {
- checkNotNull(methodName, "methodName must not be null");
-
- Method targetMethod = mMethods.get(methodName);
- if (targetMethod == null) {
- for (Method method : mTargetClassMethods) {
- // TODO future: match types of params if possible
- if (method.getName().equals(methodName) &&
- (params.length == method.getParameterTypes().length) ) {
- targetMethod = method;
- mMethods.put(methodName, targetMethod);
- break;
- }
- }
-
- if (targetMethod == null) {
- throw new IllegalArgumentException(
- "Method " + methodName + " does not exist on class " + mTargetClass);
- }
- }
-
- try {
- return (K) mTarget.dispatch(targetMethod, params);
- } catch (Throwable e) {
- UncheckedThrow.throwAnyException(e);
- // unreachable
- return null;
- }
- }
-}
diff --git a/core/java/android/hardware/camera2/dispatch/package.html b/core/java/android/hardware/camera2/dispatch/package.html
deleted file mode 100644
index 783d0a1b54d5..000000000000
--- a/core/java/android/hardware/camera2/dispatch/package.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<body>
-{@hide}
-</body>
diff --git a/core/java/android/hardware/camera2/impl/CallbackProxies.java b/core/java/android/hardware/camera2/impl/CallbackProxies.java
index c9eecf10e3d3..9e4cb80b89f0 100644
--- a/core/java/android/hardware/camera2/impl/CallbackProxies.java
+++ b/core/java/android/hardware/camera2/impl/CallbackProxies.java
@@ -15,16 +15,17 @@
*/
package android.hardware.camera2.impl;
+import android.os.Binder;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CaptureFailure;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
-import android.hardware.camera2.dispatch.Dispatchable;
-import android.hardware.camera2.dispatch.MethodNameInvoker;
import android.view.Surface;
+import java.util.concurrent.Executor;
+
import static com.android.internal.util.Preconditions.*;
/**
@@ -34,164 +35,86 @@ import static com.android.internal.util.Preconditions.*;
* to use our own proxy mechanism.</p>
*/
public class CallbackProxies {
-
- // TODO: replace with codegen
-
- public static class DeviceStateCallbackProxy extends CameraDeviceImpl.StateCallbackKK {
- private final MethodNameInvoker<CameraDeviceImpl.StateCallbackKK> mProxy;
-
- public DeviceStateCallbackProxy(
- Dispatchable<CameraDeviceImpl.StateCallbackKK> dispatchTarget) {
- dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
- mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.StateCallbackKK.class);
- }
-
- @Override
- public void onOpened(CameraDevice camera) {
- mProxy.invoke("onOpened", camera);
- }
-
- @Override
- public void onDisconnected(CameraDevice camera) {
- mProxy.invoke("onDisconnected", camera);
- }
-
- @Override
- public void onError(CameraDevice camera, int error) {
- mProxy.invoke("onError", camera, error);
- }
-
- @Override
- public void onUnconfigured(CameraDevice camera) {
- mProxy.invoke("onUnconfigured", camera);
- }
-
- @Override
- public void onActive(CameraDevice camera) {
- mProxy.invoke("onActive", camera);
- }
-
- @Override
- public void onBusy(CameraDevice camera) {
- mProxy.invoke("onBusy", camera);
- }
-
- @Override
- public void onClosed(CameraDevice camera) {
- mProxy.invoke("onClosed", camera);
- }
-
- @Override
- public void onIdle(CameraDevice camera) {
- mProxy.invoke("onIdle", camera);
- }
- }
-
- @SuppressWarnings("deprecation")
- public static class DeviceCaptureCallbackProxy implements CameraDeviceImpl.CaptureCallback {
- private final MethodNameInvoker<CameraDeviceImpl.CaptureCallback> mProxy;
-
- public DeviceCaptureCallbackProxy(
- Dispatchable<CameraDeviceImpl.CaptureCallback> dispatchTarget) {
- dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
- mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.CaptureCallback.class);
- }
-
- @Override
- public void onCaptureStarted(CameraDevice camera,
- CaptureRequest request, long timestamp, long frameNumber) {
- mProxy.invoke("onCaptureStarted", camera, request, timestamp, frameNumber);
- }
-
- @Override
- public void onCapturePartial(CameraDevice camera,
- CaptureRequest request, CaptureResult result) {
- mProxy.invoke("onCapturePartial", camera, request, result);
- }
-
- @Override
- public void onCaptureProgressed(CameraDevice camera,
- CaptureRequest request, CaptureResult partialResult) {
- mProxy.invoke("onCaptureProgressed", camera, request, partialResult);
- }
-
- @Override
- public void onCaptureCompleted(CameraDevice camera,
- CaptureRequest request, TotalCaptureResult result) {
- mProxy.invoke("onCaptureCompleted", camera, request, result);
- }
-
- @Override
- public void onCaptureFailed(CameraDevice camera,
- CaptureRequest request, CaptureFailure failure) {
- mProxy.invoke("onCaptureFailed", camera, request, failure);
- }
-
- @Override
- public void onCaptureSequenceCompleted(CameraDevice camera,
- int sequenceId, long frameNumber) {
- mProxy.invoke("onCaptureSequenceCompleted", camera, sequenceId, frameNumber);
- }
-
- @Override
- public void onCaptureSequenceAborted(CameraDevice camera,
- int sequenceId) {
- mProxy.invoke("onCaptureSequenceAborted", camera, sequenceId);
- }
-
- @Override
- public void onCaptureBufferLost(CameraDevice camera,
- CaptureRequest request, Surface target, long frameNumber) {
- mProxy.invoke("onCaptureBufferLost", camera, request, target, frameNumber);
- }
-
- }
-
public static class SessionStateCallbackProxy
extends CameraCaptureSession.StateCallback {
- private final MethodNameInvoker<CameraCaptureSession.StateCallback> mProxy;
+ private final Executor mExecutor;
+ private final CameraCaptureSession.StateCallback mCallback;
- public SessionStateCallbackProxy(
- Dispatchable<CameraCaptureSession.StateCallback> dispatchTarget) {
- dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
- mProxy = new MethodNameInvoker<>(dispatchTarget,
- CameraCaptureSession.StateCallback.class);
+ public SessionStateCallbackProxy(Executor executor,
+ CameraCaptureSession.StateCallback callback) {
+ mExecutor = checkNotNull(executor, "executor must not be null");
+ mCallback = checkNotNull(callback, "callback must not be null");
}
@Override
public void onConfigured(CameraCaptureSession session) {
- mProxy.invoke("onConfigured", session);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onConfigured(session));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
- mProxy.invoke("onConfigureFailed", session);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onConfigureFailed(session));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
@Override
public void onReady(CameraCaptureSession session) {
- mProxy.invoke("onReady", session);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onReady(session));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
@Override
public void onActive(CameraCaptureSession session) {
- mProxy.invoke("onActive", session);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onActive(session));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
@Override
public void onCaptureQueueEmpty(CameraCaptureSession session) {
- mProxy.invoke("onCaptureQueueEmpty", session);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onCaptureQueueEmpty(session));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
@Override
public void onClosed(CameraCaptureSession session) {
- mProxy.invoke("onClosed", session);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onClosed(session));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
@Override
public void onSurfacePrepared(CameraCaptureSession session, Surface surface) {
- mProxy.invoke("onSurfacePrepared", session, surface);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onSurfacePrepared(session, surface));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
}
diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
index 8b8bbc34f7d2..9cac71c35645 100644
--- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
@@ -20,20 +20,17 @@ import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.ICameraDeviceUser;
-import android.hardware.camera2.dispatch.ArgumentReplacingDispatcher;
-import android.hardware.camera2.dispatch.BroadcastDispatcher;
-import android.hardware.camera2.dispatch.DuckTypingDispatcher;
-import android.hardware.camera2.dispatch.HandlerDispatcher;
-import android.hardware.camera2.dispatch.InvokeDispatcher;
import android.hardware.camera2.params.OutputConfiguration;
import android.hardware.camera2.utils.TaskDrainer;
import android.hardware.camera2.utils.TaskSingleDrainer;
+import android.os.Binder;
import android.os.Handler;
import android.util.Log;
import android.view.Surface;
import java.util.Arrays;
import java.util.List;
+import java.util.concurrent.Executor;
import static android.hardware.camera2.impl.CameraDeviceImpl.checkHandler;
import static com.android.internal.util.Preconditions.*;
@@ -51,16 +48,16 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
private final Surface mInput;
/**
* User-specified state callback, used for outgoing events; calls to this object will be
- * automatically {@link Handler#post(Runnable) posted} to {@code mStateHandler}.
+ * automatically invoked via {@code mStateExecutor}.
*/
private final CameraCaptureSession.StateCallback mStateCallback;
- /** User-specified state handler used for outgoing state callback events */
- private final Handler mStateHandler;
+ /** User-specified state executor used for outgoing state callback events */
+ private final Executor mStateExecutor;
/** Internal camera device; used to translate calls into existing deprecated API */
private final android.hardware.camera2.impl.CameraDeviceImpl mDeviceImpl;
- /** Internal handler; used for all incoming events to preserve total order */
- private final Handler mDeviceHandler;
+ /** Internal executor; used for all incoming events to preserve total order */
+ private final Executor mDeviceExecutor;
/** Drain Sequence IDs which have been queued but not yet finished with aborted/completed */
private final TaskDrainer<Integer> mSequenceDrainer;
@@ -87,9 +84,9 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
* (e.g. no pending captures, no repeating requests, no flush).</p>
*/
CameraCaptureSessionImpl(int id, Surface input,
- CameraCaptureSession.StateCallback callback, Handler stateHandler,
+ CameraCaptureSession.StateCallback callback, Executor stateExecutor,
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl,
- Handler deviceStateHandler, boolean configureSuccess) {
+ Executor deviceStateExecutor, boolean configureSuccess) {
if (callback == null) {
throw new IllegalArgumentException("callback must not be null");
}
@@ -98,10 +95,11 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
mIdString = String.format("Session %d: ", mId);
mInput = input;
- mStateHandler = checkHandler(stateHandler);
- mStateCallback = createUserStateCallbackProxy(mStateHandler, callback);
+ mStateExecutor = checkNotNull(stateExecutor, "stateExecutor must not be null");
+ mStateCallback = createUserStateCallbackProxy(mStateExecutor, callback);
- mDeviceHandler = checkNotNull(deviceStateHandler, "deviceStateHandler must not be null");
+ mDeviceExecutor = checkNotNull(deviceStateExecutor,
+ "deviceStateExecutor must not be null");
mDeviceImpl = checkNotNull(deviceImpl, "deviceImpl must not be null");
/*
@@ -110,11 +108,11 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
* This ensures total ordering between CameraDevice.StateCallback and
* CameraDeviceImpl.CaptureCallback events.
*/
- mSequenceDrainer = new TaskDrainer<>(mDeviceHandler, new SequenceDrainListener(),
+ mSequenceDrainer = new TaskDrainer<>(mDeviceExecutor, new SequenceDrainListener(),
/*name*/"seq");
- mIdleDrainer = new TaskSingleDrainer(mDeviceHandler, new IdleDrainListener(),
+ mIdleDrainer = new TaskSingleDrainer(mDeviceExecutor, new IdleDrainListener(),
/*name*/"idle");
- mAbortDrainer = new TaskSingleDrainer(mDeviceHandler, new AbortDrainListener(),
+ mAbortDrainer = new TaskSingleDrainer(mDeviceExecutor, new AbortDrainListener(),
/*name*/"abort");
// CameraDevice should call configureOutputs and have it finish before constructing us
@@ -180,7 +178,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
}
return addPendingSequence(mDeviceImpl.capture(request,
- createCaptureCallbackProxy(handler, callback), mDeviceHandler));
+ createCaptureCallbackProxy(handler, callback), mDeviceExecutor));
}
}
@@ -217,7 +215,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
}
return addPendingSequence(mDeviceImpl.captureBurst(requests,
- createCaptureCallbackProxy(handler, callback), mDeviceHandler));
+ createCaptureCallbackProxy(handler, callback), mDeviceExecutor));
}
}
@@ -241,7 +239,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
}
return addPendingSequence(mDeviceImpl.setRepeatingRequest(request,
- createCaptureCallbackProxy(handler, callback), mDeviceHandler));
+ createCaptureCallbackProxy(handler, callback), mDeviceExecutor));
}
}
@@ -274,7 +272,7 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
}
return addPendingSequence(mDeviceImpl.setRepeatingBurst(requests,
- createCaptureCallbackProxy(handler, callback), mDeviceHandler));
+ createCaptureCallbackProxy(handler, callback), mDeviceExecutor));
}
}
@@ -446,119 +444,145 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
}
/**
- * Post calls into a CameraCaptureSession.StateCallback to the user-specified {@code handler}.
+ * Post calls into a CameraCaptureSession.StateCallback to the user-specified {@code executor}.
*/
- private StateCallback createUserStateCallbackProxy(Handler handler, StateCallback callback) {
- InvokeDispatcher<StateCallback> userCallbackSink = new InvokeDispatcher<>(callback);
- HandlerDispatcher<StateCallback> handlerPassthrough =
- new HandlerDispatcher<>(userCallbackSink, handler);
-
- return new CallbackProxies.SessionStateCallbackProxy(handlerPassthrough);
+ private StateCallback createUserStateCallbackProxy(Executor executor, StateCallback callback) {
+ return new CallbackProxies.SessionStateCallbackProxy(executor, callback);
}
/**
* Forward callbacks from
* CameraDeviceImpl.CaptureCallback to the CameraCaptureSession.CaptureCallback.
*
- * <p>In particular, all calls are automatically split to go both to our own
- * internal callback, and to the user-specified callback (by transparently posting
- * to the user-specified handler).</p>
- *
* <p>When a capture sequence finishes, update the pending checked sequences set.</p>
*/
@SuppressWarnings("deprecation")
private CameraDeviceImpl.CaptureCallback createCaptureCallbackProxy(
Handler handler, CaptureCallback callback) {
- CameraDeviceImpl.CaptureCallback localCallback = new CameraDeviceImpl.CaptureCallback() {
+ final Executor executor = (callback != null) ? CameraDeviceImpl.checkAndWrapHandler(
+ handler) : null;
+ return new CameraDeviceImpl.CaptureCallback() {
@Override
public void onCaptureStarted(CameraDevice camera,
CaptureRequest request, long timestamp, long frameNumber) {
- // Do nothing
+ if ((callback != null) && (executor != null)) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.onCaptureStarted(
+ CameraCaptureSessionImpl.this, request, timestamp,
+ frameNumber));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
}
@Override
public void onCapturePartial(CameraDevice camera,
CaptureRequest request, android.hardware.camera2.CaptureResult result) {
- // Do nothing
+ if ((callback != null) && (executor != null)) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.onCapturePartial(
+ CameraCaptureSessionImpl.this, request, result));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
}
@Override
public void onCaptureProgressed(CameraDevice camera,
CaptureRequest request, android.hardware.camera2.CaptureResult partialResult) {
- // Do nothing
+ if ((callback != null) && (executor != null)) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.onCaptureProgressed(
+ CameraCaptureSessionImpl.this, request, partialResult));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
}
@Override
public void onCaptureCompleted(CameraDevice camera,
CaptureRequest request, android.hardware.camera2.TotalCaptureResult result) {
- // Do nothing
+ if ((callback != null) && (executor != null)) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.onCaptureCompleted(
+ CameraCaptureSessionImpl.this, request, result));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
}
@Override
public void onCaptureFailed(CameraDevice camera,
CaptureRequest request, android.hardware.camera2.CaptureFailure failure) {
- // Do nothing
+ if ((callback != null) && (executor != null)) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.onCaptureFailed(
+ CameraCaptureSessionImpl.this, request, failure));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
}
@Override
public void onCaptureSequenceCompleted(CameraDevice camera,
int sequenceId, long frameNumber) {
+ if ((callback != null) && (executor != null)) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.onCaptureSequenceCompleted(
+ CameraCaptureSessionImpl.this, sequenceId, frameNumber));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
finishPendingSequence(sequenceId);
}
@Override
public void onCaptureSequenceAborted(CameraDevice camera,
int sequenceId) {
+ if ((callback != null) && (executor != null)) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.onCaptureSequenceAborted(
+ CameraCaptureSessionImpl.this, sequenceId));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
finishPendingSequence(sequenceId);
}
@Override
public void onCaptureBufferLost(CameraDevice camera,
CaptureRequest request, Surface target, long frameNumber) {
- // Do nothing
+ if ((callback != null) && (executor != null)) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> callback.onCaptureBufferLost(
+ CameraCaptureSessionImpl.this, request, target, frameNumber));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
}
-
};
-
- /*
- * Split the calls from the device callback into local callback and the following chain:
- * - replace the first CameraDevice arg with a CameraCaptureSession
- * - duck type from device callback to session callback
- * - then forward the call to a handler
- * - then finally invoke the destination method on the session callback object
- */
- if (callback == null) {
- // OK: API allows the user to not specify a callback, and the handler may
- // also be null in that case. Collapse whole dispatch chain to only call the local
- // callback
- return localCallback;
- }
-
- InvokeDispatcher<CameraDeviceImpl.CaptureCallback> localSink =
- new InvokeDispatcher<>(localCallback);
-
- InvokeDispatcher<CaptureCallback> userCallbackSink =
- new InvokeDispatcher<>(callback);
- HandlerDispatcher<CaptureCallback> handlerPassthrough =
- new HandlerDispatcher<>(userCallbackSink, handler);
- DuckTypingDispatcher<CameraDeviceImpl.CaptureCallback, CaptureCallback> duckToSession
- = new DuckTypingDispatcher<>(handlerPassthrough, CaptureCallback.class);
- ArgumentReplacingDispatcher<CameraDeviceImpl.CaptureCallback, CameraCaptureSessionImpl>
- replaceDeviceWithSession = new ArgumentReplacingDispatcher<>(duckToSession,
- /*argumentIndex*/0, this);
-
- BroadcastDispatcher<CameraDeviceImpl.CaptureCallback> broadcaster =
- new BroadcastDispatcher<CameraDeviceImpl.CaptureCallback>(
- replaceDeviceWithSession,
- localSink);
-
- return new CallbackProxies.DeviceCaptureCallbackProxy(broadcaster);
}
/**
*
- * Create an internal state callback, to be invoked on the mDeviceHandler
+ * Create an internal state callback, to be invoked on the mDeviceExecutor
*
* <p>It has a few behaviors:
* <ul>
diff --git a/core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java
index 06c2c25ab6bb..89f6172df656 100644
--- a/core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraConstrainedHighSpeedCaptureSessionImpl.java
@@ -33,6 +33,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.concurrent.Executor;
import static com.android.internal.util.Preconditions.*;
@@ -59,14 +60,14 @@ public class CameraConstrainedHighSpeedCaptureSessionImpl
* (e.g. no pending captures, no repeating requests, no flush).</p>
*/
CameraConstrainedHighSpeedCaptureSessionImpl(int id,
- CameraCaptureSession.StateCallback callback, Handler stateHandler,
+ CameraCaptureSession.StateCallback callback, Executor stateExecutor,
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl,
- Handler deviceStateHandler, boolean configureSuccess,
+ Executor deviceStateExecutor, boolean configureSuccess,
CameraCharacteristics characteristics) {
mCharacteristics = characteristics;
CameraCaptureSession.StateCallback wrapperCallback = new WrapperCallback(callback);
mSessionImpl = new CameraCaptureSessionImpl(id, /*input*/null, wrapperCallback,
- stateHandler, deviceImpl, deviceStateHandler, configureSuccess);
+ stateExecutor, deviceImpl, deviceStateExecutor, configureSuccess);
}
@Override
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index 511fa43a5441..1f35f31b68ff 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -18,6 +18,7 @@ package android.hardware.camera2.impl;
import static com.android.internal.util.function.pooled.PooledLambda.obtainRunnable;
+import android.annotation.NonNull;
import android.hardware.ICameraService;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
@@ -35,6 +36,7 @@ import android.hardware.camera2.params.SessionConfiguration;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.hardware.camera2.utils.SubmitInfo;
import android.hardware.camera2.utils.SurfaceUtils;
+import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
@@ -47,6 +49,8 @@ import android.util.Size;
import android.util.SparseArray;
import android.view.Surface;
+import com.android.internal.util.Preconditions;
+
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.Collection;
@@ -58,6 +62,8 @@ import java.util.List;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.Executor;
+
/**
* HAL2.1+ implementation of CameraDevice. Use CameraManager#open to instantiate
@@ -78,7 +84,7 @@ public class CameraDeviceImpl extends CameraDevice
private final StateCallback mDeviceCallback;
private volatile StateCallbackKK mSessionStateCallback;
- private final Handler mDeviceHandler;
+ private final Executor mDeviceExecutor;
private final AtomicBoolean mClosing = new AtomicBoolean();
private boolean mInError = false;
@@ -241,7 +247,7 @@ public class CameraDeviceImpl extends CameraDevice
}
mCameraId = cameraId;
mDeviceCallback = callback;
- mDeviceHandler = handler;
+ mDeviceExecutor = checkAndWrapHandler(handler);
mCharacteristics = characteristics;
mAppTargetSdkVersion = appTargetSdkVersion;
@@ -288,15 +294,15 @@ public class CameraDeviceImpl extends CameraDevice
try {
remoteDeviceBinder.linkToDeath(this, /*flag*/ 0);
} catch (RemoteException e) {
- CameraDeviceImpl.this.mDeviceHandler.post(mCallOnDisconnected);
+ CameraDeviceImpl.this.mDeviceExecutor.execute(mCallOnDisconnected);
throw new CameraAccessException(CameraAccessException.CAMERA_DISCONNECTED,
"The camera device has encountered a serious error");
}
}
- mDeviceHandler.post(mCallOnOpened);
- mDeviceHandler.post(mCallOnUnconfigured);
+ mDeviceExecutor.execute(mCallOnOpened);
+ mDeviceExecutor.execute(mCallOnUnconfigured);
}
}
@@ -335,7 +341,7 @@ public class CameraDeviceImpl extends CameraDevice
final boolean isError = failureIsError;
synchronized(mInterfaceLock) {
mInError = true;
- mDeviceHandler.post(new Runnable() {
+ mDeviceExecutor.execute(new Runnable() {
@Override
public void run() {
if (isError) {
@@ -423,7 +429,7 @@ public class CameraDeviceImpl extends CameraDevice
}
}
- mDeviceHandler.post(mCallOnBusy);
+ mDeviceExecutor.execute(mCallOnBusy);
stopRepeating();
try {
@@ -482,10 +488,10 @@ public class CameraDeviceImpl extends CameraDevice
throw e;
} finally {
if (success && outputs.size() > 0) {
- mDeviceHandler.post(mCallOnIdle);
+ mDeviceExecutor.execute(mCallOnIdle);
} else {
// Always return to the 'unconfigured' state if we didn't hit a fatal error
- mDeviceHandler.post(mCallOnUnconfigured);
+ mDeviceExecutor.execute(mCallOnUnconfigured);
}
}
}
@@ -501,8 +507,9 @@ public class CameraDeviceImpl extends CameraDevice
for (Surface surface : outputs) {
outConfigurations.add(new OutputConfiguration(surface));
}
- createCaptureSessionInternal(null, outConfigurations, callback, handler,
- /*operatingMode*/ICameraDeviceUser.NORMAL_MODE, /*sessionParams*/ null);
+ createCaptureSessionInternal(null, outConfigurations, callback,
+ checkAndWrapHandler(handler), /*operatingMode*/ICameraDeviceUser.NORMAL_MODE,
+ /*sessionParams*/ null);
}
@Override
@@ -517,7 +524,7 @@ public class CameraDeviceImpl extends CameraDevice
// OutputConfiguration objects are immutable, but need to have our own array
List<OutputConfiguration> currentOutputs = new ArrayList<>(outputConfigurations);
- createCaptureSessionInternal(null, currentOutputs, callback, handler,
+ createCaptureSessionInternal(null, currentOutputs, callback, checkAndWrapHandler(handler),
/*operatingMode*/ICameraDeviceUser.NORMAL_MODE, /*sessionParams*/null);
}
@@ -537,8 +544,9 @@ public class CameraDeviceImpl extends CameraDevice
for (Surface surface : outputs) {
outConfigurations.add(new OutputConfiguration(surface));
}
- createCaptureSessionInternal(inputConfig, outConfigurations, callback, handler,
- /*operatingMode*/ICameraDeviceUser.NORMAL_MODE, /*sessionParams*/ null);
+ createCaptureSessionInternal(inputConfig, outConfigurations, callback,
+ checkAndWrapHandler(handler), /*operatingMode*/ICameraDeviceUser.NORMAL_MODE,
+ /*sessionParams*/ null);
}
@Override
@@ -566,8 +574,8 @@ public class CameraDeviceImpl extends CameraDevice
currentOutputs.add(new OutputConfiguration(output));
}
createCaptureSessionInternal(inputConfig, currentOutputs,
- callback, handler, /*operatingMode*/ICameraDeviceUser.NORMAL_MODE,
- /*sessionParams*/ null);
+ callback, checkAndWrapHandler(handler),
+ /*operatingMode*/ICameraDeviceUser.NORMAL_MODE, /*sessionParams*/ null);
}
@Override
@@ -582,7 +590,8 @@ public class CameraDeviceImpl extends CameraDevice
for (Surface surface : outputs) {
outConfigurations.add(new OutputConfiguration(surface));
}
- createCaptureSessionInternal(null, outConfigurations, callback, handler,
+ createCaptureSessionInternal(null, outConfigurations, callback,
+ checkAndWrapHandler(handler),
/*operatingMode*/ICameraDeviceUser.CONSTRAINED_HIGH_SPEED_MODE,
/*sessionParams*/ null);
}
@@ -597,8 +606,8 @@ public class CameraDeviceImpl extends CameraDevice
for (OutputConfiguration output : outputs) {
currentOutputs.add(new OutputConfiguration(output));
}
- createCaptureSessionInternal(inputConfig, currentOutputs, callback, handler, operatingMode,
- /*sessionParams*/ null);
+ createCaptureSessionInternal(inputConfig, currentOutputs, callback,
+ checkAndWrapHandler(handler), operatingMode, /*sessionParams*/ null);
}
@Override
@@ -612,14 +621,17 @@ public class CameraDeviceImpl extends CameraDevice
if (outputConfigs == null) {
throw new IllegalArgumentException("Invalid output configurations");
}
+ if (config.getExecutor() == null) {
+ throw new IllegalArgumentException("Invalid executor");
+ }
createCaptureSessionInternal(config.getInputConfiguration(), outputConfigs,
- config.getStateCallback(), config.getHandler(), config.getSessionType(),
+ config.getStateCallback(), config.getExecutor(), config.getSessionType(),
config.getSessionParameters());
}
private void createCaptureSessionInternal(InputConfiguration inputConfig,
List<OutputConfiguration> outputConfigurations,
- CameraCaptureSession.StateCallback callback, Handler handler,
+ CameraCaptureSession.StateCallback callback, Executor executor,
int operatingMode, CaptureRequest sessionParams) throws CameraAccessException {
synchronized(mInterfaceLock) {
if (DEBUG) {
@@ -673,12 +685,11 @@ public class CameraDeviceImpl extends CameraDevice
SurfaceUtils.checkConstrainedHighSpeedSurfaces(surfaces, /*fpsRange*/null, config);
newSession = new CameraConstrainedHighSpeedCaptureSessionImpl(mNextSessionId++,
- callback, handler, this, mDeviceHandler, configureSuccess,
+ callback, executor, this, mDeviceExecutor, configureSuccess,
mCharacteristics);
} else {
newSession = new CameraCaptureSessionImpl(mNextSessionId++, input,
- callback, handler, this, mDeviceHandler,
- configureSuccess);
+ callback, executor, this, mDeviceExecutor, configureSuccess);
}
// TODO: wait until current session closes, then create the new session
@@ -893,22 +904,22 @@ public class CameraDeviceImpl extends CameraDevice
}
}
- public int capture(CaptureRequest request, CaptureCallback callback, Handler handler)
+ public int capture(CaptureRequest request, CaptureCallback callback, Executor executor)
throws CameraAccessException {
if (DEBUG) {
Log.d(TAG, "calling capture");
}
List<CaptureRequest> requestList = new ArrayList<CaptureRequest>();
requestList.add(request);
- return submitCaptureRequest(requestList, callback, handler, /*streaming*/false);
+ return submitCaptureRequest(requestList, callback, executor, /*streaming*/false);
}
public int captureBurst(List<CaptureRequest> requests, CaptureCallback callback,
- Handler handler) throws CameraAccessException {
+ Executor executor) throws CameraAccessException {
if (requests == null || requests.isEmpty()) {
throw new IllegalArgumentException("At least one request must be given");
}
- return submitCaptureRequest(requests, callback, handler, /*streaming*/false);
+ return submitCaptureRequest(requests, callback, executor, /*streaming*/false);
}
/**
@@ -963,7 +974,12 @@ public class CameraDeviceImpl extends CameraDevice
}
}
};
- holder.getHandler().post(resultDispatch);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ holder.getExecutor().execute(resultDispatch);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
} else {
Log.w(TAG, String.format(
"did not register callback to request %d",
@@ -982,11 +998,11 @@ public class CameraDeviceImpl extends CameraDevice
}
private int submitCaptureRequest(List<CaptureRequest> requestList, CaptureCallback callback,
- Handler handler, boolean repeating) throws CameraAccessException {
+ Executor executor, boolean repeating) throws CameraAccessException {
- // Need a valid handler, or current thread needs to have a looper, if
+ // Need a valid executor, or current thread needs to have a looper, if
// callback is valid
- handler = checkHandler(handler, callback);
+ executor = checkExecutor(executor, callback);
// Make sure that there all requests have at least 1 surface; all surfaces are non-null;
// the surface isn't a physical stream surface for reprocessing request
@@ -1040,7 +1056,7 @@ public class CameraDeviceImpl extends CameraDevice
if (callback != null) {
mCaptureCallbackMap.put(requestInfo.getRequestId(),
new CaptureCallbackHolder(
- callback, requestList, handler, repeating, mNextSessionId - 1));
+ callback, requestList, executor, repeating, mNextSessionId - 1));
} else {
if (DEBUG) {
Log.d(TAG, "Listen for request " + requestInfo.getRequestId() + " is null");
@@ -1059,7 +1075,7 @@ public class CameraDeviceImpl extends CameraDevice
}
if (mIdle) {
- mDeviceHandler.post(mCallOnActive);
+ mDeviceExecutor.execute(mCallOnActive);
}
mIdle = false;
@@ -1068,18 +1084,18 @@ public class CameraDeviceImpl extends CameraDevice
}
public int setRepeatingRequest(CaptureRequest request, CaptureCallback callback,
- Handler handler) throws CameraAccessException {
+ Executor executor) throws CameraAccessException {
List<CaptureRequest> requestList = new ArrayList<CaptureRequest>();
requestList.add(request);
- return submitCaptureRequest(requestList, callback, handler, /*streaming*/true);
+ return submitCaptureRequest(requestList, callback, executor, /*streaming*/true);
}
public int setRepeatingBurst(List<CaptureRequest> requests, CaptureCallback callback,
- Handler handler) throws CameraAccessException {
+ Executor executor) throws CameraAccessException {
if (requests == null || requests.isEmpty()) {
throw new IllegalArgumentException("At least one request must be given");
}
- return submitCaptureRequest(requests, callback, handler, /*streaming*/true);
+ return submitCaptureRequest(requests, callback, executor, /*streaming*/true);
}
public void stopRepeating() throws CameraAccessException {
@@ -1124,12 +1140,12 @@ public class CameraDeviceImpl extends CameraDevice
synchronized(mInterfaceLock) {
checkIfCameraClosedOrInError();
- mDeviceHandler.post(mCallOnBusy);
+ mDeviceExecutor.execute(mCallOnBusy);
// If already idle, just do a busy->idle transition immediately, don't actually
// flush.
if (mIdle) {
- mDeviceHandler.post(mCallOnIdle);
+ mDeviceExecutor.execute(mCallOnIdle);
return;
}
@@ -1157,7 +1173,7 @@ public class CameraDeviceImpl extends CameraDevice
// either a normal close where the remote device is valid
// or a close after a startup error (no remote device but in error state)
if (mRemoteDevice != null || mInError) {
- mDeviceHandler.post(mCallOnClosed);
+ mDeviceExecutor.execute(mCallOnClosed);
}
mRemoteDevice = null;
@@ -1354,7 +1370,7 @@ public class CameraDeviceImpl extends CameraDevice
private final boolean mRepeating;
private final CaptureCallback mCallback;
private final List<CaptureRequest> mRequestList;
- private final Handler mHandler;
+ private final Executor mExecutor;
private final int mSessionId;
/**
* <p>Determine if the callback holder is for a constrained high speed request list that
@@ -1366,13 +1382,13 @@ public class CameraDeviceImpl extends CameraDevice
private final boolean mHasBatchedOutputs;
CaptureCallbackHolder(CaptureCallback callback, List<CaptureRequest> requestList,
- Handler handler, boolean repeating, int sessionId) {
- if (callback == null || handler == null) {
+ Executor executor, boolean repeating, int sessionId) {
+ if (callback == null || executor == null) {
throw new UnsupportedOperationException(
"Must have a valid handler and a valid callback");
}
mRepeating = repeating;
- mHandler = handler;
+ mExecutor = executor;
mRequestList = new ArrayList<CaptureRequest>(requestList);
mCallback = callback;
mSessionId = sessionId;
@@ -1425,8 +1441,8 @@ public class CameraDeviceImpl extends CameraDevice
return getRequest(0);
}
- public Handler getHandler() {
- return mHandler;
+ public Executor getExecutor() {
+ return mExecutor;
}
public int getSessionId() {
@@ -1810,7 +1826,12 @@ public class CameraDeviceImpl extends CameraDevice
}
}
};
- holder.getHandler().post(resultDispatch);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ holder.getExecutor().execute(resultDispatch);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
}
}
@@ -1838,7 +1859,12 @@ public class CameraDeviceImpl extends CameraDevice
switch (errorCode) {
case ERROR_CAMERA_DISCONNECTED:
- CameraDeviceImpl.this.mDeviceHandler.post(mCallOnDisconnected);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ CameraDeviceImpl.this.mDeviceExecutor.execute(mCallOnDisconnected);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
break;
case ERROR_CAMERA_REQUEST:
case ERROR_CAMERA_RESULT:
@@ -1860,8 +1886,13 @@ public class CameraDeviceImpl extends CameraDevice
private void scheduleNotifyError(int code) {
mInError = true;
- CameraDeviceImpl.this.mDeviceHandler.post(obtainRunnable(
- CameraDeviceCallbacks::notifyError, this, code));
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ CameraDeviceImpl.this.mDeviceExecutor.execute(obtainRunnable(
+ CameraDeviceCallbacks::notifyError, this, code));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
private void notifyError(int code) {
@@ -1900,7 +1931,12 @@ public class CameraDeviceImpl extends CameraDevice
if (mRemoteDevice == null) return; // Camera already closed
if (!CameraDeviceImpl.this.mIdle) {
- CameraDeviceImpl.this.mDeviceHandler.post(mCallOnIdle);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ CameraDeviceImpl.this.mDeviceExecutor.execute(mCallOnIdle);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
CameraDeviceImpl.this.mIdle = true;
}
@@ -1929,36 +1965,41 @@ public class CameraDeviceImpl extends CameraDevice
if (isClosed()) return;
// Dispatch capture start notice
- holder.getHandler().post(
- new Runnable() {
- @Override
- public void run() {
- if (!CameraDeviceImpl.this.isClosed()) {
- final int subsequenceId = resultExtras.getSubsequenceId();
- final CaptureRequest request = holder.getRequest(subsequenceId);
-
- if (holder.hasBatchedOutputs()) {
- // Send derived onCaptureStarted for requests within the batch
- final Range<Integer> fpsRange =
- request.get(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE);
- for (int i = 0; i < holder.getRequestCount(); i++) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ holder.getExecutor().execute(
+ new Runnable() {
+ @Override
+ public void run() {
+ if (!CameraDeviceImpl.this.isClosed()) {
+ final int subsequenceId = resultExtras.getSubsequenceId();
+ final CaptureRequest request = holder.getRequest(subsequenceId);
+
+ if (holder.hasBatchedOutputs()) {
+ // Send derived onCaptureStarted for requests within the
+ // batch
+ final Range<Integer> fpsRange =
+ request.get(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE);
+ for (int i = 0; i < holder.getRequestCount(); i++) {
+ holder.getCallback().onCaptureStarted(
+ CameraDeviceImpl.this,
+ holder.getRequest(i),
+ timestamp - (subsequenceId - i) *
+ NANO_PER_SECOND/fpsRange.getUpper(),
+ frameNumber - (subsequenceId - i));
+ }
+ } else {
holder.getCallback().onCaptureStarted(
CameraDeviceImpl.this,
- holder.getRequest(i),
- timestamp - (subsequenceId - i) *
- NANO_PER_SECOND/fpsRange.getUpper(),
- frameNumber - (subsequenceId - i));
+ holder.getRequest(resultExtras.getSubsequenceId()),
+ timestamp, frameNumber);
}
- } else {
- holder.getCallback().onCaptureStarted(
- CameraDeviceImpl.this,
- holder.getRequest(resultExtras.getSubsequenceId()),
- timestamp, frameNumber);
}
}
- }
- });
-
+ });
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
}
@@ -2111,7 +2152,12 @@ public class CameraDeviceImpl extends CameraDevice
finalResult = resultAsCapture;
}
- holder.getHandler().post(resultDispatch);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ holder.getExecutor().execute(resultDispatch);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
// Collect the partials for a total result; or mark the frame as totally completed
mFrameNumberTracker.updateTracker(frameNumber, finalResult, isPartialResult,
@@ -2207,7 +2253,12 @@ public class CameraDeviceImpl extends CameraDevice
}
};
// Dispatch the failure callback
- holder.getHandler().post(failureDispatch);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ holder.getExecutor().execute(failureDispatch);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
} else {
boolean mayHaveBuffers = (errorCode == ERROR_CAMERA_RESULT);
@@ -2247,7 +2298,12 @@ public class CameraDeviceImpl extends CameraDevice
checkAndFireSequenceComplete();
// Dispatch the failure callback
- holder.getHandler().post(failureDispatch);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ holder.getExecutor().execute(failureDispatch);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
}
@@ -2255,6 +2311,62 @@ public class CameraDeviceImpl extends CameraDevice
} // public class CameraDeviceCallbacks
/**
+ * A camera specific adapter {@link Executor} that posts all executed tasks onto the given
+ * {@link Handler}.
+ *
+ * @hide
+ */
+ private static class CameraHandlerExecutor implements Executor {
+ private final Handler mHandler;
+
+ public CameraHandlerExecutor(@NonNull Handler handler) {
+ mHandler = Preconditions.checkNotNull(handler);
+ }
+
+ @Override
+ public void execute(Runnable command) {
+ // Return value of 'post()' will be ignored in order to keep the
+ // same camera behavior. For further details see b/74605221 .
+ mHandler.post(command);
+ }
+ }
+
+ /**
+ * Default executor management.
+ *
+ * <p>
+ * If executor is null, get the current thread's
+ * Looper to create a Executor with. If no looper exists, throw
+ * {@code IllegalArgumentException}.
+ * </p>
+ */
+ static Executor checkExecutor(Executor executor) {
+ return (executor == null) ? checkAndWrapHandler(null) : executor;
+ }
+
+ /**
+ * Default executor management.
+ *
+ * <p>If the callback isn't null, check the executor, otherwise pass it through.</p>
+ */
+ static <T> Executor checkExecutor(Executor executor, T callback) {
+ return (callback != null) ? checkExecutor(executor) : executor;
+ }
+
+ /**
+ * Wrap Handler in Executor.
+ *
+ * <p>
+ * If handler is null, get the current thread's
+ * Looper to create a Executor with. If no looper exists, throw
+ * {@code IllegalArgumentException}.
+ * </p>
+ */
+ public static Executor checkAndWrapHandler(Handler handler) {
+ return new CameraHandlerExecutor(checkHandler(handler));
+ }
+
+ /**
* Default handler management.
*
* <p>
@@ -2328,6 +2440,11 @@ public class CameraDeviceImpl extends CameraDevice
}
}
};
- CameraDeviceImpl.this.mDeviceHandler.post(r);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ CameraDeviceImpl.this.mDeviceExecutor.execute(r);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
}
diff --git a/core/java/android/hardware/camera2/params/SessionConfiguration.java b/core/java/android/hardware/camera2/params/SessionConfiguration.java
index a79a6c17f925..7bdb4a2f1339 100644
--- a/core/java/android/hardware/camera2/params/SessionConfiguration.java
+++ b/core/java/android/hardware/camera2/params/SessionConfiguration.java
@@ -17,10 +17,10 @@
package android.hardware.camera2.params;
+import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.IntDef;
-import android.os.Handler;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
@@ -31,6 +31,7 @@ import android.hardware.camera2.params.OutputConfiguration;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
+import java.util.concurrent.Executor;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -78,7 +79,7 @@ public final class SessionConfiguration {
private List<OutputConfiguration> mOutputConfigurations;
private CameraCaptureSession.StateCallback mStateCallback;
private int mSessionType;
- private Handler mHandler = null;
+ private Executor mExecutor = null;
private InputConfiguration mInputConfig = null;
private CaptureRequest mSessionParameters = null;
@@ -87,10 +88,9 @@ public final class SessionConfiguration {
*
* @param sessionType The session type.
* @param outputs A list of output configurations for the capture session.
+ * @param executor The executor which should be used to invoke the callback. In general it is
+ * recommended that camera operations are not done on the main (UI) thread.
* @param cb A state callback interface implementation.
- * @param handler The handler on which the callback will be invoked. If it is
- * set to null, the callback will be invoked on the current thread's
- * {@link android.os.Looper looper}.
*
* @see #SESSION_REGULAR
* @see #SESSION_HIGH_SPEED
@@ -101,11 +101,12 @@ public final class SessionConfiguration {
*/
public SessionConfiguration(@SessionMode int sessionType,
@NonNull List<OutputConfiguration> outputs,
- @NonNull CameraCaptureSession.StateCallback cb, @Nullable Handler handler) {
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull CameraCaptureSession.StateCallback cb) {
mSessionType = sessionType;
mOutputConfigurations = Collections.unmodifiableList(new ArrayList<>(outputs));
mStateCallback = cb;
- mHandler = handler;
+ mExecutor = executor;
}
/**
@@ -136,14 +137,12 @@ public final class SessionConfiguration {
}
/**
- * Retrieve the {@link CameraCaptureSession.StateCallback} for the capture session.
+ * Retrieve the {@link java.util.concurrent.Executor} for the capture session.
*
- * @return The handler on which the callback will be invoked. If it is
- * set to null, the callback will be invoked on the current thread's
- * {@link android.os.Looper looper}.
+ * @return The Executor on which the callback will be invoked.
*/
- public Handler getHandler() {
- return mHandler;
+ public Executor getExecutor() {
+ return mExecutor;
}
/**
diff --git a/core/java/android/hardware/camera2/utils/TaskDrainer.java b/core/java/android/hardware/camera2/utils/TaskDrainer.java
index ed30ff34afc8..e71f26a18792 100644
--- a/core/java/android/hardware/camera2/utils/TaskDrainer.java
+++ b/core/java/android/hardware/camera2/utils/TaskDrainer.java
@@ -15,11 +15,11 @@
*/
package android.hardware.camera2.utils;
-import android.os.Handler;
import android.util.Log;
import java.util.HashSet;
import java.util.Set;
+import java.util.concurrent.Executor;
import static com.android.internal.util.Preconditions.*;
@@ -55,7 +55,7 @@ public class TaskDrainer<T> {
private static final String TAG = "TaskDrainer";
private final boolean DEBUG = false;
- private final Handler mHandler;
+ private final Executor mExecutor;
private final DrainListener mListener;
private final String mName;
@@ -73,28 +73,27 @@ public class TaskDrainer<T> {
/**
* Create a new task drainer; {@code onDrained} callbacks will be posted to the listener
- * via the {@code handler}.
+ * via the {@code executor}.
*
- * @param handler a non-{@code null} handler to use to post runnables to
+ * @param executor a non-{@code null} executor to use for listener execution
* @param listener a non-{@code null} listener where {@code onDrained} will be called
*/
- public TaskDrainer(Handler handler, DrainListener listener) {
- mHandler = checkNotNull(handler, "handler must not be null");
+ public TaskDrainer(Executor executor, DrainListener listener) {
+ mExecutor = checkNotNull(executor, "executor must not be null");
mListener = checkNotNull(listener, "listener must not be null");
mName = null;
}
/**
* Create a new task drainer; {@code onDrained} callbacks will be posted to the listener
- * via the {@code handler}.
+ * via the {@code executor}.
*
- * @param handler a non-{@code null} handler to use to post runnables to
+ * @param executor a non-{@code null} executor to use for listener execution
* @param listener a non-{@code null} listener where {@code onDrained} will be called
* @param name an optional name used for debug logging
*/
- public TaskDrainer(Handler handler, DrainListener listener, String name) {
- // XX: Probably don't need a handler at all here
- mHandler = checkNotNull(handler, "handler must not be null");
+ public TaskDrainer(Executor executor, DrainListener listener, String name) {
+ mExecutor = checkNotNull(executor, "executor must not be null");
mListener = checkNotNull(listener, "listener must not be null");
mName = name;
}
@@ -200,15 +199,12 @@ public class TaskDrainer<T> {
}
private void postDrained() {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
+ mExecutor.execute(() -> {
if (DEBUG) {
Log.v(TAG + "[" + mName + "]", "onDrained");
}
mListener.onDrained();
- }
});
}
}
diff --git a/core/java/android/hardware/camera2/utils/TaskSingleDrainer.java b/core/java/android/hardware/camera2/utils/TaskSingleDrainer.java
index f6272c9e6a66..9615450be447 100644
--- a/core/java/android/hardware/camera2/utils/TaskSingleDrainer.java
+++ b/core/java/android/hardware/camera2/utils/TaskSingleDrainer.java
@@ -16,7 +16,8 @@
package android.hardware.camera2.utils;
import android.hardware.camera2.utils.TaskDrainer.DrainListener;
-import android.os.Handler;
+
+import java.util.concurrent.Executor;
/**
* Keep track of a single concurrent task starting and finishing;
@@ -38,25 +39,25 @@ public class TaskSingleDrainer {
/**
* Create a new task drainer; {@code onDrained} callbacks will be posted to the listener
- * via the {@code handler}.
+ * via the {@code executor}.
*
- * @param handler a non-{@code null} handler to use to post runnables to
+ * @param executor a non-{@code null} executor to use for listener execution
* @param listener a non-{@code null} listener where {@code onDrained} will be called
*/
- public TaskSingleDrainer(Handler handler, DrainListener listener) {
- mTaskDrainer = new TaskDrainer<>(handler, listener);
+ public TaskSingleDrainer(Executor executor, DrainListener listener) {
+ mTaskDrainer = new TaskDrainer<>(executor, listener);
}
/**
* Create a new task drainer; {@code onDrained} callbacks will be posted to the listener
- * via the {@code handler}.
+ * via the {@code executor}.
*
- * @param handler a non-{@code null} handler to use to post runnables to
+ * @param executor a non-{@code null} executor to use for listener execution
* @param listener a non-{@code null} listener where {@code onDrained} will be called
* @param name an optional name used for debug logging
*/
- public TaskSingleDrainer(Handler handler, DrainListener listener, String name) {
- mTaskDrainer = new TaskDrainer<>(handler, listener, name);
+ public TaskSingleDrainer(Executor executor, DrainListener listener, String name) {
+ mTaskDrainer = new TaskDrainer<>(executor, listener, name);
}
/**
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index e81fbeed34b0..a3b2d22deccb 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -668,6 +668,45 @@ public final class DisplayManager {
}
/**
+ * Gets the global display brightness configuration or the default curve if one hasn't been set.
+ *
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS)
+ public BrightnessConfiguration getBrightnessConfiguration() {
+ return getBrightnessConfigurationForUser(mContext.getUserId());
+ }
+
+ /**
+ * Gets the global display brightness configuration or the default curve if one hasn't been set
+ * for a specific user.
+ *
+ * Note this requires the INTERACT_ACROSS_USERS permission if getting the configuration for a
+ * user other than the one you're currently running as.
+ *
+ * @hide
+ */
+ public BrightnessConfiguration getBrightnessConfigurationForUser(int userId) {
+ return mGlobal.getBrightnessConfigurationForUser(userId);
+ }
+
+ /**
+ * Gets the default global display brightness configuration or null one hasn't
+ * been configured.
+ *
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS)
+ @Nullable
+ public BrightnessConfiguration getDefaultBrightnessConfiguration() {
+ return mGlobal.getDefaultBrightnessConfiguration();
+ }
+
+ /**
* Temporarily sets the brightness of the display.
* <p>
* Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS} permission.
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index d7f7c865b8fb..1f67a6bf71a7 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -490,6 +490,32 @@ public final class DisplayManagerGlobal {
}
/**
+ * Gets the global brightness configuration for a given user or null if one hasn't been set.
+ *
+ * @hide
+ */
+ public BrightnessConfiguration getBrightnessConfigurationForUser(int userId) {
+ try {
+ return mDm.getBrightnessConfigurationForUser(userId);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Gets the default brightness configuration or null if one hasn't been configured.
+ *
+ * @hide
+ */
+ public BrightnessConfiguration getDefaultBrightnessConfiguration() {
+ try {
+ return mDm.getDefaultBrightnessConfiguration();
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Temporarily sets the brightness of the display.
* <p>
* Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS} permission.
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index 0571ae1fe825..9fcb9d3fc265 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -96,6 +96,14 @@ interface IDisplayManager {
void setBrightnessConfigurationForUser(in BrightnessConfiguration c, int userId,
String packageName);
+ // Gets the global brightness configuration for a given user. Requires
+ // CONFIGURE_DISPLAY_BRIGHTNESS, and INTERACT_ACROSS_USER if the user is not
+ // the same as the calling user.
+ BrightnessConfiguration getBrightnessConfigurationForUser(int userId);
+
+ // Gets the default brightness configuration if configured.
+ BrightnessConfiguration getDefaultBrightnessConfiguration();
+
// Temporarily sets the display brightness.
void setTemporaryBrightness(int brightness);
diff --git a/core/java/android/hardware/location/IFusedLocationHardware.aidl b/core/java/android/hardware/location/IFusedLocationHardware.aidl
deleted file mode 100644
index 2ea4d2374958..000000000000
--- a/core/java/android/hardware/location/IFusedLocationHardware.aidl
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2013, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/license/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.location;
-
-import android.hardware.location.IFusedLocationHardwareSink;
-import android.location.FusedBatchOptions;
-
-/**
- * Fused Location hardware interface.
- * This interface is the basic set of supported functionality by Fused Hardware
- * modules that offer Location batching capabilities.
- *
- * @hide
- */
-interface IFusedLocationHardware {
- /**
- * Registers a sink with the Location Hardware object.
- *
- * @param eventSink The sink to register.
- */
- void registerSink(in IFusedLocationHardwareSink eventSink) = 0;
-
- /**
- * Unregisters a sink with the Location Hardware object.
- *
- * @param eventSink The sink to unregister.
- */
- void unregisterSink(in IFusedLocationHardwareSink eventSink) = 1;
-
- /**
- * Provides access to the batch size available in Hardware.
- *
- * @return The batch size the hardware supports.
- */
- int getSupportedBatchSize() = 2;
-
- /**
- * Requests the Hardware to start batching locations.
- *
- * @param id An Id associated with the request.
- * @param batchOptions The options required for batching.
- *
- * @throws RuntimeException if the request Id exists.
- */
- void startBatching(in int id, in FusedBatchOptions batchOptions) = 3;
-
- /**
- * Requests the Hardware to stop batching for the given Id.
- *
- * @param id The request that needs to be stopped.
- * @throws RuntimeException if the request Id is unknown.
- */
- void stopBatching(in int id) = 4;
-
- /**
- * Updates a batching operation in progress.
- *
- * @param id The Id of the operation to update.
- * @param batchOptions The options to apply to the given operation.
- *
- * @throws RuntimeException if the Id of the request is unknown.
- */
- void updateBatchingOptions(in int id, in FusedBatchOptions batchOptions) = 5;
-
- /**
- * Requests the most recent locations available in Hardware.
- * This operation does not dequeue the locations, so still other batching
- * events will continue working.
- *
- * @param batchSizeRequested The number of locations requested.
- */
- void requestBatchOfLocations(in int batchSizeRequested) = 6;
-
- /**
- * Flags if the Hardware supports injection of diagnostic data.
- *
- * @return True if data injection is supported, false otherwise.
- */
- boolean supportsDiagnosticDataInjection() = 7;
-
- /**
- * Injects diagnostic data into the Hardware subsystem.
- *
- * @param data The data to inject.
- * @throws RuntimeException if injection is not supported.
- */
- void injectDiagnosticData(in String data) = 8;
-
- /**
- * Flags if the Hardware supports injection of device context information.
- *
- * @return True if device context injection is supported, false otherwise.
- */
- boolean supportsDeviceContextInjection() = 9;
-
- /**
- * Injects device context information into the Hardware subsystem.
- *
- * @param deviceEnabledContext The context to inject.
- * @throws RuntimeException if injection is not supported.
- */
- void injectDeviceContext(in int deviceEnabledContext) = 10;
-
- /**
- * Requests all batched locations currently available in Hardware
- * and clears the buffer. Any subsequent calls will not return any
- * of the locations returned in this call.
- */
- void flushBatchedLocations() = 11;
-
- /**
- * Returns the version of this FLP HAL implementation.
- */
- int getVersion() = 12;
-}
diff --git a/core/java/android/hardware/location/IFusedLocationHardwareSink.aidl b/core/java/android/hardware/location/IFusedLocationHardwareSink.aidl
deleted file mode 100644
index a7dd0351010d..000000000000
--- a/core/java/android/hardware/location/IFusedLocationHardwareSink.aidl
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2013, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/license/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.location;
-
-import android.location.Location;
-
-/**
- * Fused Location hardware event sink interface.
- * This interface defines the set of events that the FusedLocationHardware provides.
- *
- * @hide
- */
-oneway interface IFusedLocationHardwareSink {
- /**
- * Event generated when a batch of location information is available.
- *
- * @param locations The batch of location information available.
- */
- void onLocationAvailable(in Location[] locations) = 0;
-
- /**
- * Event generated from FLP HAL to provide diagnostic data to the platform.
- *
- * @param data The diagnostic data provided by FLP HAL.
- */
- void onDiagnosticDataAvailable(in String data) = 1;
-
- /**
- * Event generated from FLP HAL to provide a mask of supported
- * capabilities. Should be called immediatly after init.
- */
- void onCapabilities(int capabilities) = 2;
-
- /**
- * Event generated from FLP HAL when the status of location batching
- * changes (location is successful/unsuccessful).
- */
- void onStatusChanged(int status) = 3;
-}
diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java
index b635088cb11b..dde8a3327172 100644
--- a/core/java/android/hardware/soundtrigger/SoundTrigger.java
+++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java
@@ -16,6 +16,14 @@
package android.hardware.soundtrigger;
+import static android.system.OsConstants.EINVAL;
+import static android.system.OsConstants.ENODEV;
+import static android.system.OsConstants.ENOSYS;
+import static android.system.OsConstants.EPERM;
+import static android.system.OsConstants.EPIPE;
+
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.media.AudioFormat;
import android.os.Handler;
import android.os.Parcel;
@@ -25,22 +33,33 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.UUID;
-import static android.system.OsConstants.*;
-
/**
* The SoundTrigger class provides access via JNI to the native service managing
* the sound trigger HAL.
*
* @hide
*/
+@SystemApi
public class SoundTrigger {
+ private SoundTrigger() {
+ }
+
+ /**
+ * Status code used when the operation succeeded
+ */
public static final int STATUS_OK = 0;
+ /** @hide */
public static final int STATUS_ERROR = Integer.MIN_VALUE;
+ /** @hide */
public static final int STATUS_PERMISSION_DENIED = -EPERM;
+ /** @hide */
public static final int STATUS_NO_INIT = -ENODEV;
+ /** @hide */
public static final int STATUS_BAD_VALUE = -EINVAL;
+ /** @hide */
public static final int STATUS_DEAD_OBJECT = -EPIPE;
+ /** @hide */
public static final int STATUS_INVALID_OPERATION = -ENOSYS;
/*****************************************************************************
@@ -48,6 +67,8 @@ public class SoundTrigger {
* managed by the native sound trigger service. Each module has a unique
* ID used to target any API call to this paricular module. Module
* properties are returned by listModules() method.
+ *
+ * @hide
****************************************************************************/
public static class ModuleProperties implements Parcelable {
/** Unique module ID provided by the native service */
@@ -187,6 +208,8 @@ public class SoundTrigger {
* implementation to detect a particular sound pattern.
* A specialized version {@link KeyphraseSoundModel} is defined for key phrase
* sound models.
+ *
+ * @hide
****************************************************************************/
public static class SoundModel {
/** Undefined sound model type */
@@ -261,6 +284,8 @@ public class SoundTrigger {
/*****************************************************************************
* A Keyphrase describes a key phrase that can be detected by a
* {@link KeyphraseSoundModel}
+ *
+ * @hide
****************************************************************************/
public static class Keyphrase implements Parcelable {
/** Unique identifier for this keyphrase */
@@ -382,6 +407,8 @@ public class SoundTrigger {
* A KeyphraseSoundModel is a specialized {@link SoundModel} for key phrases.
* It contains data needed by the hardware to detect a certain number of key phrases
* and the list of corresponding {@link Keyphrase} descriptors.
+ *
+ * @hide
****************************************************************************/
public static class KeyphraseSoundModel extends SoundModel implements Parcelable {
/** Key phrases in this sound model */
@@ -468,6 +495,8 @@ public class SoundTrigger {
/*****************************************************************************
* A GenericSoundModel is a specialized {@link SoundModel} for non-voice sound
* patterns.
+ *
+ * @hide
****************************************************************************/
public static class GenericSoundModel extends SoundModel implements Parcelable {
@@ -524,52 +553,115 @@ public class SoundTrigger {
/**
* Modes for key phrase recognition
*/
- /** Simple recognition of the key phrase */
+
+ /**
+ * Simple recognition of the key phrase
+ *
+ * @hide
+ */
public static final int RECOGNITION_MODE_VOICE_TRIGGER = 0x1;
- /** Trigger only if one user is identified */
+ /**
+ * Trigger only if one user is identified
+ *
+ * @hide
+ */
public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 0x2;
- /** Trigger only if one user is authenticated */
+ /**
+ * Trigger only if one user is authenticated
+ *
+ * @hide
+ */
public static final int RECOGNITION_MODE_USER_AUTHENTICATION = 0x4;
/**
* Status codes for {@link RecognitionEvent}
*/
- /** Recognition success */
+ /**
+ * Recognition success
+ *
+ * @hide
+ */
public static final int RECOGNITION_STATUS_SUCCESS = 0;
- /** Recognition aborted (e.g. capture preempted by anotehr use case */
+ /**
+ * Recognition aborted (e.g. capture preempted by anotehr use case
+ *
+ * @hide
+ */
public static final int RECOGNITION_STATUS_ABORT = 1;
- /** Recognition failure */
+ /**
+ * Recognition failure
+ *
+ * @hide
+ */
public static final int RECOGNITION_STATUS_FAILURE = 2;
/**
* A RecognitionEvent is provided by the
- * {@link StatusListener#onRecognition(RecognitionEvent)}
+ * {@code StatusListener#onRecognition(RecognitionEvent)}
* callback upon recognition success or failure.
*/
- public static class RecognitionEvent implements Parcelable {
- /** Recognition status e.g {@link #RECOGNITION_STATUS_SUCCESS} */
+ public static class RecognitionEvent {
+ /**
+ * Recognition status e.g RECOGNITION_STATUS_SUCCESS
+ *
+ * @hide
+ */
public final int status;
- /** Sound Model corresponding to this event callback */
+ /**
+ *
+ * Sound Model corresponding to this event callback
+ *
+ * @hide
+ */
public final int soundModelHandle;
- /** True if it is possible to capture audio from this utterance buffered by the hardware */
+ /**
+ * True if it is possible to capture audio from this utterance buffered by the hardware
+ *
+ * @hide
+ */
public final boolean captureAvailable;
- /** Audio session ID to be used when capturing the utterance with an AudioRecord
- * if captureAvailable() is true. */
+ /**
+ * Audio session ID to be used when capturing the utterance with an AudioRecord
+ * if captureAvailable() is true.
+ *
+ * @hide
+ */
public final int captureSession;
- /** Delay in ms between end of model detection and start of audio available for capture.
- * A negative value is possible (e.g. if keyphrase is also available for capture) */
+ /**
+ * Delay in ms between end of model detection and start of audio available for capture.
+ * A negative value is possible (e.g. if keyphrase is also available for capture)
+ *
+ * @hide
+ */
public final int captureDelayMs;
- /** Duration in ms of audio captured before the start of the trigger. 0 if none. */
+ /**
+ * Duration in ms of audio captured before the start of the trigger. 0 if none.
+ *
+ * @hide
+ */
public final int capturePreambleMs;
- /** True if the trigger (key phrase capture is present in binary data */
+ /**
+ * True if the trigger (key phrase capture is present in binary data
+ *
+ * @hide
+ */
public final boolean triggerInData;
- /** Audio format of either the trigger in event data or to use for capture of the
- * rest of the utterance */
- public AudioFormat captureFormat;
- /** Opaque data for use by system applications who know about voice engine internals,
- * typically during enrollment. */
+ /**
+ * Audio format of either the trigger in event data or to use for capture of the
+ * rest of the utterance
+ *
+ * @hide
+ */
+ public final AudioFormat captureFormat;
+ /**
+ * Opaque data for use by system applications who know about voice engine internals,
+ * typically during enrollment.
+ *
+ * @hide
+ */
public final byte[] data;
+ /** @hide */
public RecognitionEvent(int status, int soundModelHandle, boolean captureAvailable,
int captureSession, int captureDelayMs, int capturePreambleMs,
boolean triggerInData, AudioFormat captureFormat, byte[] data) {
@@ -584,6 +676,46 @@ public class SoundTrigger {
this.data = data;
}
+ /**
+ * Check if is possible to capture audio from this utterance buffered by the hardware.
+ *
+ * @return {@code true} iff a capturing is possible
+ */
+ public boolean isCaptureAvailable() {
+ return captureAvailable;
+ }
+
+ /**
+ * Get the audio format of either the trigger in event data or to use for capture of the
+ * rest of the utterance
+ *
+ * @return the audio format
+ */
+ @Nullable public AudioFormat getCaptureFormat() {
+ return captureFormat;
+ }
+
+ /**
+ * Get Audio session ID to be used when capturing the utterance with an {@link AudioRecord}
+ * if {@link #isCaptureAvailable()} is true.
+ *
+ * @return The id of the capture session
+ */
+ public int getCaptureSession() {
+ return captureSession;
+ }
+
+ /**
+ * Get the opaque data for use by system applications who know about voice engine
+ * internals, typically during enrollment.
+ *
+ * @return The data of the event
+ */
+ public byte[] getData() {
+ return data;
+ }
+
+ /** @hide */
public static final Parcelable.Creator<RecognitionEvent> CREATOR
= new Parcelable.Creator<RecognitionEvent>() {
public RecognitionEvent createFromParcel(Parcel in) {
@@ -595,6 +727,7 @@ public class SoundTrigger {
}
};
+ /** @hide */
protected static RecognitionEvent fromParcel(Parcel in) {
int status = in.readInt();
int soundModelHandle = in.readInt();
@@ -619,12 +752,12 @@ public class SoundTrigger {
captureDelayMs, capturePreambleMs, triggerInData, captureFormat, data);
}
- @Override
+ /** @hide */
public int describeContents() {
return 0;
}
- @Override
+ /** @hide */
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(status);
dest.writeInt(soundModelHandle);
@@ -726,6 +859,8 @@ public class SoundTrigger {
* A RecognitionConfig is provided to
* {@link SoundTriggerModule#startRecognition(int, RecognitionConfig)} to configure the
* recognition request.
+ *
+ * @hide
*/
public static class RecognitionConfig implements Parcelable {
/** True if the DSP should capture the trigger sound and make it available for further
@@ -744,7 +879,7 @@ public class SoundTrigger {
public final byte[] data;
public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers,
- KeyphraseRecognitionExtra keyphrases[], byte[] data) {
+ KeyphraseRecognitionExtra[] keyphrases, byte[] data) {
this.captureRequested = captureRequested;
this.allowMultipleTriggers = allowMultipleTriggers;
this.keyphrases = keyphrases;
@@ -799,6 +934,8 @@ public class SoundTrigger {
* When used in a {@link RecognitionConfig} it indicates the minimum confidence level that
* should trigger a recognition.
* - The user ID is derived from the system ID {@link android.os.UserHandle#getIdentifier()}.
+ *
+ * @hide
*/
public static class ConfidenceLevel implements Parcelable {
public final int userId;
@@ -872,6 +1009,8 @@ public class SoundTrigger {
/**
* Additional data conveyed by a {@link KeyphraseRecognitionEvent}
* for a key phrase detection.
+ *
+ * @hide
*/
public static class KeyphraseRecognitionExtra implements Parcelable {
/** The keyphrase ID */
@@ -970,8 +1109,10 @@ public class SoundTrigger {
/**
* Specialized {@link RecognitionEvent} for a key phrase detection.
+ *
+ * @hide
*/
- public static class KeyphraseRecognitionEvent extends RecognitionEvent {
+ public static class KeyphraseRecognitionEvent extends RecognitionEvent implements Parcelable {
/** Indicates if the key phrase is present in the buffered audio available for capture */
public final KeyphraseRecognitionExtra[] keyphraseExtras;
@@ -1091,8 +1232,10 @@ public class SoundTrigger {
/**
* Sub-class of RecognitionEvent specifically for sound-trigger based sound
* models(non-keyphrase). Currently does not contain any additional fields.
+ *
+ * @hide
*/
- public static class GenericRecognitionEvent extends RecognitionEvent {
+ public static class GenericRecognitionEvent extends RecognitionEvent implements Parcelable {
public GenericRecognitionEvent(int status, int soundModelHandle,
boolean captureAvailable, int captureSession, int captureDelayMs,
int capturePreambleMs, boolean triggerInData, AudioFormat captureFormat,
@@ -1140,13 +1283,19 @@ public class SoundTrigger {
/**
* Status codes for {@link SoundModelEvent}
*/
- /** Sound Model was updated */
+ /**
+ * Sound Model was updated
+ *
+ * @hide
+ */
public static final int SOUNDMODEL_STATUS_UPDATED = 0;
/**
* A SoundModelEvent is provided by the
* {@link StatusListener#onSoundModelUpdate(SoundModelEvent)}
* callback when a sound model has been updated by the implementation
+ *
+ * @hide
*/
public static class SoundModelEvent implements Parcelable {
/** Status e.g {@link #SOUNDMODEL_STATUS_UPDATED} */
@@ -1231,9 +1380,17 @@ public class SoundTrigger {
* Native service state. {@link StatusListener#onServiceStateChange(int)}
*/
// Keep in sync with system/core/include/system/sound_trigger.h
- /** Sound trigger service is enabled */
+ /**
+ * Sound trigger service is enabled
+ *
+ * @hide
+ */
public static final int SERVICE_STATE_ENABLED = 0;
- /** Sound trigger service is disabled */
+ /**
+ * Sound trigger service is disabled
+ *
+ * @hide
+ */
public static final int SERVICE_STATE_DISABLED = 1;
/**
@@ -1245,6 +1402,8 @@ public class SoundTrigger {
* - {@link #STATUS_NO_INIT} if the native service cannot be reached
* - {@link #STATUS_BAD_VALUE} if modules is null
* - {@link #STATUS_DEAD_OBJECT} if the binder transaction to the native service fails
+ *
+ * @hide
*/
public static native int listModules(ArrayList <ModuleProperties> modules);
@@ -1256,6 +1415,8 @@ public class SoundTrigger {
* @param handler the Handler that will receive the callabcks. Can be null if default handler
* is OK.
* @return a valid sound module in case of success or null in case of error.
+ *
+ * @hide
*/
public static SoundTriggerModule attachModule(int moduleId,
StatusListener listener,
@@ -1270,6 +1431,8 @@ public class SoundTrigger {
/**
* Interface provided by the client application when attaching to a {@link SoundTriggerModule}
* to received recognition and error notifications.
+ *
+ * @hide
*/
public static interface StatusListener {
/**
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 36f359ba04ea..93b1b22690ad 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -1977,13 +1977,6 @@ public class ConnectivityManager {
* services.jar, possibly in com.android.server.net. */
/** {@hide} */
- public static final boolean checkChangePermission(Context context) {
- int uid = Binder.getCallingUid();
- return Settings.checkAndNoteChangeNetworkStateOperation(context, uid, Settings
- .getPackageNameForUid(context, uid), false /* throwException */);
- }
-
- /** {@hide} */
public static final void enforceChangePermission(Context context) {
int uid = Binder.getCallingUid();
Settings.checkAndNoteChangeNetworkStateOperation(context, uid, Settings
diff --git a/core/java/android/net/IIpSecService.aidl b/core/java/android/net/IIpSecService.aidl
index 3ce0283d7f23..3a3ddcc48360 100644
--- a/core/java/android/net/IIpSecService.aidl
+++ b/core/java/android/net/IIpSecService.aidl
@@ -16,6 +16,7 @@
package android.net;
+import android.net.LinkAddress;
import android.net.Network;
import android.net.IpSecConfig;
import android.net.IpSecUdpEncapResponse;
@@ -48,11 +49,11 @@ interface IIpSecService
void addAddressToTunnelInterface(
int tunnelResourceId,
- String localAddr);
+ in LinkAddress localAddr);
void removeAddressFromTunnelInterface(
int tunnelResourceId,
- String localAddr);
+ in LinkAddress localAddr);
void deleteTunnelInterface(int resourceId);
diff --git a/core/java/android/net/IpSecAlgorithm.java b/core/java/android/net/IpSecAlgorithm.java
index c69a4d4c0bee..57f05884ce6d 100644
--- a/core/java/android/net/IpSecAlgorithm.java
+++ b/core/java/android/net/IpSecAlgorithm.java
@@ -38,6 +38,13 @@ public final class IpSecAlgorithm implements Parcelable {
private static final String TAG = "IpSecAlgorithm";
/**
+ * Null cipher.
+ *
+ * @hide
+ */
+ public static final String CRYPT_NULL = "ecb(cipher_null)";
+
+ /**
* AES-CBC Encryption/Ciphering Algorithm.
*
* <p>Valid lengths for this key are {128, 192, 256}.
@@ -122,7 +129,7 @@ public final class IpSecAlgorithm implements Parcelable {
* @param algorithm name of the algorithm.
* @param key key padded to a multiple of 8 bits.
*/
- public IpSecAlgorithm(@AlgorithmName String algorithm, @NonNull byte[] key) {
+ public IpSecAlgorithm(@NonNull @AlgorithmName String algorithm, @NonNull byte[] key) {
this(algorithm, key, key.length * 8);
}
@@ -137,7 +144,8 @@ public final class IpSecAlgorithm implements Parcelable {
* @param key key padded to a multiple of 8 bits.
* @param truncLenBits number of bits of output hash to use.
*/
- public IpSecAlgorithm(@AlgorithmName String algorithm, @NonNull byte[] key, int truncLenBits) {
+ public IpSecAlgorithm(
+ @NonNull @AlgorithmName String algorithm, @NonNull byte[] key, int truncLenBits) {
mName = algorithm;
mKey = key.clone();
mTruncLenBits = truncLenBits;
@@ -145,11 +153,13 @@ public final class IpSecAlgorithm implements Parcelable {
}
/** Get the algorithm name */
+ @NonNull
public String getName() {
return mName;
}
/** Get the key for this algorithm */
+ @NonNull
public byte[] getKey() {
return mKey.clone();
}
@@ -263,6 +273,7 @@ public final class IpSecAlgorithm implements Parcelable {
}
@Override
+ @NonNull
public String toString() {
return new StringBuilder()
.append("{mName=")
diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java
index fbf305633a71..972b9c074690 100644
--- a/core/java/android/net/IpSecManager.java
+++ b/core/java/android/net/IpSecManager.java
@@ -253,8 +253,9 @@ public final class IpSecManager {
* @throws {@link #ResourceUnavailableException} indicating that too many SPIs are
* currently allocated for this user
*/
- public SecurityParameterIndex allocateSecurityParameterIndex(InetAddress destinationAddress)
- throws ResourceUnavailableException {
+ @NonNull
+ public SecurityParameterIndex allocateSecurityParameterIndex(
+ @NonNull InetAddress destinationAddress) throws ResourceUnavailableException {
try {
return new SecurityParameterIndex(
mService,
@@ -280,8 +281,9 @@ public final class IpSecManager {
* @throws {@link #SpiUnavailableException} indicating that the requested SPI could not be
* reserved
*/
+ @NonNull
public SecurityParameterIndex allocateSecurityParameterIndex(
- InetAddress destinationAddress, int requestedSpi)
+ @NonNull InetAddress destinationAddress, int requestedSpi)
throws SpiUnavailableException, ResourceUnavailableException {
if (requestedSpi == IpSecManager.INVALID_SECURITY_PARAMETER_INDEX) {
throw new IllegalArgumentException("Requested SPI must be a valid (non-zero) SPI");
@@ -318,9 +320,8 @@ public final class IpSecManager {
* @param transform a transport mode {@code IpSecTransform}
* @throws IOException indicating that the transform could not be applied
*/
- public void applyTransportModeTransform(
- Socket socket, @PolicyDirection int direction, IpSecTransform transform)
- throws IOException {
+ public void applyTransportModeTransform(@NonNull Socket socket,
+ @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
applyTransportModeTransform(socket.getFileDescriptor$(), direction, transform);
}
@@ -353,9 +354,8 @@ public final class IpSecManager {
* @param transform a transport mode {@code IpSecTransform}
* @throws IOException indicating that the transform could not be applied
*/
- public void applyTransportModeTransform(
- DatagramSocket socket, @PolicyDirection int direction, IpSecTransform transform)
- throws IOException {
+ public void applyTransportModeTransform(@NonNull DatagramSocket socket,
+ @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
applyTransportModeTransform(socket.getFileDescriptor$(), direction, transform);
}
@@ -388,9 +388,8 @@ public final class IpSecManager {
* @param transform a transport mode {@code IpSecTransform}
* @throws IOException indicating that the transform could not be applied
*/
- public void applyTransportModeTransform(
- FileDescriptor socket, @PolicyDirection int direction, IpSecTransform transform)
- throws IOException {
+ public void applyTransportModeTransform(@NonNull FileDescriptor socket,
+ @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
// We dup() the FileDescriptor here because if we don't, then the ParcelFileDescriptor()
// constructor takes control and closes the user's FD when we exit the method.
try (ParcelFileDescriptor pfd = ParcelFileDescriptor.dup(socket)) {
@@ -413,8 +412,7 @@ public final class IpSecManager {
* @param socket a socket that previously had a transform applied to it
* @throws IOException indicating that the transform could not be removed from the socket
*/
- public void removeTransportModeTransforms(Socket socket)
- throws IOException {
+ public void removeTransportModeTransforms(@NonNull Socket socket) throws IOException {
removeTransportModeTransforms(socket.getFileDescriptor$());
}
@@ -431,8 +429,7 @@ public final class IpSecManager {
* @param socket a socket that previously had a transform applied to it
* @throws IOException indicating that the transform could not be removed from the socket
*/
- public void removeTransportModeTransforms(DatagramSocket socket)
- throws IOException {
+ public void removeTransportModeTransforms(@NonNull DatagramSocket socket) throws IOException {
removeTransportModeTransforms(socket.getFileDescriptor$());
}
@@ -449,8 +446,7 @@ public final class IpSecManager {
* @param socket a socket that previously had a transform applied to it
* @throws IOException indicating that the transform could not be removed from the socket
*/
- public void removeTransportModeTransforms(FileDescriptor socket)
- throws IOException {
+ public void removeTransportModeTransforms(@NonNull FileDescriptor socket) throws IOException {
try (ParcelFileDescriptor pfd = ParcelFileDescriptor.dup(socket)) {
mService.removeTransportModeTransforms(pfd);
} catch (RemoteException e) {
@@ -588,6 +584,7 @@ public final class IpSecManager {
// safely usable for Encapsulation without allowing a user to possibly unbind from/close
// the port, which could potentially impact the traffic of the next user who binds to that
// socket.
+ @NonNull
public UdpEncapsulationSocket openUdpEncapsulationSocket(int port)
throws IOException, ResourceUnavailableException {
/*
@@ -617,6 +614,7 @@ public final class IpSecManager {
// safely usable for Encapsulation without allowing a user to possibly unbind from/close
// the port, which could potentially impact the traffic of the next user who binds to that
// socket.
+ @NonNull
public UdpEncapsulationSocket openUdpEncapsulationSocket()
throws IOException, ResourceUnavailableException {
return new UdpEncapsulationSocket(mService, 0);
@@ -645,6 +643,7 @@ public final class IpSecManager {
private int mResourceId = INVALID_RESOURCE_ID;
/** Get the underlying SPI held by this object. */
+ @NonNull
public String getInterfaceName() {
return mInterfaceName;
}
@@ -656,10 +655,16 @@ public final class IpSecManager {
* tunneled traffic.
*
* @param address the local address for traffic inside the tunnel
- * @throws IOException if the address could not be added
* @hide
*/
- public void addAddress(LinkAddress address) throws IOException {
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
+ public void addAddress(@NonNull LinkAddress address) throws IOException {
+ try {
+ mService.addAddressToTunnelInterface(mResourceId, address);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
/**
@@ -668,10 +673,16 @@ public final class IpSecManager {
* <p>Remove an address which was previously added to the IpSecTunnelInterface
*
* @param address to be removed
- * @throws IOException if the address could not be removed
* @hide
*/
- public void removeAddress(LinkAddress address) throws IOException {
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
+ public void removeAddress(@NonNull LinkAddress address) throws IOException {
+ try {
+ mService.removeAddressFromTunnelInterface(mResourceId, address);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
private IpSecTunnelInterface(@NonNull IIpSecService service,
@@ -758,7 +769,8 @@ public final class IpSecManager {
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
+ @NonNull
+ @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
public IpSecTunnelInterface createIpSecTunnelInterface(@NonNull InetAddress localAddress,
@NonNull InetAddress remoteAddress, @NonNull Network underlyingNetwork)
throws ResourceUnavailableException, IOException {
@@ -783,9 +795,9 @@ public final class IpSecManager {
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
- public void applyTunnelModeTransform(IpSecTunnelInterface tunnel,
- @PolicyDirection int direction, IpSecTransform transform) throws IOException {
+ @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
+ public void applyTunnelModeTransform(@NonNull IpSecTunnelInterface tunnel,
+ @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
try {
mService.applyTunnelModeTransform(
tunnel.getResourceId(), direction, transform.getResourceId());
diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java
index 60e96f943401..099fe02fdd75 100644
--- a/core/java/android/net/IpSecTransform.java
+++ b/core/java/android/net/IpSecTransform.java
@@ -282,7 +282,7 @@ public final class IpSecTransform implements AutoCloseable {
*/
@SystemApi
@RequiresPermission(anyOf = {
- android.Manifest.permission.NETWORK_STACK,
+ android.Manifest.permission.MANAGE_IPSEC_TUNNELS,
android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD
})
public void startNattKeepalive(@NonNull NattKeepaliveCallback userCallback,
@@ -325,7 +325,7 @@ public final class IpSecTransform implements AutoCloseable {
*/
@SystemApi
@RequiresPermission(anyOf = {
- android.Manifest.permission.NETWORK_STACK,
+ android.Manifest.permission.MANAGE_IPSEC_TUNNELS,
android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD
})
public void stopNattKeepalive() {
@@ -350,6 +350,7 @@ public final class IpSecTransform implements AutoCloseable {
*
* @param algo {@link IpSecAlgorithm} specifying the encryption to be applied.
*/
+ @NonNull
public IpSecTransform.Builder setEncryption(@NonNull IpSecAlgorithm algo) {
// TODO: throw IllegalArgumentException if algo is not an encryption algorithm.
Preconditions.checkNotNull(algo);
@@ -364,6 +365,7 @@ public final class IpSecTransform implements AutoCloseable {
*
* @param algo {@link IpSecAlgorithm} specifying the authentication to be applied.
*/
+ @NonNull
public IpSecTransform.Builder setAuthentication(@NonNull IpSecAlgorithm algo) {
// TODO: throw IllegalArgumentException if algo is not an authentication algorithm.
Preconditions.checkNotNull(algo);
@@ -384,6 +386,7 @@ public final class IpSecTransform implements AutoCloseable {
* @param algo {@link IpSecAlgorithm} specifying the authenticated encryption algorithm to
* be applied.
*/
+ @NonNull
public IpSecTransform.Builder setAuthenticatedEncryption(@NonNull IpSecAlgorithm algo) {
Preconditions.checkNotNull(algo);
mConfig.setAuthenticatedEncryption(algo);
@@ -403,6 +406,7 @@ public final class IpSecTransform implements AutoCloseable {
* @param remotePort the UDP port number of the remote host that will send and receive
* encapsulated traffic. In the case of IKEv2, this should be port 4500.
*/
+ @NonNull
public IpSecTransform.Builder setIpv4Encapsulation(
@NonNull IpSecManager.UdpEncapsulationSocket localSocket, int remotePort) {
Preconditions.checkNotNull(localSocket);
@@ -436,6 +440,7 @@ public final class IpSecTransform implements AutoCloseable {
* collides with an existing transform
* @throws IOException indicating other errors
*/
+ @NonNull
public IpSecTransform buildTransportModeTransform(
@NonNull InetAddress sourceAddress,
@NonNull IpSecManager.SecurityParameterIndex spi)
@@ -472,7 +477,8 @@ public final class IpSecTransform implements AutoCloseable {
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
+ @NonNull
+ @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
public IpSecTransform buildTunnelModeTransform(
@NonNull InetAddress sourceAddress,
@NonNull IpSecManager.SecurityParameterIndex spi)
diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java
index fdcc304e1d2e..4f92fa6a7340 100644
--- a/core/java/android/net/NetworkRequest.java
+++ b/core/java/android/net/NetworkRequest.java
@@ -24,6 +24,7 @@ import android.text.TextUtils;
import android.util.proto.ProtoOutputStream;
import java.util.Objects;
+import java.util.Set;
/**
* Defines a request for a network, made through {@link NetworkRequest.Builder} and used
@@ -205,6 +206,19 @@ public class NetworkRequest implements Parcelable {
}
/**
+ * Set the watched UIDs for this request. This will be reset and wiped out unless
+ * the calling app holds the CHANGE_NETWORK_STATE permission.
+ *
+ * @param uids The watched UIDs as a set of UidRanges, or null for everything.
+ * @return The builder to facilitate chaining.
+ * @hide
+ */
+ public Builder setUids(Set<UidRange> uids) {
+ mNetworkCapabilities.setUids(uids);
+ return this;
+ }
+
+ /**
* Add a capability that must not exist in the requested network.
* <p>
* If the capability was previously added to the list of required capabilities (for
diff --git a/core/java/android/net/SntpClient.java b/core/java/android/net/SntpClient.java
index ffc735c93aef..66cdc99150a5 100644
--- a/core/java/android/net/SntpClient.java
+++ b/core/java/android/net/SntpClient.java
@@ -80,25 +80,27 @@ public class SntpClient {
*
* @param host host name of the server.
* @param timeout network timeout in milliseconds.
+ * @param network network over which to send the request.
* @return true if the transaction was successful.
*/
- public boolean requestTime(String host, int timeout) {
+ public boolean requestTime(String host, int timeout, Network network) {
InetAddress address = null;
try {
- address = InetAddress.getByName(host);
+ address = network.getByName(host);
} catch (Exception e) {
EventLogTags.writeNtpFailure(host, e.toString());
if (DBG) Log.d(TAG, "request time failed: " + e);
return false;
}
- return requestTime(address, NTP_PORT, timeout);
+ return requestTime(address, NTP_PORT, timeout, network);
}
- public boolean requestTime(InetAddress address, int port, int timeout) {
+ public boolean requestTime(InetAddress address, int port, int timeout, Network network) {
DatagramSocket socket = null;
final int oldTag = TrafficStats.getAndSetThreadStatsTag(TrafficStats.TAG_SYSTEM_NTP);
try {
socket = new DatagramSocket();
+ network.bindSocket(socket);
socket.setSoTimeout(timeout);
byte[] buffer = new byte[NTP_PACKET_SIZE];
DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, port);
@@ -168,6 +170,12 @@ public class SntpClient {
return true;
}
+ @Deprecated
+ public boolean requestTime(String host, int timeout) {
+ Log.w(TAG, "Shame on you for calling the hidden API requestTime()!");
+ return false;
+ }
+
/**
* Returns the time computed from the NTP transaction.
*
diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java
index 5312dcaeb508..f5a7433e9739 100644
--- a/core/java/android/os/BaseBundle.java
+++ b/core/java/android/os/BaseBundle.java
@@ -357,6 +357,23 @@ public class BaseBundle {
}
/**
+ * Does a loose equality check between two given {@link BaseBundle} objects.
+ * Returns {@code true} if both are {@code null}, or if both are equal as per
+ * {@link #kindofEquals(BaseBundle)}
+ *
+ * @param a A {@link BaseBundle} object
+ * @param b Another {@link BaseBundle} to compare with a
+ * @return {@code true} if both are the same, {@code false} otherwise
+ *
+ * @see #kindofEquals(BaseBundle)
+ *
+ * @hide
+ */
+ public static boolean kindofEquals(BaseBundle a, BaseBundle b) {
+ return (a == b) || (a != null && a.kindofEquals(b));
+ }
+
+ /**
* @hide This kind-of does an equality comparison. Kind-of.
*/
public boolean kindofEquals(BaseBundle other) {
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index b16e7d7add0d..f528d63b4844 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -7138,13 +7138,20 @@ public abstract class BatteryStats implements Parcelable {
for (int isvc = serviceStats.size() - 1; isvc >= 0; --isvc) {
final BatteryStats.Uid.Pkg.Serv ss = serviceStats.valueAt(isvc);
+
+ final long startTimeMs = roundUsToMs(ss.getStartTime(batteryUptimeUs, which));
+ final int starts = ss.getStarts(which);
+ final int launches = ss.getLaunches(which);
+ if (startTimeMs == 0 && starts == 0 && launches == 0) {
+ continue;
+ }
+
long sToken = proto.start(UidProto.Package.SERVICES);
proto.write(UidProto.Package.Service.NAME, serviceStats.keyAt(isvc));
- proto.write(UidProto.Package.Service.START_DURATION_MS,
- roundUsToMs(ss.getStartTime(batteryUptimeUs, which)));
- proto.write(UidProto.Package.Service.START_COUNT, ss.getStarts(which));
- proto.write(UidProto.Package.Service.LAUNCH_COUNT, ss.getLaunches(which));
+ proto.write(UidProto.Package.Service.START_DURATION_MS, startTimeMs);
+ proto.write(UidProto.Package.Service.START_COUNT, starts);
+ proto.write(UidProto.Package.Service.LAUNCH_COUNT, launches);
proto.end(sToken);
}
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index 44bd35aa896f..0ae5394e6cb9 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -23,6 +23,7 @@ import android.util.Log;
import android.util.Slog;
import android.util.SparseIntArray;
+import com.android.internal.os.BinderCallsStats;
import com.android.internal.os.BinderInternal;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
@@ -712,6 +713,8 @@ public class Binder implements IBinder {
// Entry point from android_util_Binder.cpp's onTransact
private boolean execTransact(int code, long dataObj, long replyObj,
int flags) {
+ BinderCallsStats binderCallsStats = BinderCallsStats.getInstance();
+ BinderCallsStats.CallSession callSession = binderCallsStats.callStarted(this, code);
Parcel data = Parcel.obtain(dataObj);
Parcel reply = Parcel.obtain(replyObj);
// theoretically, we should call transact, which will call onTransact,
@@ -756,6 +759,7 @@ public class Binder implements IBinder {
// to the main transaction loop to wait for another incoming transaction. Either
// way, strict mode begone!
StrictMode.clearGatheredViolations();
+ binderCallsStats.callEnded(callSession);
return res;
}
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index 1681f11fa526..13e4e38df5f6 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -65,4 +65,7 @@ interface IPowerManager
// sets the attention light (used by phone app only)
void setAttentionLight(boolean on, int color);
+
+ // controls whether PowerManager should doze after the screen turns off or not
+ void setDozeAfterScreenOff(boolean on);
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 66fa6294ecee..c00100b7e0cf 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -1280,6 +1280,19 @@ public final class PowerManager {
}
/**
+ * If true, the doze component is not started until after the screen has been
+ * turned off and the screen off animation has been performed.
+ * @hide
+ */
+ public void setDozeAfterScreenOff(boolean dozeAfterScreenOf) {
+ try {
+ mService.setDozeAfterScreenOff(dozeAfterScreenOf);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns the reason the phone was last shutdown. Calling app must have the
* {@link android.Manifest.permission#DEVICE_POWER} permission to request this information.
* @return Reason for shutdown as an int, {@link #SHUTDOWN_REASON_UNKNOWN} if the file could
diff --git a/core/java/android/privacy/internal/rappor/RapporEncoder.java b/core/java/android/privacy/internal/rappor/RapporEncoder.java
index 9ac2b3e1136e..3bf09ec34bfc 100644
--- a/core/java/android/privacy/internal/rappor/RapporEncoder.java
+++ b/core/java/android/privacy/internal/rappor/RapporEncoder.java
@@ -20,6 +20,10 @@ import android.privacy.DifferentialPrivacyEncoder;
import com.google.android.rappor.Encoder;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;
@@ -66,7 +70,7 @@ public class RapporEncoder implements DifferentialPrivacyEncoder {
random = sSecureRandom;
} else {
// To have deterministic result by hard coding encoder id as seed.
- random = new Random((long) config.mEncoderId.hashCode());
+ random = new Random(getInsecureSeed(config.mEncoderId));
userSecret = INSECURE_SECRET;
}
mEncoder = new Encoder(random, null, null,
@@ -75,6 +79,17 @@ public class RapporEncoder implements DifferentialPrivacyEncoder {
config.mNumCohorts, config.mNumBloomHashes);
}
+ private long getInsecureSeed(String input) {
+ try {
+ MessageDigest digest = MessageDigest.getInstance("SHA-256");
+ byte[] bytes = digest.digest(input.getBytes(StandardCharsets.UTF_8));
+ return ByteBuffer.wrap(bytes).getLong();
+ } catch (NoSuchAlgorithmException e) {
+ // Should not happen
+ throw new AssertionError("Unable generate insecure seed");
+ }
+ }
+
/**
* Create {@link RapporEncoder} with {@link RapporConfig} and user secret provided.
*
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 42fc5429c4c2..18fd67e3ae94 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -783,6 +783,21 @@ public final class Settings {
"android.settings.APPLICATION_DETAILS_SETTINGS";
/**
+ * Activity Action: Show the "Open by Default" page in a particular application's details page.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
+ * <p>
+ * Input: The Intent's data URI specifies the application package name
+ * to be shown, with the "package" scheme. That is "package:com.my.app".
+ * <p>
+ * Output: Nothing.
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_APPLICATION_DETAILS_SETTINGS_OPEN_BY_DEFAULT_PAGE =
+ "android.settings.APPLICATION_DETAILS_SETTINGS_OPEN_BY_DEFAULT_PAGE";
+
+ /**
* Activity Action: Show list of applications that have been running
* foreground services (to the user "running in the background").
* <p>
@@ -7747,6 +7762,37 @@ public final class Settings {
public static final String BLUETOOTH_ON_WHILE_DRIVING = "bluetooth_on_while_driving";
/**
+ * What behavior should be invoked when the volume hush gesture is triggered
+ * One of VOLUME_HUSH_OFF, VOLUME_HUSH_VIBRATE, VOLUME_HUSH_MUTE.
+ *
+ * @hide
+ */
+ public static final String VOLUME_HUSH_GESTURE = "volume_hush_gesture";
+
+ /** @hide */ public static final int VOLUME_HUSH_OFF = 0;
+ /** @hide */ public static final int VOLUME_HUSH_VIBRATE = 1;
+ /** @hide */ public static final int VOLUME_HUSH_MUTE = 2;
+
+ private static final Validator VOLUME_HUSH_GESTURE_VALIDATOR =
+ NON_NEGATIVE_INTEGER_VALIDATOR;
+
+ /**
+ * The number of times (integer) the user has manually enabled battery saver.
+ * @hide
+ */
+ public static final String LOW_POWER_MANUAL_ACTIVATION_COUNT =
+ "low_power_manual_activation_count";
+
+ /**
+ * Whether the "first time battery saver warning" dialog needs to be shown (0: default)
+ * or not (1).
+ *
+ * @hide
+ */
+ public static final String LOW_POWER_WARNING_ACKNOWLEDGED =
+ "low_power_warning_acknowledged";
+
+ /**
* This are the settings to be backed up.
*
* NOTE: Settings are backed up and restored in the order they appear
@@ -7844,6 +7890,7 @@ public final class Settings {
SCREENSAVER_ACTIVATE_ON_SLEEP,
LOCKDOWN_IN_POWER_MENU,
SHOW_FIRST_CRASH_DIALOG_DEV_OPTION,
+ VOLUME_HUSH_GESTURE
};
/**
@@ -7980,6 +8027,7 @@ public final class Settings {
VALIDATORS.put(LOCKDOWN_IN_POWER_MENU, LOCKDOWN_IN_POWER_MENU_VALIDATOR);
VALIDATORS.put(SHOW_FIRST_CRASH_DIALOG_DEV_OPTION,
SHOW_FIRST_CRASH_DIALOG_DEV_OPTION_VALIDATOR);
+ VALIDATORS.put(VOLUME_HUSH_GESTURE, VOLUME_HUSH_GESTURE_VALIDATOR);
VALIDATORS.put(ENABLED_NOTIFICATION_LISTENERS,
ENABLED_NOTIFICATION_LISTENERS_VALIDATOR); //legacy restore setting
VALIDATORS.put(ENABLED_NOTIFICATION_ASSISTANT,
@@ -9619,6 +9667,21 @@ public final class Settings {
public static final String WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED =
"wifi_connected_mac_randomization_enabled";
+ /**
+ * Parameters to adjust the performance of framework wifi scoring methods.
+ * <p>
+ * Encoded as a comma-separated key=value list, for example:
+ * "rssi5=-80:-77:-70:-57,rssi2=-83:-80:-73:-60,horizon=15"
+ * This is intended for experimenting with new parameter values,
+ * and is normally unset or empty. The example does not include all
+ * parameters that may be honored.
+ * Default values are provided by code or device configurations.
+ * Errors in the parameters will cause the entire setting to be ignored.
+ * @hide
+ */
+ public static final String WIFI_SCORE_PARAMS =
+ "wifi_score_params";
+
/**
* 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.
@@ -11579,8 +11642,8 @@ public final class Settings {
*/
@SystemApi
@TestApi
- public static final String AUTOFILL_COMPAT_ALLOWED_PACKAGES =
- "autofill_compat_allowed_packages";
+ public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES =
+ "autofill_compat_mode_allowed_packages";
/**
* Exemptions to the hidden API blacklist.
@@ -11592,6 +11655,24 @@ public final class Settings {
"hidden_api_blacklist_exemptions";
/**
+ * Timeout for a single {@link android.media.soundtrigger.SoundTriggerDetectionService}
+ * operation (in ms).
+ *
+ * @hide
+ */
+ public static final String SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT =
+ "sound_trigger_detection_service_op_timeout";
+
+ /**
+ * Maximum number of {@link android.media.soundtrigger.SoundTriggerDetectionService}
+ * operations per day.
+ *
+ * @hide
+ */
+ public static final String MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY =
+ "max_sound_trigger_detection_service_ops_per_day";
+
+ /**
* Settings to backup. This is here so that it's in the same place as the settings
* keys and easy to update.
*
@@ -12327,6 +12408,16 @@ public final class Settings {
"zram_enabled";
/**
+ * Whether we have enable CPU frequency scaling for this device.
+ * For Wear, default is disable.
+ *
+ * The value is "1" for enable, "0" for disable.
+ * @hide
+ */
+ public static final String CPU_SCALING_ENABLED =
+ "cpu_frequency_scaling_enabled";
+
+ /**
* Configuration flags for smart replies in notifications.
* This is encoded as a key=value list, separated by commas. Ex:
*
@@ -12391,6 +12482,16 @@ public final class Settings {
*/
public static final String BACKUP_AGENT_TIMEOUT_PARAMETERS =
"backup_agent_timeout_parameters";
+
+ /**
+ * Whether we have enabled swapping on this device. For Wear, default is
+ * enabled.
+ *
+ * The value is "1" for enable, "0" for disable.
+ * @hide
+ */
+ public static final String SWAP_ENABLED = "swap_enabled";
+
}
/**
diff --git a/core/java/android/security/keystore/recovery/KeyChainProtectionParams.java b/core/java/android/security/keystore/recovery/KeyChainProtectionParams.java
index 3d3b6d565577..d42424e61030 100644
--- a/core/java/android/security/keystore/recovery/KeyChainProtectionParams.java
+++ b/core/java/android/security/keystore/recovery/KeyChainProtectionParams.java
@@ -52,7 +52,7 @@ import java.util.Arrays;
public final class KeyChainProtectionParams implements Parcelable {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(prefix = {"TYPE_"}, value = {TYPE_LOCKSCREEN, TYPE_CUSTOM_PASSWORD})
+ @IntDef(prefix = {"TYPE_"}, value = {TYPE_LOCKSCREEN})
public @interface UserSecretType {
}
@@ -61,11 +61,6 @@ public final class KeyChainProtectionParams implements Parcelable {
*/
public static final int TYPE_LOCKSCREEN = 100;
- /**
- * Custom passphrase, unrelated to lock screen, is required to recover KeyStore.
- */
- public static final int TYPE_CUSTOM_PASSWORD = 101;
-
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"UI_FORMAT_"}, value = {UI_FORMAT_PIN, UI_FORMAT_PASSWORD, UI_FORMAT_PATTERN})
@@ -120,7 +115,6 @@ public final class KeyChainProtectionParams implements Parcelable {
/**
* @see TYPE_LOCKSCREEN
- * @see TYPE_CUSTOM_PASSWORD
*/
public @UserSecretType int getUserSecretType() {
return mUserSecretType;
@@ -166,7 +160,6 @@ public final class KeyChainProtectionParams implements Parcelable {
* Sets user secret type.
*
* @see TYPE_LOCKSCREEN
- * @see TYPE_CUSTOM_PASSWORD
* @param userSecretType The secret type
* @return This builder.
*/
diff --git a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
index 00f54e16863d..69b9123c3c3e 100644
--- a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
+++ b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
@@ -127,18 +127,13 @@ public final class KeyChainSnapshot implements Parcelable {
/**
* CertPath containing the public key used to encrypt {@code encryptedRecoveryKeyBlob}.
*/
- // TODO: Change to @NonNull
- public CertPath getTrustedHardwareCertPath() {
- if (mCertPath == null) {
- return null;
- } else {
- try {
- return mCertPath.getCertPath();
- } catch (CertificateException e) {
- // Rethrow an unchecked exception as it should not happen. If such an issue exists,
- // an exception should have been thrown during service initialization.
- throw new BadParcelableException(e);
- }
+ public @NonNull CertPath getTrustedHardwareCertPath() {
+ try {
+ return mCertPath.getCertPath();
+ } catch (CertificateException e) {
+ // Rethrow an unchecked exception as it should not happen. If such an issue exists,
+ // an exception should have been thrown during service initialization.
+ throw new BadParcelableException(e);
}
}
@@ -248,13 +243,9 @@ public final class KeyChainSnapshot implements Parcelable {
* @throws CertificateException if the given certificate path cannot be encoded properly
* @return This builder.
*/
- public Builder setTrustedHardwareCertPath(CertPath certPath) throws CertificateException {
- // TODO: Make it NonNull when the caller code is all updated
- if (certPath == null) {
- mInstance.mCertPath = null;
- } else {
- mInstance.mCertPath = RecoveryCertPath.createRecoveryCertPath(certPath);
- }
+ public Builder setTrustedHardwareCertPath(@NonNull CertPath certPath)
+ throws CertificateException {
+ mInstance.mCertPath = RecoveryCertPath.createRecoveryCertPath(certPath);
return this;
}
@@ -282,7 +273,7 @@ public final class KeyChainSnapshot implements Parcelable {
}
/**
- * Sets recovery key blob
+ * Sets recovery key blob.
*
* @param encryptedRecoveryKeyBlob The recovery key blob.
* @return This builder.
@@ -297,7 +288,7 @@ public final class KeyChainSnapshot implements Parcelable {
* Creates a new {@link KeyChainSnapshot} instance.
*
* @return new instance
- * @throws NullPointerException if some required fields were not set.
+ * @throws NullPointerException if some of the required fields were not set.
*/
@NonNull public KeyChainSnapshot build() {
Preconditions.checkCollectionElementsNotNull(mInstance.mKeyChainProtectionParams,
@@ -306,6 +297,7 @@ public final class KeyChainSnapshot implements Parcelable {
"entryRecoveryData");
Preconditions.checkNotNull(mInstance.mEncryptedRecoveryKeyBlob);
Preconditions.checkNotNull(mInstance.mServerParams);
+ Preconditions.checkNotNull(mInstance.mCertPath);
return mInstance;
}
}
diff --git a/core/java/android/security/keystore/recovery/KeyDerivationParams.java b/core/java/android/security/keystore/recovery/KeyDerivationParams.java
index ef5e90c89944..8cb8e5162f16 100644
--- a/core/java/android/security/keystore/recovery/KeyDerivationParams.java
+++ b/core/java/android/security/keystore/recovery/KeyDerivationParams.java
@@ -37,40 +37,66 @@ import java.lang.annotation.RetentionPolicy;
@SystemApi
public final class KeyDerivationParams implements Parcelable {
private final int mAlgorithm;
- private byte[] mSalt;
+ private final byte[] mSalt;
+ private final int mMemoryDifficulty;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(prefix = {"ALGORITHM_"}, value = {ALGORITHM_SHA256, ALGORITHM_ARGON2ID})
+ @IntDef(prefix = {"ALGORITHM_"}, value = {ALGORITHM_SHA256, ALGORITHM_SCRYPT})
public @interface KeyDerivationAlgorithm {
}
/**
- * Salted SHA256
+ * Salted SHA256.
*/
public static final int ALGORITHM_SHA256 = 1;
/**
- * Argon2ID
- * @hide
+ * SCRYPT.
*/
- // TODO: add Argon2ID support.
- public static final int ALGORITHM_ARGON2ID = 2;
+ public static final int ALGORITHM_SCRYPT = 2;
/**
- * Creates instance of the class to to derive key using salted SHA256 hash.
+ * Creates instance of the class to to derive keys using salted SHA256 hash.
+ *
+ * <p>The salted SHA256 hash is computed over the concatenation of four byte strings, salt_len +
+ * salt + key_material_len + key_material, where salt_len and key_material_len are one-byte, and
+ * denote the number of bytes for salt and key_material, respectively.
*/
public static KeyDerivationParams createSha256Params(@NonNull byte[] salt) {
return new KeyDerivationParams(ALGORITHM_SHA256, salt);
}
/**
+ * Creates instance of the class to to derive keys using the password hashing algorithm SCRYPT.
+ *
+ * <p>We expose only one tuning parameter of SCRYPT, which is the memory cost parameter (i.e. N
+ * in <a href="https://www.tarsnap.com/scrypt/scrypt.pdf">the SCRYPT paper</a>). Regular/default
+ * values are used for the other parameters, to keep the overall running time low. Specifically,
+ * the parallelization parameter p is 1, the block size parameter r is 8, and the hashing output
+ * length is 32-byte.
+ */
+ public static KeyDerivationParams createScryptParams(
+ @NonNull byte[] salt, int memoryDifficulty) {
+ return new KeyDerivationParams(ALGORITHM_SCRYPT, salt, memoryDifficulty);
+ }
+
+ /**
* @hide
*/
// TODO: Make private once legacy API is removed
public KeyDerivationParams(@KeyDerivationAlgorithm int algorithm, @NonNull byte[] salt) {
+ this(algorithm, salt, /*memoryDifficulty=*/ -1);
+ }
+
+ /**
+ * @hide
+ */
+ KeyDerivationParams(@KeyDerivationAlgorithm int algorithm, @NonNull byte[] salt,
+ int memoryDifficulty) {
mAlgorithm = algorithm;
mSalt = Preconditions.checkNotNull(salt);
+ mMemoryDifficulty = memoryDifficulty;
}
/**
@@ -87,6 +113,19 @@ public final class KeyDerivationParams implements Parcelable {
return mSalt;
}
+ /**
+ * Gets the memory difficulty parameter for the hashing algorithm.
+ *
+ * <p>The effect of this parameter depends on the algorithm in use. For example, please see
+ * {@link #createScryptParams(byte[], int)} for choosing the parameter for SCRYPT.
+ *
+ * <p>If the specific algorithm does not support such a memory difficulty parameter, its value
+ * should be -1.
+ */
+ public int getMemoryDifficulty() {
+ return mMemoryDifficulty;
+ }
+
public static final Parcelable.Creator<KeyDerivationParams> CREATOR =
new Parcelable.Creator<KeyDerivationParams>() {
public KeyDerivationParams createFromParcel(Parcel in) {
@@ -102,6 +141,7 @@ public final class KeyDerivationParams implements Parcelable {
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mAlgorithm);
out.writeByteArray(mSalt);
+ out.writeInt(mMemoryDifficulty);
}
/**
@@ -110,6 +150,7 @@ public final class KeyDerivationParams implements Parcelable {
protected KeyDerivationParams(Parcel in) {
mAlgorithm = in.readInt();
mSalt = in.createByteArray();
+ mMemoryDifficulty = in.readInt();
}
@Override
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index 7523afdf8041..843b9da9a828 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -35,6 +35,7 @@ import java.security.Key;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertPath;
import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -265,8 +266,8 @@ public class RecoveryController {
/**
* Sets a listener which notifies recovery agent that new recovery snapshot is available. {@link
- * #getRecoveryData} can be used to get the snapshot. Note that every recovery agent can have at
- * most one registered listener at any time.
+ * #getKeyChainSnapshot} can be used to get the snapshot. Note that every recovery agent can
+ * have at most one registered listener at any time.
*
* @param intent triggered when new snapshot is available. Unregisters listener if the value is
* {@code null}.
@@ -291,12 +292,13 @@ public class RecoveryController {
* in vaultParams {@link RecoverySession#start(CertPath, byte[], byte[], List)}.
*
* @param serverParams included in recovery key blob.
- * @see #getRecoveryData
+ * @see #getKeyChainSnapshot
* @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
* service.
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
- public void setServerParams(byte[] serverParams) throws InternalRecoveryServiceException {
+ public void setServerParams(@NonNull byte[] serverParams)
+ throws InternalRecoveryServiceException {
try {
mBinder.setServerParams(serverParams);
} catch (RemoteException e) {
@@ -320,7 +322,7 @@ public class RecoveryController {
* Returns a list of aliases of keys belonging to the application.
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
- public List<String> getAliases() throws InternalRecoveryServiceException {
+ public @NonNull List<String> getAliases() throws InternalRecoveryServiceException {
try {
Map<String, Integer> allStatuses = mBinder.getRecoveryStatus();
return new ArrayList<>(allStatuses.keySet());
@@ -354,7 +356,7 @@ public class RecoveryController {
* service.
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
- public void setRecoveryStatus(String alias, int status)
+ public void setRecoveryStatus(@NonNull String alias, int status)
throws InternalRecoveryServiceException {
try {
mBinder.setRecoveryStatus(alias, status);
@@ -389,7 +391,7 @@ public class RecoveryController {
* service.
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
- public int getRecoveryStatus(String alias) throws InternalRecoveryServiceException {
+ public int getRecoveryStatus(@NonNull String alias) throws InternalRecoveryServiceException {
try {
Map<String, Integer> allStatuses = mBinder.getRecoveryStatus();
Integer status = allStatuses.get(alias);
@@ -409,8 +411,7 @@ public class RecoveryController {
* Specifies a set of secret types used for end-to-end keystore encryption. Knowing all of them
* is necessary to recover data.
*
- * @param secretTypes {@link KeyChainProtectionParams#TYPE_LOCKSCREEN} or {@link
- * KeyChainProtectionParams#TYPE_CUSTOM_PASSWORD}
+ * @param secretTypes {@link KeyChainProtectionParams#TYPE_LOCKSCREEN}
* @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
* service.
*/
@@ -449,51 +450,6 @@ public class RecoveryController {
}
/**
- * Returns a list of recovery secret types, necessary to create a pending recovery snapshot.
- * When user enters a secret of a pending type {@link #recoverySecretAvailable} should be
- * called.
- *
- * @return list of recovery secret types
- * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
- * service.
- */
- @NonNull
- @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
- public @KeyChainProtectionParams.UserSecretType int[] getPendingRecoverySecretTypes()
- throws InternalRecoveryServiceException {
- try {
- return mBinder.getPendingRecoverySecretTypes();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (ServiceSpecificException e) {
- throw wrapUnexpectedServiceSpecificException(e);
- }
- }
-
- /**
- * Method notifies KeyStore that a user-generated secret is available. This method generates a
- * symmetric session key which a trusted remote device can use to return a recovery key. Caller
- * should use {@link KeyChainProtectionParams#clearSecret} to override the secret value in
- * memory.
- *
- * @param recoverySecret user generated secret together with parameters necessary to regenerate
- * it on a new device.
- * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
- * service.
- */
- @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
- public void recoverySecretAvailable(@NonNull KeyChainProtectionParams recoverySecret)
- throws InternalRecoveryServiceException {
- try {
- mBinder.recoverySecretAvailable(recoverySecret);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (ServiceSpecificException e) {
- throw wrapUnexpectedServiceSpecificException(e);
- }
- }
-
- /**
* Deprecated.
* Generates a AES256/GCM/NoPADDING key called {@code alias} and loads it into the recoverable
* key store. Returns the raw material of the key.
@@ -547,10 +503,7 @@ public class RecoveryController {
if (grantAlias == null) {
throw new InternalRecoveryServiceException("null grant alias");
}
- return AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(
- mKeyStore,
- grantAlias,
- KeyStore.UID_SELF);
+ return getKeyFromGrant(grantAlias);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (UnrecoverableKeyException e) {
@@ -581,10 +534,7 @@ public class RecoveryController {
if (grantAlias == null) {
throw new InternalRecoveryServiceException("Null grant alias");
}
- return AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(
- mKeyStore,
- grantAlias,
- KeyStore.UID_SELF);
+ return getKeyFromGrant(grantAlias);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (UnrecoverableKeyException e) {
@@ -611,13 +561,10 @@ public class RecoveryController {
throws InternalRecoveryServiceException, UnrecoverableKeyException {
try {
String grantAlias = mBinder.getKey(alias);
- if (grantAlias == null) {
+ if (grantAlias == null || "".equals(grantAlias)) {
return null;
}
- return AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(
- mKeyStore,
- grantAlias,
- KeyStore.UID_SELF);
+ return getKeyFromGrant(grantAlias);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (ServiceSpecificException e) {
@@ -626,6 +573,16 @@ public class RecoveryController {
}
/**
+ * Returns the key with the given {@code grantAlias}.
+ */
+ Key getKeyFromGrant(String grantAlias) throws UnrecoverableKeyException {
+ return AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(
+ mKeyStore,
+ grantAlias,
+ KeyStore.UID_SELF);
+ }
+
+ /**
* Removes a key called {@code alias} from the recoverable key store.
*
* @param alias The key alias.
@@ -649,10 +606,15 @@ public class RecoveryController {
* <p>A recovery session is required to restore keys from a remote store.
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
- public RecoverySession createRecoverySession() {
+ public @NonNull RecoverySession createRecoverySession() {
return RecoverySession.newInstance(this);
}
+ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
+ public Map<String, X509Certificate> getRootCertificates() {
+ return TrustedRootCertificates.getRootCertificates();
+ }
+
InternalRecoveryServiceException wrapUnexpectedServiceSpecificException(
ServiceSpecificException e) {
if (e.errorCode == ERROR_SERVICE_INTERNAL_ERROR) {
diff --git a/core/java/android/security/keystore/recovery/RecoverySession.java b/core/java/android/security/keystore/recovery/RecoverySession.java
index 137dd8946c9a..cf8a9ddf257e 100644
--- a/core/java/android/security/keystore/recovery/RecoverySession.java
+++ b/core/java/android/security/keystore/recovery/RecoverySession.java
@@ -16,17 +16,22 @@
package android.security.keystore.recovery;
+import android.Manifest;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
+import android.util.ArrayMap;
import android.util.Log;
+import java.security.Key;
import java.security.SecureRandom;
+import java.security.UnrecoverableKeyException;
import java.security.cert.CertPath;
import java.security.cert.CertificateException;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
/**
@@ -44,7 +49,8 @@ public class RecoverySession implements AutoCloseable {
private final String mSessionId;
private final RecoveryController mRecoveryController;
- private RecoverySession(RecoveryController recoveryController, String sessionId) {
+ private RecoverySession(@NonNull RecoveryController recoveryController,
+ @NonNull String sessionId) {
mRecoveryController = recoveryController;
mSessionId = sessionId;
}
@@ -53,14 +59,14 @@ public class RecoverySession implements AutoCloseable {
* A new session, started by the {@link RecoveryController}.
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
- static RecoverySession newInstance(RecoveryController recoveryController) {
+ static @NonNull RecoverySession newInstance(RecoveryController recoveryController) {
return new RecoverySession(recoveryController, newSessionId());
}
/**
* Returns a new random session ID.
*/
- private static String newSessionId() {
+ private static @NonNull String newSessionId() {
SecureRandom secureRandom = new SecureRandom();
byte[] sessionId = new byte[SESSION_ID_LENGTH_BYTES];
secureRandom.nextBytes(sessionId);
@@ -72,7 +78,7 @@ public class RecoverySession implements AutoCloseable {
}
/**
- * @deprecated Use {@link #start(CertPath, byte[], byte[], List)} instead.
+ * @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead.
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -103,10 +109,47 @@ public class RecoverySession implements AutoCloseable {
}
/**
+ * @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead.
+ */
+ @Deprecated
+ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
+ @NonNull public byte[] start(
+ @NonNull CertPath verifierCertPath,
+ @NonNull byte[] vaultParams,
+ @NonNull byte[] vaultChallenge,
+ @NonNull List<KeyChainProtectionParams> secrets)
+ throws CertificateException, InternalRecoveryServiceException {
+ // Wrap the CertPath in a Parcelable so it can be passed via Binder calls.
+ RecoveryCertPath recoveryCertPath =
+ RecoveryCertPath.createRecoveryCertPath(verifierCertPath);
+ try {
+ byte[] recoveryClaim =
+ mRecoveryController.getBinder().startRecoverySessionWithCertPath(
+ mSessionId,
+ /*rootCertificateAlias=*/ "", // Use the default root cert
+ recoveryCertPath,
+ vaultParams,
+ vaultChallenge,
+ secrets);
+ return recoveryClaim;
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } catch (ServiceSpecificException e) {
+ if (e.errorCode == RecoveryController.ERROR_BAD_CERTIFICATE_FORMAT
+ || e.errorCode == RecoveryController.ERROR_INVALID_CERTIFICATE) {
+ throw new CertificateException(e.getMessage());
+ }
+ throw mRecoveryController.wrapUnexpectedServiceSpecificException(e);
+ }
+ }
+
+ /**
* Starts a recovery session and returns a blob with proof of recovery secret possession.
* The method generates a symmetric key for a session, which trusted remote device can use to
* return recovery key.
*
+ * @param rootCertificateAlias The alias of the root certificate that is already in the Android
+ * OS. The root certificate will be used for validating {@code verifierCertPath}.
* @param verifierCertPath The certificate path used to create the recovery blob on the source
* device. Keystore will verify the certificate path by using the root of trust.
* @param vaultParams Must match the parameters in the corresponding field in the recovery blob.
@@ -124,6 +167,7 @@ public class RecoverySession implements AutoCloseable {
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@NonNull public byte[] start(
+ @NonNull String rootCertificateAlias,
@NonNull CertPath verifierCertPath,
@NonNull byte[] vaultParams,
@NonNull byte[] vaultChallenge,
@@ -136,6 +180,7 @@ public class RecoverySession implements AutoCloseable {
byte[] recoveryClaim =
mRecoveryController.getBinder().startRecoverySessionWithCertPath(
mSessionId,
+ rootCertificateAlias,
recoveryCertPath,
vaultParams,
vaultChallenge,
@@ -153,17 +198,9 @@ public class RecoverySession implements AutoCloseable {
}
/**
- * Imports keys.
- *
- * @param recoveryKeyBlob Recovery blob encrypted by symmetric key generated for this session.
- * @param applicationKeys Application keys. Key material can be decrypted using recoveryKeyBlob
- * and session. KeyStore only uses package names from the application info in {@link
- * WrappedApplicationKey}. Caller is responsibility to perform certificates check.
- * @return Map from alias to raw key material.
- * @throws SessionExpiredException if {@code session} has since been closed.
- * @throws DecryptionFailedException if unable to decrypt the snapshot.
- * @throws InternalRecoveryServiceException if an error occurs internal to the recovery service.
+ * @deprecated Use {@link #recoverKeyChainSnapshot(byte[], List)} instead.
*/
+ @Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
public Map<String, byte[]> recoverKeys(
@NonNull byte[] recoveryKeyBlob,
@@ -187,6 +224,61 @@ public class RecoverySession implements AutoCloseable {
}
/**
+ * Imports key chain snapshot recovered from a remote vault.
+ *
+ * @param recoveryKeyBlob Recovery blob encrypted by symmetric key generated for this session.
+ * @param applicationKeys Application keys. Key material can be decrypted using recoveryKeyBlob
+ * and session.
+ * @throws SessionExpiredException if {@code session} has since been closed.
+ * @throws DecryptionFailedException if unable to decrypt the snapshot.
+ * @throws InternalRecoveryServiceException if an error occurs internal to the recovery service.
+ */
+ @RequiresPermission(Manifest.permission.RECOVER_KEYSTORE)
+ public Map<String, Key> recoverKeyChainSnapshot(
+ @NonNull byte[] recoveryKeyBlob,
+ @NonNull List<WrappedApplicationKey> applicationKeys
+ ) throws SessionExpiredException, DecryptionFailedException, InternalRecoveryServiceException {
+ try {
+ Map<String, String> grantAliases = mRecoveryController
+ .getBinder()
+ .recoverKeyChainSnapshot(mSessionId, recoveryKeyBlob, applicationKeys);
+ return getKeysFromGrants(grantAliases);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } catch (ServiceSpecificException e) {
+ if (e.errorCode == RecoveryController.ERROR_DECRYPTION_FAILED) {
+ throw new DecryptionFailedException(e.getMessage());
+ }
+ if (e.errorCode == RecoveryController.ERROR_SESSION_EXPIRED) {
+ throw new SessionExpiredException(e.getMessage());
+ }
+ throw mRecoveryController.wrapUnexpectedServiceSpecificException(e);
+ }
+ }
+
+ /** Given a map from alias to grant alias, returns a map from alias to a {@link Key} handle. */
+ private Map<String, Key> getKeysFromGrants(Map<String, String> grantAliases)
+ throws InternalRecoveryServiceException {
+ ArrayMap<String, Key> keysByAlias = new ArrayMap<>(grantAliases.size());
+ for (String alias : grantAliases.keySet()) {
+ String grantAlias = grantAliases.get(alias);
+ Key key;
+ try {
+ key = mRecoveryController.getKeyFromGrant(grantAlias);
+ } catch (UnrecoverableKeyException e) {
+ throw new InternalRecoveryServiceException(
+ String.format(
+ Locale.US,
+ "Failed to get key '%s' from grant '%s'",
+ alias,
+ grantAlias), e);
+ }
+ keysByAlias.put(alias, key);
+ }
+ return keysByAlias;
+ }
+
+ /**
* An internal session ID, used by the framework to match recovery claims to snapshot responses.
*
* @hide
diff --git a/core/java/android/security/backup/TrustedRootCertificates.java b/core/java/android/security/keystore/recovery/TrustedRootCertificates.java
index ed922eda4d10..a65b40f7b10c 100644
--- a/core/java/android/security/backup/TrustedRootCertificates.java
+++ b/core/java/android/security/keystore/recovery/TrustedRootCertificates.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package android.security.backup;
+package android.security.keystore.recovery;
-import static android.security.backup.X509CertificateParsingUtils.decodeBase64Cert;
+import static android.security.keystore.recovery.X509CertificateParsingUtils.decodeBase64Cert;
import android.util.ArrayMap;
@@ -32,7 +32,7 @@ import java.util.Map;
*
* @hide
*/
-public class TrustedRootCertificates {
+public final class TrustedRootCertificates {
public static final String GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS =
"GoogleCloudKeyVaultServiceV1";
@@ -77,10 +77,27 @@ public class TrustedRootCertificates {
private static final int NUMBER_OF_ROOT_CERTIFICATES = 1;
+ private static final ArrayMap<String, X509Certificate> ALL_ROOT_CERTIFICATES =
+ constructRootCertificateMap();
+
/**
* Returns all available root certificates, keyed by alias.
*/
- public static Map<String, X509Certificate> listRootCertificates() {
+ public static Map<String, X509Certificate> getRootCertificates() {
+ return new ArrayMap(ALL_ROOT_CERTIFICATES);
+ }
+
+ /**
+ * Gets a root certificate referenced by the given {@code alias}.
+ *
+ * @param alias the alias of the certificate
+ * @return the certificate referenced by the alias, or null if such a certificate doesn't exist.
+ */
+ public static X509Certificate getRootCertificate(String alias) {
+ return ALL_ROOT_CERTIFICATES.get(alias);
+ }
+
+ private static ArrayMap<String, X509Certificate> constructRootCertificateMap() {
ArrayMap<String, X509Certificate> certificates =
new ArrayMap<>(NUMBER_OF_ROOT_CERTIFICATES);
certificates.put(
@@ -97,4 +114,7 @@ public class TrustedRootCertificates {
throw new RuntimeException(e);
}
}
+
+ // Statics only
+ private TrustedRootCertificates() {}
}
diff --git a/core/java/android/security/backup/X509CertificateParsingUtils.java b/core/java/android/security/keystore/recovery/X509CertificateParsingUtils.java
index 30495decd917..fa72c836b5df 100644
--- a/core/java/android/security/backup/X509CertificateParsingUtils.java
+++ b/core/java/android/security/keystore/recovery/X509CertificateParsingUtils.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.security.backup;
+package android.security.keystore.recovery;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java
index 41e41819526f..60537a4ca3ec 100644
--- a/core/java/android/service/autofill/AutofillService.java
+++ b/core/java/android/service/autofill/AutofillService.java
@@ -518,7 +518,7 @@ import android.view.autofill.AutofillValue;
* &lt;intent-filter&gt;
* &lt;action android:name="android.service.autofill.AutofillService" /&gt;
* &lt;/intent-filter&gt;
- * &lt;meta-data android:name="android.autofillservice" android:resource="@xml/autofillservice" /&gt;
+ * &lt;meta-data android:name="android.autofill" android:resource="@xml/autofillservice" /&gt;
* &lt;/service&gt;</pre>
*
* <P>In the XML file you can specify one or more packages for which to enable compatibility
@@ -527,6 +527,9 @@ import android.view.autofill.AutofillValue;
* <pre> &lt;autofill-service xmlns:android="http://schemas.android.com/apk/res/android"&gt;
* &lt;compatibility-package android:name="foo.bar.baz" android:maxLongVersionCode="1000000000"/&gt;
* &lt;/autofill-service&gt;</pre>
+ *
+ * <p>When using compatibility mode, the {@link SaveInfo.Builder#setFlags(int) SaveInfo flags}
+ * automatically include {@link SaveInfo#FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE}.
*/
public abstract class AutofillService extends Service {
private static final String TAG = "AutofillService";
diff --git a/core/java/android/service/autofill/AutofillServiceHelper.java b/core/java/android/service/autofill/AutofillServiceHelper.java
new file mode 100644
index 000000000000..bbaebff439fb
--- /dev/null
+++ b/core/java/android/service/autofill/AutofillServiceHelper.java
@@ -0,0 +1,35 @@
+/*
+ * 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.service.autofill;
+
+import android.annotation.Nullable;
+import android.view.autofill.AutofillId;
+
+import com.android.internal.util.Preconditions;
+
+/** @hide */
+final class AutofillServiceHelper {
+
+ static AutofillId[] assertValid(@Nullable AutofillId[] ids) {
+ Preconditions.checkArgument(ids != null && ids.length > 0, "must have at least one id");
+ return Preconditions.checkArrayElementsNotNull(ids, "ids");
+ }
+
+ private AutofillServiceHelper() {
+ throw new UnsupportedOperationException("contains static members only");
+ }
+}
diff --git a/core/java/android/service/autofill/AutofillServiceInfo.java b/core/java/android/service/autofill/AutofillServiceInfo.java
index de234559d53e..b7ec281993df 100644
--- a/core/java/android/service/autofill/AutofillServiceInfo.java
+++ b/core/java/android/service/autofill/AutofillServiceInfo.java
@@ -198,14 +198,6 @@ public final class AutofillServiceInfo {
} else {
maxVersionCode = Long.MAX_VALUE;
}
- if (true) { // TODO(b/74445943): remove block after P DP2 is branched
- final String urlBarResourceId = cpAttributes.getString(
- R.styleable.AutofillService_CompatibilityPackage_urlBarResourceId);
- if (urlBarResourceId != null) {
- Log.e(TAG, "Service is using deprecated attribute 'urlBarResourceId'");
- }
- }
-
if (compatibilityPackages == null) {
compatibilityPackages = new ArrayMap<>();
}
diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java
index f32dee1ec9f2..ccec483d046b 100644
--- a/core/java/android/service/autofill/Dataset.java
+++ b/core/java/android/service/autofill/Dataset.java
@@ -149,24 +149,33 @@ public final class Dataset implements Parcelable {
public String toString() {
if (!sDebug) return super.toString();
- final StringBuilder builder = new StringBuilder("Dataset[id=");
+ final StringBuilder builder = new StringBuilder("Dataset[");
if (mId == null) {
- builder.append("null");
+ builder.append("noId");
} else {
// Cannot disclose id because it could contain PII.
- builder.append(mId.length()).append("_chars");
+ builder.append("id=").append(mId.length()).append("_chars");
}
+ if (mFieldIds != null) {
+ builder.append(", fieldIds=").append(mFieldIds);
+ }
+ if (mFieldValues != null) {
+ builder.append(", fieldValues=").append(mFieldValues);
+ }
+ if (mFieldPresentations != null) {
+ builder.append(", fieldPresentations=").append(mFieldPresentations.size());
- return builder
- .append(", fieldIds=").append(mFieldIds)
- .append(", fieldValues=").append(mFieldValues)
- .append(", fieldPresentations=")
- .append(mFieldPresentations == null ? 0 : mFieldPresentations.size())
- .append(", fieldFilters=")
- .append(mFieldFilters == null ? 0 : mFieldFilters.size())
- .append(", hasPresentation=").append(mPresentation != null)
- .append(", hasAuthentication=").append(mAuthentication != null)
- .append(']').toString();
+ }
+ if (mFieldFilters != null) {
+ builder.append(", fieldFilters=").append(mFieldFilters.size());
+ }
+ if (mPresentation != null) {
+ builder.append(", hasPresentation");
+ }
+ if (mAuthentication != null) {
+ builder.append(", hasAuthentication");
+ }
+ return builder.append(']').toString();
}
/**
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 3a4b6bb8037e..2bc4b8f7baf2 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -16,6 +16,7 @@
package android.service.autofill;
+import static android.service.autofill.AutofillServiceHelper.assertValid;
import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
import static android.view.autofill.Helper.sDebug;
@@ -245,10 +246,15 @@ public final class FillResponse implements Parcelable {
* @param ids id of Views that when focused will display the authentication UI.
*
* @return This builder.
-
- * @throws IllegalArgumentException if {@code ids} is {@code null} or empty, or if
- * both {@code authentication} and {@code presentation} are {@code null}, or if
- * both {@code authentication} and {@code presentation} are non-{@code null}
+ *
+ * @throws IllegalArgumentException if any of the following occurs:
+ * <ul>
+ * <li>{@code ids} is {@code null}</li>
+ * <li>{@code ids} is empty</li>
+ * <li>{@code ids} contains a {@code null} element</li>
+ * <li>both {@code authentication} and {@code presentation} are {@code null}</li>
+ * <li>both {@code authentication} and {@code presentation} are non-{@code null}</li>
+ * </ul>
*
* @throws IllegalStateException if a {@link #setHeader(RemoteViews) header} or a
* {@link #setFooter(RemoteViews) footer} are already set for this builder.
@@ -263,16 +269,13 @@ public final class FillResponse implements Parcelable {
throw new IllegalStateException("Already called #setHeader() or #setFooter()");
}
- if (ids == null || ids.length == 0) {
- throw new IllegalArgumentException("ids cannot be null or empry");
- }
if (authentication == null ^ presentation == null) {
throw new IllegalArgumentException("authentication and presentation"
+ " must be both non-null or null");
}
mAuthentication = authentication;
mPresentation = presentation;
- mAuthenticationIds = ids;
+ mAuthenticationIds = assertValid(ids);
return this;
}
@@ -554,23 +557,40 @@ public final class FillResponse implements Parcelable {
if (!sDebug) return super.toString();
// TODO: create a dump() method instead
- return new StringBuilder(
- "FillResponse : [mRequestId=" + mRequestId)
- .append(", datasets=").append(mDatasets == null ? "N/A" : mDatasets.getList())
- .append(", saveInfo=").append(mSaveInfo)
- .append(", clientState=").append(mClientState != null)
- .append(", hasPresentation=").append(mPresentation != null)
- .append(", hasHeader=").append(mHeader != null)
- .append(", hasFooter=").append(mFooter != null)
- .append(", hasAuthentication=").append(mAuthentication != null)
- .append(", authenticationIds=").append(Arrays.toString(mAuthenticationIds))
- .append(", ignoredIds=").append(Arrays.toString(mIgnoredIds))
- .append(", disableDuration=").append(mDisableDuration)
- .append(", flags=").append(mFlags)
- .append(", fieldClassificationIds=")
- .append(Arrays.toString(mFieldClassificationIds))
- .append("]")
- .toString();
+ final StringBuilder builder = new StringBuilder(
+ "FillResponse : [mRequestId=" + mRequestId);
+ if (mDatasets != null) {
+ builder.append(", datasets=").append(mDatasets.getList());
+ }
+ if (mSaveInfo != null) {
+ builder.append(", saveInfo=").append(mSaveInfo);
+ }
+ if (mClientState != null) {
+ builder.append(", hasClientState");
+ }
+ if (mPresentation != null) {
+ builder.append(", hasPresentation");
+ }
+ if (mHeader != null) {
+ builder.append(", hasHeader");
+ }
+ if (mFooter != null) {
+ builder.append(", hasFooter");
+ }
+ if (mAuthentication != null) {
+ builder.append(", hasAuthentication");
+ }
+ if (mAuthenticationIds != null) {
+ builder.append(", authenticationIds=").append(Arrays.toString(mAuthenticationIds));
+ }
+ builder.append(", disableDuration=").append(mDisableDuration);
+ if (mFlags != 0) {
+ builder.append(", flags=").append(mFlags);
+ }
+ if (mFieldClassificationIds != null) {
+ builder.append(Arrays.toString(mFieldClassificationIds));
+ }
+ return builder.append("]").toString();
}
/////////////////////////////////////
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
index a5a6177dedc3..4943fc824ba5 100644
--- a/core/java/android/service/autofill/SaveInfo.java
+++ b/core/java/android/service/autofill/SaveInfo.java
@@ -16,6 +16,7 @@
package android.service.autofill;
+import static android.service.autofill.AutofillServiceHelper.assertValid;
import static android.view.autofill.Helper.sDebug;
import android.annotation.IntDef;
@@ -405,17 +406,6 @@ public final class SaveInfo implements Parcelable {
mRequiredIds = null;
}
- private AutofillId[] assertValid(AutofillId[] ids) {
- Preconditions.checkArgument(ids != null && ids.length > 0,
- "must have at least one id: " + Arrays.toString(ids));
- for (int i = 0; i < ids.length; i++) {
- final AutofillId id = ids[i];
- Preconditions.checkArgument(id != null,
- "cannot have null id: " + Arrays.toString(ids));
- }
- return ids;
- }
-
/**
* Sets flags changing the save behavior.
*
@@ -699,22 +689,37 @@ public final class SaveInfo implements Parcelable {
public String toString() {
if (!sDebug) return super.toString();
- return new StringBuilder("SaveInfo: [type=")
+ final StringBuilder builder = new StringBuilder("SaveInfo: [type=")
.append(DebugUtils.flagsToString(SaveInfo.class, "SAVE_DATA_TYPE_", mType))
.append(", requiredIds=").append(Arrays.toString(mRequiredIds))
- .append(", optionalIds=").append(Arrays.toString(mOptionalIds))
- .append(", description=").append(mDescription)
- .append(DebugUtils.flagsToString(SaveInfo.class, "NEGATIVE_BUTTON_STYLE_",
- mNegativeButtonStyle))
- .append(", flags=").append(mFlags)
- .append(", customDescription=").append(mCustomDescription)
- .append(", validator=").append(mValidator)
- .append(", sanitizerKeys=")
- .append(mSanitizerKeys == null ? "N/A:" : mSanitizerKeys.length)
- .append(", sanitizerValues=")
- .append(mSanitizerValues == null ? "N/A:" : mSanitizerValues.length)
- .append(", triggerId=").append(mTriggerId)
- .append("]").toString();
+ .append(", style=").append(DebugUtils.flagsToString(SaveInfo.class,
+ "NEGATIVE_BUTTON_STYLE_", mNegativeButtonStyle));
+ if (mOptionalIds != null) {
+ builder.append(", optionalIds=").append(Arrays.toString(mOptionalIds));
+ }
+ if (mDescription != null) {
+ builder.append(", description=").append(mDescription);
+ }
+ if (mFlags != 0) {
+ builder.append(", flags=").append(mFlags);
+ }
+ if (mCustomDescription != null) {
+ builder.append(", customDescription=").append(mCustomDescription);
+ }
+ if (mValidator != null) {
+ builder.append(", validator=").append(mValidator);
+ }
+ if (mSanitizerKeys != null) {
+ builder.append(", sanitizerKeys=").append(mSanitizerKeys.length);
+ }
+ if (mSanitizerValues != null) {
+ builder.append(", sanitizerValues=").append(mSanitizerValues.length);
+ }
+ if (mTriggerId != null) {
+ builder.append(", triggerId=").append(mTriggerId);
+ }
+
+ return builder.append("]").toString();
}
/////////////////////////////////////
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index ea10ae7b3808..3726e66d01f9 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -1418,6 +1418,7 @@ public abstract class NotificationListenerService extends Service {
private ArrayList<SnoozeCriterion> mSnoozeCriteria;
private boolean mShowBadge;
private @UserSentiment int mUserSentiment = USER_SENTIMENT_NEUTRAL;
+ private boolean mHidden;
public Ranking() {}
@@ -1557,6 +1558,16 @@ public abstract class NotificationListenerService extends Service {
}
/**
+ * Returns whether the app that posted this notification is suspended, so this notification
+ * should be hidden.
+ *
+ * @return true if the notification should be hidden, false otherwise.
+ */
+ public boolean isSuspended() {
+ return mHidden;
+ }
+
+ /**
* @hide
*/
@VisibleForTesting
@@ -1565,7 +1576,7 @@ public abstract class NotificationListenerService extends Service {
CharSequence explanation, String overrideGroupKey,
NotificationChannel channel, ArrayList<String> overridePeople,
ArrayList<SnoozeCriterion> snoozeCriteria, boolean showBadge,
- int userSentiment) {
+ int userSentiment, boolean hidden) {
mKey = key;
mRank = rank;
mIsAmbient = importance < NotificationManager.IMPORTANCE_LOW;
@@ -1580,6 +1591,7 @@ public abstract class NotificationListenerService extends Service {
mSnoozeCriteria = snoozeCriteria;
mShowBadge = showBadge;
mUserSentiment = userSentiment;
+ mHidden = hidden;
}
/**
@@ -1628,6 +1640,7 @@ public abstract class NotificationListenerService extends Service {
private ArrayMap<String, ArrayList<SnoozeCriterion>> mSnoozeCriteria;
private ArrayMap<String, Boolean> mShowBadge;
private ArrayMap<String, Integer> mUserSentiment;
+ private ArrayMap<String, Boolean> mHidden;
private RankingMap(NotificationRankingUpdate rankingUpdate) {
mRankingUpdate = rankingUpdate;
@@ -1656,7 +1669,7 @@ public abstract class NotificationListenerService extends Service {
getVisibilityOverride(key), getSuppressedVisualEffects(key),
getImportance(key), getImportanceExplanation(key), getOverrideGroupKey(key),
getChannel(key), getOverridePeople(key), getSnoozeCriteria(key),
- getShowBadge(key), getUserSentiment(key));
+ getShowBadge(key), getUserSentiment(key), getHidden(key));
return rank >= 0;
}
@@ -1784,6 +1797,16 @@ public abstract class NotificationListenerService extends Service {
? Ranking.USER_SENTIMENT_NEUTRAL : userSentiment.intValue();
}
+ private boolean getHidden(String key) {
+ synchronized (this) {
+ if (mHidden == null) {
+ buildHiddenLocked();
+ }
+ }
+ Boolean hidden = mHidden.get(key);
+ return hidden == null ? false : hidden.booleanValue();
+ }
+
// Locked by 'this'
private void buildRanksLocked() {
String[] orderedKeys = mRankingUpdate.getOrderedKeys();
@@ -1892,6 +1915,15 @@ public abstract class NotificationListenerService extends Service {
}
}
+ // Locked by 'this'
+ private void buildHiddenLocked() {
+ Bundle hidden = mRankingUpdate.getHidden();
+ mHidden = new ArrayMap<>(hidden.size());
+ for (String key : hidden.keySet()) {
+ mHidden.put(key, hidden.getBoolean(key));
+ }
+ }
+
// ----------- Parcelable
@Override
diff --git a/core/java/android/service/notification/NotificationRankingUpdate.java b/core/java/android/service/notification/NotificationRankingUpdate.java
index 6d51db096a27..00c47ec0ee89 100644
--- a/core/java/android/service/notification/NotificationRankingUpdate.java
+++ b/core/java/android/service/notification/NotificationRankingUpdate.java
@@ -36,12 +36,13 @@ public class NotificationRankingUpdate implements Parcelable {
private final Bundle mSnoozeCriteria;
private final Bundle mShowBadge;
private final Bundle mUserSentiment;
+ private final Bundle mHidden;
public NotificationRankingUpdate(String[] keys, String[] interceptedKeys,
Bundle visibilityOverrides, Bundle suppressedVisualEffects,
int[] importance, Bundle explanation, Bundle overrideGroupKeys,
Bundle channels, Bundle overridePeople, Bundle snoozeCriteria,
- Bundle showBadge, Bundle userSentiment) {
+ Bundle showBadge, Bundle userSentiment, Bundle hidden) {
mKeys = keys;
mInterceptedKeys = interceptedKeys;
mVisibilityOverrides = visibilityOverrides;
@@ -54,6 +55,7 @@ public class NotificationRankingUpdate implements Parcelable {
mSnoozeCriteria = snoozeCriteria;
mShowBadge = showBadge;
mUserSentiment = userSentiment;
+ mHidden = hidden;
}
public NotificationRankingUpdate(Parcel in) {
@@ -70,6 +72,7 @@ public class NotificationRankingUpdate implements Parcelable {
mSnoozeCriteria = in.readBundle();
mShowBadge = in.readBundle();
mUserSentiment = in.readBundle();
+ mHidden = in.readBundle();
}
@Override
@@ -91,6 +94,7 @@ public class NotificationRankingUpdate implements Parcelable {
out.writeBundle(mSnoozeCriteria);
out.writeBundle(mShowBadge);
out.writeBundle(mUserSentiment);
+ out.writeBundle(mHidden);
}
public static final Parcelable.Creator<NotificationRankingUpdate> CREATOR
@@ -151,4 +155,8 @@ public class NotificationRankingUpdate implements Parcelable {
public Bundle getUserSentiment() {
return mUserSentiment;
}
+
+ public Bundle getHidden() {
+ return mHidden;
+ }
}
diff --git a/core/java/android/service/trust/TrustAgentService.java b/core/java/android/service/trust/TrustAgentService.java
index 40e84b9604e7..61277e285b86 100644
--- a/core/java/android/service/trust/TrustAgentService.java
+++ b/core/java/android/service/trust/TrustAgentService.java
@@ -545,7 +545,7 @@ public class TrustAgentService extends Service {
*/
public final void unlockUserWithToken(long handle, byte[] token, UserHandle user) {
UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
- if (um.isUserUnlocked()) {
+ if (um.isUserUnlocked(user)) {
Slog.i(TAG, "User already unlocked");
return;
}
diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java
index 18431cacbfaf..febca7ec9de1 100644
--- a/core/java/android/text/DynamicLayout.java
+++ b/core/java/android/text/DynamicLayout.java
@@ -704,7 +704,12 @@ public class DynamicLayout extends Layout {
// Spans other than ReplacementSpan can be ignored because line top and bottom are
// disjunction of all tops and bottoms, although it's not optimal.
final Paint paint = getPaint();
- paint.getTextBounds(text, start, end, mTempRect);
+ if (text instanceof PrecomputedText) {
+ PrecomputedText precomputed = (PrecomputedText) text;
+ precomputed.getBounds(start, end, mTempRect);
+ } else {
+ paint.getTextBounds(text, start, end, mTempRect);
+ }
final Paint.FontMetricsInt fm = paint.getFontMetricsInt();
return mTempRect.top < fm.top || mTempRect.bottom > fm.bottom;
}
diff --git a/core/java/android/text/MeasuredParagraph.java b/core/java/android/text/MeasuredParagraph.java
index aafcf44a73fc..a107cab58966 100644
--- a/core/java/android/text/MeasuredParagraph.java
+++ b/core/java/android/text/MeasuredParagraph.java
@@ -21,6 +21,7 @@ import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.Paint;
+import android.graphics.Rect;
import android.text.AutoGrowArray.ByteArray;
import android.text.AutoGrowArray.FloatArray;
import android.text.AutoGrowArray.IntArray;
@@ -297,6 +298,18 @@ public class MeasuredParagraph {
}
/**
+ * Retrieves the bounding rectangle that encloses all of the characters, with an implied origin
+ * at (0, 0).
+ *
+ * This is available only if the MeasuredParagraph is computed with buildForStaticLayout.
+ */
+ public void getBounds(@NonNull Paint paint, @IntRange(from = 0) int start,
+ @IntRange(from = 0) int end, @NonNull Rect bounds) {
+ nGetBounds(mNativePtr, mCopiedBuffer, paint.getNativeInstance(), start, end,
+ paint.getBidiFlags(), bounds);
+ }
+
+ /**
* Generates new MeasuredParagraph for Bidi computation.
*
* If recycle is null, this returns new instance. If recycle is not null, this fills computed
@@ -675,7 +688,7 @@ public class MeasuredParagraph {
/**
* This only works if the MeasuredParagraph is computed with buildForStaticLayout.
*/
- @IntRange(from = 0) int getMemoryUsage() {
+ public @IntRange(from = 0) int getMemoryUsage() {
return nGetMemoryUsage(mNativePtr);
}
@@ -728,4 +741,7 @@ public class MeasuredParagraph {
@CriticalNative
private static native int nGetMemoryUsage(/* Non Zero */ long nativePtr);
+
+ private static native void nGetBounds(long nativePtr, char[] buf, long paintPtr, int start,
+ int end, int bidiFlag, Rect rect);
}
diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java
index b74019373f57..413df05d86ee 100644
--- a/core/java/android/text/PrecomputedText.java
+++ b/core/java/android/text/PrecomputedText.java
@@ -19,7 +19,8 @@ package android.text;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.util.IntArray;
+import android.graphics.Rect;
+import android.text.style.MetricAffectingSpan;
import com.android.internal.util.Preconditions;
@@ -58,10 +59,12 @@ import java.util.Objects;
* </pre>
*
* Note that the {@link PrecomputedText} created from different parameters of the target
- * {@link android.widget.TextView} will be rejected internally and compute the text layout again
- * with the current {@link android.widget.TextView} parameters.
+ * {@link android.widget.TextView} will be rejected.
+ *
+ * Note that any {@link android.text.NoCopySpan} attached to the original text won't be passed to
+ * PrecomputedText.
*/
-public class PrecomputedText implements Spanned {
+public class PrecomputedText implements Spannable {
private static final char LINE_FEED = '\n';
/**
@@ -267,8 +270,24 @@ public class PrecomputedText implements Spanned {
}
};
+ /** @hide */
+ public static class ParagraphInfo {
+ public final @IntRange(from = 0) int paragraphEnd;
+ public final @NonNull MeasuredParagraph measured;
+
+ /**
+ * @param paraEnd the end offset of this paragraph
+ * @param measured a measured paragraph
+ */
+ public ParagraphInfo(@IntRange(from = 0) int paraEnd, @NonNull MeasuredParagraph measured) {
+ this.paragraphEnd = paraEnd;
+ this.measured = measured;
+ }
+ };
+
+
// The original text.
- private final @NonNull SpannedString mText;
+ private final @NonNull SpannableString mText;
// The inclusive start offset of the measuring target.
private final @IntRange(from = 0) int mStart;
@@ -278,11 +297,8 @@ public class PrecomputedText implements Spanned {
private final @NonNull Params mParams;
- // The measured paragraph texts.
- private final @NonNull MeasuredParagraph[] mMeasuredParagraphs;
-
- // The sorted paragraph end offsets.
- private final @NonNull int[] mParagraphBreakPoints;
+ // The list of measured paragraph info.
+ private final @NonNull ParagraphInfo[] mParagraphInfo;
/**
* Create a new {@link PrecomputedText} which will pre-compute text measurement and glyph
@@ -292,29 +308,29 @@ public class PrecomputedText implements Spanned {
* presented can save work on the UI thread.
* </p>
*
+ * Note that any {@link android.text.NoCopySpan} attached to the text won't be passed to the
+ * created PrecomputedText.
+ *
* @param text the text to be measured
- * @param param parameters that define how text will be precomputed
+ * @param params parameters that define how text will be precomputed
* @return A {@link PrecomputedText}
*/
- public static PrecomputedText create(@NonNull CharSequence text, @NonNull Params param) {
- return createInternal(text, param, 0, text.length(), true /* compute full Layout */);
+ public static PrecomputedText create(@NonNull CharSequence text, @NonNull Params params) {
+ ParagraphInfo[] paraInfo = createMeasuredParagraphs(
+ text, params, 0, text.length(), true /* computeLayout */);
+ return new PrecomputedText(text, 0, text.length(), params, paraInfo);
}
/** @hide */
- public static PrecomputedText createWidthOnly(@NonNull CharSequence text, @NonNull Params param,
- @IntRange(from = 0) int start, @IntRange(from = 0) int end) {
- return createInternal(text, param, start, end, false /* compute width only */);
- }
-
- private static PrecomputedText createInternal(@NonNull CharSequence text, @NonNull Params param,
+ public static ParagraphInfo[] createMeasuredParagraphs(
+ @NonNull CharSequence text, @NonNull Params params,
@IntRange(from = 0) int start, @IntRange(from = 0) int end, boolean computeLayout) {
- Preconditions.checkNotNull(text);
- Preconditions.checkNotNull(param);
- final boolean needHyphenation = param.getBreakStrategy() != Layout.BREAK_STRATEGY_SIMPLE
- && param.getHyphenationFrequency() != Layout.HYPHENATION_FREQUENCY_NONE;
+ ArrayList<ParagraphInfo> result = new ArrayList<>();
- final IntArray paragraphEnds = new IntArray();
- final ArrayList<MeasuredParagraph> measuredTexts = new ArrayList<>();
+ Preconditions.checkNotNull(text);
+ Preconditions.checkNotNull(params);
+ final boolean needHyphenation = params.getBreakStrategy() != Layout.BREAK_STRATEGY_SIMPLE
+ && params.getHyphenationFrequency() != Layout.HYPHENATION_FREQUENCY_NONE;
int paraEnd = 0;
for (int paraStart = start; paraStart < end; paraStart = paraEnd) {
@@ -327,27 +343,22 @@ public class PrecomputedText implements Spanned {
paraEnd++; // Includes LINE_FEED(U+000A) to the prev paragraph.
}
- paragraphEnds.add(paraEnd);
- measuredTexts.add(MeasuredParagraph.buildForStaticLayout(
- param.getTextPaint(), text, paraStart, paraEnd, param.getTextDirection(),
- needHyphenation, computeLayout, null /* no recycle */));
+ result.add(new ParagraphInfo(paraEnd, MeasuredParagraph.buildForStaticLayout(
+ params.getTextPaint(), text, paraStart, paraEnd, params.getTextDirection(),
+ needHyphenation, computeLayout, null /* no recycle */)));
}
-
- return new PrecomputedText(text, start, end, param,
- measuredTexts.toArray(new MeasuredParagraph[measuredTexts.size()]),
- paragraphEnds.toArray());
+ return result.toArray(new ParagraphInfo[result.size()]);
}
// Use PrecomputedText.create instead.
private PrecomputedText(@NonNull CharSequence text, @IntRange(from = 0) int start,
- @IntRange(from = 0) int end, @NonNull Params param,
- @NonNull MeasuredParagraph[] measuredTexts, @NonNull int[] paragraphBreakPoints) {
- mText = new SpannedString(text);
+ @IntRange(from = 0) int end, @NonNull Params params,
+ @NonNull ParagraphInfo[] paraInfo) {
+ mText = new SpannableString(text, true /* ignoreNoCopySpan */);
mStart = start;
mEnd = end;
- mParams = param;
- mMeasuredParagraphs = measuredTexts;
- mParagraphBreakPoints = paragraphBreakPoints;
+ mParams = params;
+ mParagraphInfo = paraInfo;
}
/**
@@ -384,7 +395,7 @@ public class PrecomputedText implements Spanned {
* Returns the count of paragraphs.
*/
public @IntRange(from = 0) int getParagraphCount() {
- return mParagraphBreakPoints.length;
+ return mParagraphInfo.length;
}
/**
@@ -392,7 +403,7 @@ public class PrecomputedText implements Spanned {
*/
public @IntRange(from = 0) int getParagraphStart(@IntRange(from = 0) int paraIndex) {
Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex");
- return paraIndex == 0 ? mStart : mParagraphBreakPoints[paraIndex - 1];
+ return paraIndex == 0 ? mStart : getParagraphEnd(paraIndex - 1);
}
/**
@@ -400,12 +411,17 @@ public class PrecomputedText implements Spanned {
*/
public @IntRange(from = 0) int getParagraphEnd(@IntRange(from = 0) int paraIndex) {
Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex");
- return mParagraphBreakPoints[paraIndex];
+ return mParagraphInfo[paraIndex].paragraphEnd;
}
/** @hide */
public @NonNull MeasuredParagraph getMeasuredParagraph(@IntRange(from = 0) int paraIndex) {
- return mMeasuredParagraphs[paraIndex];
+ return mParagraphInfo[paraIndex].measured;
+ }
+
+ /** @hide */
+ public @NonNull ParagraphInfo[] getParagraphInfo() {
+ return mParagraphInfo;
}
/**
@@ -425,13 +441,13 @@ public class PrecomputedText implements Spanned {
public int findParaIndex(@IntRange(from = 0) int pos) {
// TODO: Maybe good to remove paragraph concept from PrecomputedText and add substring
// layout support to StaticLayout.
- for (int i = 0; i < mParagraphBreakPoints.length; ++i) {
- if (pos < mParagraphBreakPoints[i]) {
+ for (int i = 0; i < mParagraphInfo.length; ++i) {
+ if (pos < mParagraphInfo[i].paragraphEnd) {
return i;
}
}
throw new IndexOutOfBoundsException(
- "pos must be less than " + mParagraphBreakPoints[mParagraphBreakPoints.length - 1]
+ "pos must be less than " + mParagraphInfo[mParagraphInfo.length - 1].paragraphEnd
+ ", gave " + pos);
}
@@ -448,6 +464,21 @@ public class PrecomputedText implements Spanned {
return getMeasuredParagraph(paraIndex).getWidth(start - paraStart, end - paraStart);
}
+ /** @hide */
+ public void getBounds(@IntRange(from = 0) int start, @IntRange(from = 0) int end,
+ @NonNull Rect bounds) {
+ final int paraIndex = findParaIndex(start);
+ final int paraStart = getParagraphStart(paraIndex);
+ final int paraEnd = getParagraphEnd(paraIndex);
+ if (start < paraStart || paraEnd < end) {
+ throw new RuntimeException("Cannot measured across the paragraph:"
+ + "para: (" + paraStart + ", " + paraEnd + "), "
+ + "request: (" + start + ", " + end + ")");
+ }
+ getMeasuredParagraph(paraIndex).getBounds(mParams.mPaint,
+ start - paraStart, end - paraStart, bounds);
+ }
+
/**
* Returns the size of native PrecomputedText memory usage.
*
@@ -463,6 +494,35 @@ public class PrecomputedText implements Spanned {
}
///////////////////////////////////////////////////////////////////////////////////////////////
+ // Spannable overrides
+ //
+ // Do not allow to modify MetricAffectingSpan
+
+ /**
+ * @throws IllegalArgumentException if {@link MetricAffectingSpan} is specified.
+ */
+ @Override
+ public void setSpan(Object what, int start, int end, int flags) {
+ if (what instanceof MetricAffectingSpan) {
+ throw new IllegalArgumentException(
+ "MetricAffectingSpan can not be set to PrecomputedText.");
+ }
+ mText.setSpan(what, start, end, flags);
+ }
+
+ /**
+ * @throws IllegalArgumentException if {@link MetricAffectingSpan} is specified.
+ */
+ @Override
+ public void removeSpan(Object what) {
+ if (what instanceof MetricAffectingSpan) {
+ throw new IllegalArgumentException(
+ "MetricAffectingSpan can not be removed from PrecomputedText.");
+ }
+ mText.removeSpan(what);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
// Spanned overrides
//
// Just proxy for underlying mText if appropriate.
diff --git a/core/java/android/text/SpannableString.java b/core/java/android/text/SpannableString.java
index 56d0946babf2..afb5df809bc0 100644
--- a/core/java/android/text/SpannableString.java
+++ b/core/java/android/text/SpannableString.java
@@ -16,7 +16,6 @@
package android.text;
-
/**
* This is the class for text whose content is immutable but to which
* markup objects can be attached and detached.
@@ -26,12 +25,27 @@ public class SpannableString
extends SpannableStringInternal
implements CharSequence, GetChars, Spannable
{
+ /**
+ * @param source source object to copy from
+ * @param ignoreNoCopySpan whether to copy NoCopySpans in the {@code source}
+ * @hide
+ */
+ public SpannableString(CharSequence source, boolean ignoreNoCopySpan) {
+ super(source, 0, source.length(), ignoreNoCopySpan);
+ }
+
+ /**
+ * For the backward compatibility reasons, this constructor copies all spans including {@link
+ * android.text.NoCopySpan}.
+ * @param source source text
+ */
public SpannableString(CharSequence source) {
- super(source, 0, source.length());
+ this(source, false /* ignoreNoCopySpan */); // preserve existing NoCopySpan behavior
}
private SpannableString(CharSequence source, int start, int end) {
- super(source, start, end);
+ // preserve existing NoCopySpan behavior
+ super(source, start, end, false /* ignoreNoCopySpan */);
}
public static SpannableString valueOf(CharSequence source) {
diff --git a/core/java/android/text/SpannableStringInternal.java b/core/java/android/text/SpannableStringInternal.java
index 366ec145ffc4..5dd1a52b4a7a 100644
--- a/core/java/android/text/SpannableStringInternal.java
+++ b/core/java/android/text/SpannableStringInternal.java
@@ -26,7 +26,7 @@ import java.lang.reflect.Array;
/* package */ abstract class SpannableStringInternal
{
/* package */ SpannableStringInternal(CharSequence source,
- int start, int end) {
+ int start, int end, boolean ignoreNoCopySpan) {
if (start == 0 && end == source.length())
mText = source.toString();
else
@@ -38,24 +38,37 @@ import java.lang.reflect.Array;
if (source instanceof Spanned) {
if (source instanceof SpannableStringInternal) {
- copySpans((SpannableStringInternal) source, start, end);
+ copySpans((SpannableStringInternal) source, start, end, ignoreNoCopySpan);
} else {
- copySpans((Spanned) source, start, end);
+ copySpans((Spanned) source, start, end, ignoreNoCopySpan);
}
}
}
/**
+ * This unused method is left since this is listed in hidden api list.
+ *
+ * Due to backward compatibility reasons, we copy even NoCopySpan by default
+ */
+ /* package */ SpannableStringInternal(CharSequence source, int start, int end) {
+ this(source, start, end, false /* ignoreNoCopySpan */);
+ }
+
+ /**
* Copies another {@link Spanned} object's spans between [start, end] into this object.
*
* @param src Source object to copy from.
* @param start Start index in the source object.
* @param end End index in the source object.
+ * @param ignoreNoCopySpan whether to copy NoCopySpans in the {@code source}
*/
- private final void copySpans(Spanned src, int start, int end) {
+ private void copySpans(Spanned src, int start, int end, boolean ignoreNoCopySpan) {
Object[] spans = src.getSpans(start, end, Object.class);
for (int i = 0; i < spans.length; i++) {
+ if (ignoreNoCopySpan && spans[i] instanceof NoCopySpan) {
+ continue;
+ }
int st = src.getSpanStart(spans[i]);
int en = src.getSpanEnd(spans[i]);
int fl = src.getSpanFlags(spans[i]);
@@ -76,35 +89,48 @@ import java.lang.reflect.Array;
* @param src Source object to copy from.
* @param start Start index in the source object.
* @param end End index in the source object.
+ * @param ignoreNoCopySpan copy NoCopySpan for backward compatible reasons.
*/
- private final void copySpans(SpannableStringInternal src, int start, int end) {
- if (start == 0 && end == src.length()) {
+ private void copySpans(SpannableStringInternal src, int start, int end,
+ boolean ignoreNoCopySpan) {
+ int count = 0;
+ final int[] srcData = src.mSpanData;
+ final Object[] srcSpans = src.mSpans;
+ final int limit = src.mSpanCount;
+ boolean hasNoCopySpan = false;
+
+ for (int i = 0; i < limit; i++) {
+ int spanStart = srcData[i * COLUMNS + START];
+ int spanEnd = srcData[i * COLUMNS + END];
+ if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue;
+ if (srcSpans[i] instanceof NoCopySpan) {
+ hasNoCopySpan = true;
+ if (ignoreNoCopySpan) {
+ continue;
+ }
+ }
+ count++;
+ }
+
+ if (count == 0) return;
+
+ if (!hasNoCopySpan && start == 0 && end == src.length()) {
mSpans = ArrayUtils.newUnpaddedObjectArray(src.mSpans.length);
mSpanData = new int[src.mSpanData.length];
mSpanCount = src.mSpanCount;
System.arraycopy(src.mSpans, 0, mSpans, 0, src.mSpans.length);
System.arraycopy(src.mSpanData, 0, mSpanData, 0, mSpanData.length);
} else {
- int count = 0;
- int[] srcData = src.mSpanData;
- int limit = src.mSpanCount;
- for (int i = 0; i < limit; i++) {
- int spanStart = srcData[i * COLUMNS + START];
- int spanEnd = srcData[i * COLUMNS + END];
- if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue;
- count++;
- }
-
- if (count == 0) return;
-
- Object[] srcSpans = src.mSpans;
mSpanCount = count;
mSpans = ArrayUtils.newUnpaddedObjectArray(mSpanCount);
mSpanData = new int[mSpans.length * COLUMNS];
for (int i = 0, j = 0; i < limit; i++) {
int spanStart = srcData[i * COLUMNS + START];
int spanEnd = srcData[i * COLUMNS + END];
- if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue;
+ if (isOutOfCopyRange(start, end, spanStart, spanEnd)
+ || (ignoreNoCopySpan && srcSpans[i] instanceof NoCopySpan)) {
+ continue;
+ }
if (spanStart < start) spanStart = start;
if (spanEnd > end) spanEnd = end;
@@ -494,6 +520,21 @@ import java.lang.reflect.Array;
return hash;
}
+ /**
+ * Following two unused methods are left since these are listed in hidden api list.
+ *
+ * Due to backward compatibility reasons, we copy even NoCopySpan by default
+ */
+ private void copySpans(Spanned src, int start, int end) {
+ copySpans(src, start, end, false);
+ }
+
+ private void copySpans(SpannableStringInternal src, int start, int end) {
+ copySpans(src, start, end, false);
+ }
+
+
+
private String mText;
private Object[] mSpans;
private int[] mSpanData;
diff --git a/core/java/android/text/SpannedString.java b/core/java/android/text/SpannedString.java
index afed221f4152..acee3c5f1a41 100644
--- a/core/java/android/text/SpannedString.java
+++ b/core/java/android/text/SpannedString.java
@@ -26,12 +26,27 @@ public final class SpannedString
extends SpannableStringInternal
implements CharSequence, GetChars, Spanned
{
+ /**
+ * @param source source object to copy from
+ * @param ignoreNoCopySpan whether to copy NoCopySpans in the {@code source}
+ * @hide
+ */
+ public SpannedString(CharSequence source, boolean ignoreNoCopySpan) {
+ super(source, 0, source.length(), ignoreNoCopySpan);
+ }
+
+ /**
+ * For the backward compatibility reasons, this constructor copies all spans including {@link
+ * android.text.NoCopySpan}.
+ * @param source source text
+ */
public SpannedString(CharSequence source) {
- super(source, 0, source.length());
+ this(source, false /* ignoreNoCopySpan */); // preserve existing NoCopySpan behavior
}
private SpannedString(CharSequence source, int start, int end) {
- super(source, start, end);
+ // preserve existing NoCopySpan behavior
+ super(source, start, end, false /* ignoreNoCopySpan */);
}
public CharSequence subSequence(int start, int end) {
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index 299bde239fcf..0899074174a2 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -651,31 +651,29 @@ public class StaticLayout extends Layout {
b.mJustificationMode != Layout.JUSTIFICATION_MODE_NONE,
indents, mLeftPaddings, mRightPaddings);
- PrecomputedText measured = null;
- final Spanned spanned;
+ PrecomputedText.ParagraphInfo[] paragraphInfo = null;
+ final Spanned spanned = (source instanceof Spanned) ? (Spanned) source : null;
if (source instanceof PrecomputedText) {
- measured = (PrecomputedText) source;
- if (!measured.canUseMeasuredResult(bufStart, bufEnd, textDir, paint, b.mBreakStrategy,
- b.mHyphenationFrequency)) {
+ PrecomputedText precomputed = (PrecomputedText) source;
+ if (precomputed.canUseMeasuredResult(bufStart, bufEnd, textDir, paint,
+ b.mBreakStrategy, b.mHyphenationFrequency)) {
// Some parameters are different from the ones when measured text is created.
- measured = null;
+ paragraphInfo = precomputed.getParagraphInfo();
}
}
- if (measured == null) {
+ if (paragraphInfo == null) {
final PrecomputedText.Params param = new PrecomputedText.Params(paint, textDir,
b.mBreakStrategy, b.mHyphenationFrequency);
- measured = PrecomputedText.createWidthOnly(source, param, bufStart, bufEnd);
- spanned = (source instanceof Spanned) ? (Spanned) source : null;
- } else {
- final CharSequence original = measured.getText();
- spanned = (original instanceof Spanned) ? (Spanned) original : null;
+ paragraphInfo = PrecomputedText.createMeasuredParagraphs(source, param, bufStart,
+ bufEnd, false /* computeLayout */);
}
try {
- for (int paraIndex = 0; paraIndex < measured.getParagraphCount(); paraIndex++) {
- final int paraStart = measured.getParagraphStart(paraIndex);
- final int paraEnd = measured.getParagraphEnd(paraIndex);
+ for (int paraIndex = 0; paraIndex < paragraphInfo.length; paraIndex++) {
+ final int paraStart = paraIndex == 0
+ ? bufStart : paragraphInfo[paraIndex - 1].paragraphEnd;
+ final int paraEnd = paragraphInfo[paraIndex].paragraphEnd;
int firstWidthLineCount = 1;
int firstWidth = outerWidth;
@@ -741,7 +739,7 @@ public class StaticLayout extends Layout {
}
}
- final MeasuredParagraph measuredPara = measured.getMeasuredParagraph(paraIndex);
+ final MeasuredParagraph measuredPara = paragraphInfo[paraIndex].measured;
final char[] chs = measuredPara.getChars();
final int[] spanEndCache = measuredPara.getSpanEndCache().getRawArray();
final int[] fmCache = measuredPara.getFontMetrics().getRawArray();
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index 3a22db2bfb22..435e32456343 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -650,7 +650,8 @@ public class Linkify {
final CharSequence truncatedText = text.subSequence(
0, Math.min(text.length(), classifier.getMaxGenerateLinksTextLength()));
- final Supplier<TextLinks> supplier = () -> classifier.generateLinks(truncatedText, options);
+ final Supplier<TextLinks> supplier = () ->
+ classifier.generateLinks(truncatedText, options.setLegacyFallback(true));
final Consumer<TextLinks> consumer = links -> {
if (links.getLinks().isEmpty()) {
if (callback != null) {
diff --git a/core/java/android/util/DebugUtils.java b/core/java/android/util/DebugUtils.java
index c44f42b19ced..46e316931935 100644
--- a/core/java/android/util/DebugUtils.java
+++ b/core/java/android/util/DebugUtils.java
@@ -219,7 +219,7 @@ public class DebugUtils {
&& field.getType().equals(int.class) && field.getName().startsWith(prefix)) {
try {
if (value == field.getInt(null)) {
- return field.getName().substring(prefix.length());
+ return constNameWithoutPrefix(prefix, field);
}
} catch (IllegalAccessException ignored) {
}
@@ -236,6 +236,7 @@ public class DebugUtils {
*/
public static String flagsToString(Class<?> clazz, String prefix, int flags) {
final StringBuilder res = new StringBuilder();
+ boolean flagsWasZero = flags == 0;
for (Field field : clazz.getDeclaredFields()) {
final int modifiers = field.getModifiers();
@@ -243,9 +244,12 @@ public class DebugUtils {
&& field.getType().equals(int.class) && field.getName().startsWith(prefix)) {
try {
final int value = field.getInt(null);
+ if (value == 0 && flagsWasZero) {
+ return constNameWithoutPrefix(prefix, field);
+ }
if ((flags & value) != 0) {
flags &= ~value;
- res.append(field.getName().substring(prefix.length())).append('|');
+ res.append(constNameWithoutPrefix(prefix, field)).append('|');
}
} catch (IllegalAccessException ignored) {
}
@@ -258,4 +262,8 @@ public class DebugUtils {
}
return res.toString();
}
+
+ private static String constNameWithoutPrefix(String prefix, Field field) {
+ return field.getName().substring(prefix.length());
+ }
}
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index 38ab6f24f41d..9687009dc64e 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -42,7 +42,7 @@ public class FeatureFlagUtils {
DEFAULT_FLAGS.put("settings_zone_picker_v2", "true");
DEFAULT_FLAGS.put("settings_about_phone_v2", "true");
DEFAULT_FLAGS.put("settings_bluetooth_while_driving", "false");
- DEFAULT_FLAGS.put("settings_data_usage_v2", "false");
+ DEFAULT_FLAGS.put("settings_data_usage_v2", "true");
DEFAULT_FLAGS.put("settings_audio_switcher", "false");
}
diff --git a/core/java/android/util/NtpTrustedTime.java b/core/java/android/util/NtpTrustedTime.java
index ed2d3c60fcd0..30d7b6c0786c 100644
--- a/core/java/android/util/NtpTrustedTime.java
+++ b/core/java/android/util/NtpTrustedTime.java
@@ -20,6 +20,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.net.ConnectivityManager;
+import android.net.Network;
import android.net.NetworkInfo;
import android.net.SntpClient;
import android.os.SystemClock;
@@ -80,6 +81,18 @@ public class NtpTrustedTime implements TrustedTime {
@Override
public boolean forceRefresh() {
+ // We can't do this at initialization time: ConnectivityService might not be running yet.
+ synchronized (this) {
+ if (mCM == null) {
+ mCM = sContext.getSystemService(ConnectivityManager.class);
+ }
+ }
+
+ final Network network = mCM == null ? null : mCM.getActiveNetwork();
+ return forceRefresh(network);
+ }
+
+ public boolean forceRefresh(Network network) {
if (TextUtils.isEmpty(mServer)) {
// missing server, so no trusted time available
return false;
@@ -88,11 +101,11 @@ public class NtpTrustedTime implements TrustedTime {
// We can't do this at initialization time: ConnectivityService might not be running yet.
synchronized (this) {
if (mCM == null) {
- mCM = (ConnectivityManager) sContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ mCM = sContext.getSystemService(ConnectivityManager.class);
}
}
- final NetworkInfo ni = mCM == null ? null : mCM.getActiveNetworkInfo();
+ final NetworkInfo ni = mCM == null ? null : mCM.getNetworkInfo(network);
if (ni == null || !ni.isConnected()) {
if (LOGD) Log.d(TAG, "forceRefresh: no connectivity");
return false;
@@ -101,7 +114,7 @@ public class NtpTrustedTime implements TrustedTime {
if (LOGD) Log.d(TAG, "forceRefresh() from cache miss");
final SntpClient client = new SntpClient();
- if (client.requestTime(mServer, (int) mTimeout)) {
+ if (client.requestTime(mServer, (int) mTimeout, network)) {
mHasCache = true;
mCachedNtpTime = client.getNtpTime();
mCachedNtpElapsedRealtime = client.getNtpTimeReference();
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 613e6d8c6b14..6486230f8e3a 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -428,4 +428,14 @@ interface IWindowManager
* on the next user activity.
*/
void requestUserActivityNotification();
+
+ /**
+ * Notify WindowManager that it should not override the info in DisplayManager for the specified
+ * display. This can disable letter- or pillar-boxing applied in DisplayManager when the metrics
+ * of the logical display reported from WindowManager do not correspond to the metrics of the
+ * physical display it is based on.
+ *
+ * @param displayId The id of the display.
+ */
+ void dontOverrideDisplayInfo(int displayId);
}
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index ce7e8f3b55b5..7c25fac3974e 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -687,6 +687,11 @@ public class RenderNode {
return nIsPivotExplicitlySet(mNativeRenderNode);
}
+ /** lint */
+ public boolean resetPivot() {
+ return nResetPivot(mNativeRenderNode);
+ }
+
/**
* Sets the camera distance for the display list. Refer to
* {@link View#setCameraDistance(float)} for more information on how to
@@ -903,6 +908,8 @@ public class RenderNode {
@CriticalNative
private static native boolean nSetPivotX(long renderNode, float pivotX);
@CriticalNative
+ private static native boolean nResetPivot(long renderNode);
+ @CriticalNative
private static native boolean nSetLayerType(long renderNode, int layerType);
@CriticalNative
private static native boolean nSetLayerPaint(long renderNode, long paint);
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index b7524fb1a522..d4610a56332f 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -353,8 +353,8 @@ public class SurfaceControl implements Parcelable {
private int mFormat = PixelFormat.OPAQUE;
private String mName;
private SurfaceControl mParent;
- private int mWindowType;
- private int mOwnerUid;
+ private int mWindowType = -1;
+ private int mOwnerUid = -1;
/**
* Begin building a SurfaceControl with a given {@link SurfaceSession}.
@@ -566,7 +566,7 @@ public class SurfaceControl implements Parcelable {
*/
private SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags,
SurfaceControl parent, int windowType, int ownerUid)
- throws OutOfResourcesException {
+ throws OutOfResourcesException, IllegalArgumentException {
if (session == null) {
throw new IllegalArgumentException("session must not be null");
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index afff19b0be31..18c3d76e03aa 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -14843,6 +14843,28 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
+ * Returns whether or not a pivot has been set by a call to {@link #setPivotX(float)} or
+ * {@link #setPivotY(float)}. If no pivot has been set then the pivot will be the center
+ * of the view.
+ *
+ * @return True if a pivot has been set, false if the default pivot is being used
+ */
+ public boolean isPivotSet() {
+ return mRenderNode.isPivotExplicitlySet();
+ }
+
+ /**
+ * Clears any pivot previously set by a call to {@link #setPivotX(float)} or
+ * {@link #setPivotY(float)}. After calling this {@link #isPivotSet()} will be false
+ * and the pivot used for rotation will return to default of being centered on the view.
+ */
+ public void resetPivot() {
+ if (mRenderNode.resetPivot()) {
+ invalidateViewProperty(false, false);
+ }
+ }
+
+ /**
* The opacity of the view. This is a value from 0 to 1, where 0 means the view is
* completely transparent and 1 means the view is completely opaque.
*
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 69938cbe8bb6..abc19d0e5c7a 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -2882,9 +2882,8 @@ public interface WindowManager extends ViewManager {
/**
* @hide
*/
- public String toString(String prefix) {
- StringBuilder sb = new StringBuilder(256);
- sb.append("{(");
+ public void dumpDimensions(StringBuilder sb) {
+ sb.append('(');
sb.append(x);
sb.append(',');
sb.append(y);
@@ -2895,6 +2894,15 @@ public interface WindowManager extends ViewManager {
sb.append((height == MATCH_PARENT ? "fill" : (height == WRAP_CONTENT
? "wrap" : String.valueOf(height))));
sb.append(")");
+ }
+
+ /**
+ * @hide
+ */
+ public String toString(String prefix) {
+ StringBuilder sb = new StringBuilder(256);
+ sb.append('{');
+ dumpDimensions(sb);
if (horizontalMargin != 0) {
sb.append(" hm=");
sb.append(horizontalMargin);
diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java
index c783cae4c234..2a24dd731b4d 100644
--- a/core/java/android/view/textclassifier/SystemTextClassifier.java
+++ b/core/java/android/view/textclassifier/SystemTextClassifier.java
@@ -30,6 +30,8 @@ import android.service.textclassifier.ITextLinksCallback;
import android.service.textclassifier.ITextSelectionCallback;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.util.Preconditions;
import java.util.concurrent.CountDownLatch;
@@ -37,8 +39,10 @@ import java.util.concurrent.TimeUnit;
/**
* Proxy to the system's default TextClassifier.
+ * @hide
*/
-final class SystemTextClassifier implements TextClassifier {
+@VisibleForTesting(visibility = Visibility.PACKAGE)
+public final class SystemTextClassifier implements TextClassifier {
private static final String LOG_TAG = "SystemTextClassifier";
@@ -53,13 +57,13 @@ final class SystemTextClassifier implements TextClassifier {
@GuardedBy("mLoggerLock")
private Logger mLogger;
- SystemTextClassifier(Context context, TextClassificationConstants settings)
+ public SystemTextClassifier(Context context, TextClassificationConstants settings)
throws ServiceManager.ServiceNotFoundException {
mManagerService = ITextClassifierService.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.TEXT_CLASSIFICATION_SERVICE));
mSettings = Preconditions.checkNotNull(settings);
mFallback = new TextClassifierImpl(context, settings);
- mPackageName = context.getPackageName();
+ mPackageName = Preconditions.checkNotNull(context.getPackageName());
}
/**
@@ -124,8 +128,9 @@ final class SystemTextClassifier implements TextClassifier {
@NonNull CharSequence text, @Nullable TextLinks.Options options) {
Utils.validate(text, false /* allowInMainThread */);
- if (!mSettings.isSmartLinkifyEnabled()) {
- return TextClassifier.NO_OP.generateLinks(text, options);
+ final boolean legacyFallback = options != null && options.isLegacyFallback();
+ if (!mSettings.isSmartLinkifyEnabled() && legacyFallback) {
+ return Utils.generateLegacyLinks(text, options);
}
try {
diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java
index c91116a87998..b5c9de99e0c2 100644
--- a/core/java/android/view/textclassifier/TextClassification.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -344,6 +344,25 @@ public final class TextClassification implements Parcelable {
}
}
+ /**
+ * Triggers the specified intent.
+ *
+ * @throws IllegalArgumentException if context or intent is null
+ * @hide
+ */
+ public static void fireIntent(@NonNull final Context context, @NonNull final Intent intent) {
+ switch (getIntentType(intent, context)) {
+ case IntentType.ACTIVITY:
+ context.startActivity(intent);
+ return;
+ case IntentType.SERVICE:
+ context.startService(intent);
+ return;
+ default:
+ return;
+ }
+ }
+
@IntentType
private static int getIntentType(@NonNull Intent intent, @NonNull Context context) {
Preconditions.checkArgument(context != null);
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 887bebbd97ac..98fa574f076b 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -26,6 +26,12 @@ import android.os.LocaleList;
import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.style.URLSpan;
+import android.text.util.Linkify;
+import android.text.util.Linkify.LinkifyMask;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
@@ -37,6 +43,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
/**
* Interface for providing text classification related features.
@@ -511,6 +518,65 @@ public interface TextClassifier {
Preconditions.checkArgumentInRange(text.length(), 0, maxLength, "text.length()");
}
+ /**
+ * Generates links using legacy {@link Linkify}.
+ */
+ public static TextLinks generateLegacyLinks(
+ @NonNull CharSequence text, @NonNull TextLinks.Options options) {
+ final String string = Preconditions.checkNotNull(text).toString();
+ final TextLinks.Builder links = new TextLinks.Builder(string);
+
+ final List<String> entities = Preconditions.checkNotNull(options).getEntityConfig()
+ .resolveEntityListModifications(Collections.emptyList());
+ if (entities.contains(TextClassifier.TYPE_URL)) {
+ addLinks(links, string, TextClassifier.TYPE_URL);
+ }
+ if (entities.contains(TextClassifier.TYPE_PHONE)) {
+ addLinks(links, string, TextClassifier.TYPE_PHONE);
+ }
+ if (entities.contains(TextClassifier.TYPE_EMAIL)) {
+ addLinks(links, string, TextClassifier.TYPE_EMAIL);
+ }
+ // NOTE: Do not support MAP_ADDRESSES. Legacy version does not work well.
+ return links.build();
+ }
+
+ private static void addLinks(
+ TextLinks.Builder links, String string, @EntityType String entityType) {
+ final Spannable spannable = new SpannableString(string);
+ if (Linkify.addLinks(spannable, linkMask(entityType))) {
+ final URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+ for (URLSpan urlSpan : spans) {
+ links.addLink(
+ spannable.getSpanStart(urlSpan),
+ spannable.getSpanEnd(urlSpan),
+ entityScores(entityType),
+ urlSpan);
+ }
+ }
+ }
+
+ @LinkifyMask
+ private static int linkMask(@EntityType String entityType) {
+ switch (entityType) {
+ case TextClassifier.TYPE_URL:
+ return Linkify.WEB_URLS;
+ case TextClassifier.TYPE_PHONE:
+ return Linkify.PHONE_NUMBERS;
+ case TextClassifier.TYPE_EMAIL:
+ return Linkify.EMAIL_ADDRESSES;
+ default:
+ // NOTE: Do not support MAP_ADDRESSES. Legacy version does not work well.
+ return 0;
+ }
+ }
+
+ private static Map<String, Float> entityScores(@EntityType String entityType) {
+ final Map<String, Float> scores = new ArrayMap<>();
+ scores.put(entityType, 1f);
+ return scores;
+ }
+
private static void checkMainThread(boolean allowInMainThread) {
if (!allowInMainThread && Looper.myLooper() == Looper.getMainLooper()) {
Slog.w(DEFAULT_LOG_TAG, "TextClassifier called on main thread");
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index a09982053091..c2fb032d3e60 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -209,13 +209,15 @@ public final class TextClassifierImpl implements TextClassifier {
public TextLinks generateLinks(
@NonNull CharSequence text, @Nullable TextLinks.Options options) {
Utils.validate(text, getMaxGenerateLinksTextLength(), false /* allowInMainThread */);
- final String textString = text.toString();
- final TextLinks.Builder builder = new TextLinks.Builder(textString);
- if (!mSettings.isSmartLinkifyEnabled()) {
- return builder.build();
+ final boolean legacyFallback = options != null && options.isLegacyFallback();
+ if (!mSettings.isSmartLinkifyEnabled() && legacyFallback) {
+ return Utils.generateLegacyLinks(text, options);
}
+ final String textString = text.toString();
+ final TextLinks.Builder builder = new TextLinks.Builder(textString);
+
try {
final long startTimeMs = System.currentTimeMillis();
final LocaleList defaultLocales = options != null ? options.getDefaultLocales() : null;
@@ -355,12 +357,10 @@ public final class TextClassifierImpl implements TextClassifier {
final List<Locale.LanguageRange> languageRangeList = Locale.LanguageRange.parse(languages);
ModelFile bestModel = null;
- int bestModelVersion = -1;
for (ModelFile model : listAllModelsLocked()) {
if (model.isAnyLanguageSupported(languageRangeList)) {
- if (model.getVersion() >= bestModelVersion) {
+ if (model.isPreferredTo(bestModel)) {
bestModel = model;
- bestModelVersion = model.getVersion();
}
}
}
@@ -482,6 +482,7 @@ public final class TextClassifierImpl implements TextClassifier {
private final String mName;
private final int mVersion;
private final List<Locale> mSupportedLocales;
+ private final boolean mLanguageIndependent;
/** Returns null if the path did not point to a compatible model. */
static @Nullable ModelFile fromPath(String path) {
@@ -496,12 +497,14 @@ public final class TextClassifierImpl implements TextClassifier {
Log.d(DEFAULT_LOG_TAG, "Ignoring " + file.getAbsolutePath());
return null;
}
+ final boolean languageIndependent = supportedLocalesStr.equals("*");
final List<Locale> supportedLocales = new ArrayList<>();
for (String langTag : supportedLocalesStr.split(",")) {
supportedLocales.add(Locale.forLanguageTag(langTag));
}
closeAndLogError(modelFd);
- return new ModelFile(path, file.getName(), version, supportedLocales);
+ return new ModelFile(path, file.getName(), version, supportedLocales,
+ languageIndependent);
} catch (FileNotFoundException e) {
Log.e(DEFAULT_LOG_TAG, "Failed to peek " + file.getAbsolutePath(), e);
return null;
@@ -525,7 +528,7 @@ public final class TextClassifierImpl implements TextClassifier {
/** Returns whether the language supports any language in the given ranges. */
boolean isAnyLanguageSupported(List<Locale.LanguageRange> languageRanges) {
- return Locale.lookup(languageRanges, mSupportedLocales) != null;
+ return mLanguageIndependent || Locale.lookup(languageRanges, mSupportedLocales) != null;
}
/** All locales supported by the model. */
@@ -533,6 +536,25 @@ public final class TextClassifierImpl implements TextClassifier {
return Collections.unmodifiableList(mSupportedLocales);
}
+ public boolean isPreferredTo(ModelFile model) {
+ // A model is preferred to no model.
+ if (model == null) {
+ return true;
+ }
+
+ // A language-specific model is preferred to a language independent
+ // model.
+ if (!mLanguageIndependent && model.mLanguageIndependent) {
+ return true;
+ }
+
+ // A higher-version model is preferred.
+ if (getVersion() > model.getVersion()) {
+ return true;
+ }
+ return false;
+ }
+
@Override
public boolean equals(Object other) {
if (this == other) {
@@ -555,11 +577,13 @@ public final class TextClassifierImpl implements TextClassifier {
mPath, mName, mVersion, localesJoiner.toString());
}
- private ModelFile(String path, String name, int version, List<Locale> supportedLocales) {
+ private ModelFile(String path, String name, int version, List<Locale> supportedLocales,
+ boolean languageIndependent) {
mPath = path;
mName = name;
mVersion = version;
mSupportedLocales = supportedLocales;
+ mLanguageIndependent = languageIndependent;
}
}
diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java
index af9fc7d16655..38a7d9aa1d2b 100644
--- a/core/java/android/view/textclassifier/TextLinks.java
+++ b/core/java/android/view/textclassifier/TextLinks.java
@@ -20,17 +20,21 @@ import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.Context;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.Spannable;
import android.text.style.ClickableSpan;
+import android.text.style.URLSpan;
import android.text.util.Linkify;
import android.text.util.Linkify.LinkifyMask;
import android.view.View;
import android.view.textclassifier.TextClassifier.EntityType;
import android.widget.TextView;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
@@ -197,6 +201,7 @@ public final class TextLinks implements Parcelable {
private final EntityConfidence mEntityScores;
private final int mStart;
private final int mEnd;
+ @Nullable final URLSpan mUrlSpan;
/**
* Create a new TextLink.
@@ -204,16 +209,19 @@ public final class TextLinks implements Parcelable {
* @param start The start index of the identified subsequence
* @param end The end index of the identified subsequence
* @param entityScores A mapping of entity type to confidence score
+ * @param urlSpan An optional URLSpan to delegate to. NOTE: Not parcelled
*
* @throws IllegalArgumentException if entityScores is null or empty
*/
- TextLink(int start, int end, Map<String, Float> entityScores) {
+ TextLink(int start, int end, Map<String, Float> entityScores,
+ @Nullable URLSpan urlSpan) {
Preconditions.checkNotNull(entityScores);
Preconditions.checkArgument(!entityScores.isEmpty());
Preconditions.checkArgument(start <= end);
mStart = start;
mEnd = end;
mEntityScores = new EntityConfidence(entityScores);
+ mUrlSpan = urlSpan;
}
/**
@@ -291,6 +299,7 @@ public final class TextLinks implements Parcelable {
mEntityScores = EntityConfidence.CREATOR.createFromParcel(in);
mStart = in.readInt();
mEnd = in.readInt();
+ mUrlSpan = null;
}
}
@@ -301,6 +310,7 @@ public final class TextLinks implements Parcelable {
private LocaleList mDefaultLocales;
private TextClassifier.EntityConfig mEntityConfig;
+ private boolean mLegacyFallback;
private @ApplyStrategy int mApplyStrategy;
private Function<TextLink, TextLinkSpan> mSpanFactory;
@@ -354,6 +364,17 @@ public final class TextLinks implements Parcelable {
}
/**
+ * Sets whether the TextClassifier can fallback to legacy links if smart linkify is
+ * disabled.
+ * <strong>Note: </strong>This is not parcelled.
+ * @hide
+ */
+ public Options setLegacyFallback(boolean legacyFallback) {
+ mLegacyFallback = legacyFallback;
+ return this;
+ }
+
+ /**
* Sets a strategy for resolving conflicts when applying generated links to text that
* already have links.
*
@@ -406,6 +427,16 @@ public final class TextLinks implements Parcelable {
}
/**
+ * Returns whether the TextClassifier can fallback to legacy links if smart linkify is
+ * disabled.
+ * <strong>Note: </strong>This is not parcelled.
+ * @hide
+ */
+ public boolean isLegacyFallback() {
+ return mLegacyFallback;
+ }
+
+ /**
* @return the strategy for resolving conflictswhen applying generated links to text that
* already have links
*
@@ -497,7 +528,7 @@ public final class TextLinks implements Parcelable {
private final TextLink mTextLink;
- public TextLinkSpan(@Nullable TextLink textLink) {
+ public TextLinkSpan(@NonNull TextLink textLink) {
mTextLink = textLink;
}
@@ -505,13 +536,38 @@ public final class TextLinks implements Parcelable {
public void onClick(View widget) {
if (widget instanceof TextView) {
final TextView textView = (TextView) widget;
- textView.requestActionMode(this);
+ final Context context = textView.getContext();
+ if (TextClassificationManager.getSettings(context).isSmartLinkifyEnabled()) {
+ if (textView.requestFocus()) {
+ textView.requestActionMode(this);
+ } else {
+ // If textView can not take focus, then simply handle the click as it will
+ // be difficult to get rid of the floating action mode.
+ textView.handleClick(this);
+ }
+ } else {
+ if (mTextLink.mUrlSpan != null) {
+ mTextLink.mUrlSpan.onClick(textView);
+ } else {
+ textView.handleClick(this);
+ }
+ }
}
}
public final TextLink getTextLink() {
return mTextLink;
}
+
+ /** @hide */
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ @Nullable
+ public final String getUrl() {
+ if (mTextLink.mUrlSpan != null) {
+ return mTextLink.mUrlSpan.getURL();
+ }
+ return null;
+ }
}
/**
@@ -534,12 +590,24 @@ public final class TextLinks implements Parcelable {
/**
* Adds a TextLink.
*
- * @return this instance
+ * @param start The start index of the identified subsequence
+ * @param end The end index of the identified subsequence
+ * @param entityScores A mapping of entity type to confidence score
*
* @throws IllegalArgumentException if entityScores is null or empty.
*/
public Builder addLink(int start, int end, Map<String, Float> entityScores) {
- mLinks.add(new TextLink(start, end, entityScores));
+ mLinks.add(new TextLink(start, end, entityScores, null));
+ return this;
+ }
+
+ /**
+ * @see #addLink(int, int, Map)
+ * @param urlSpan An optional URLSpan to delegate to. NOTE: Not parcelled.
+ */
+ Builder addLink(int start, int end, Map<String, Float> entityScores,
+ @Nullable URLSpan urlSpan) {
+ mLinks.add(new TextLink(start, end, entityScores, urlSpan));
return this;
}
diff --git a/core/java/android/view/textservice/SpellCheckerSession.java b/core/java/android/view/textservice/SpellCheckerSession.java
index 779eefb14c74..886f5c822fb4 100644
--- a/core/java/android/view/textservice/SpellCheckerSession.java
+++ b/core/java/android/view/textservice/SpellCheckerSession.java
@@ -445,9 +445,15 @@ public class SpellCheckerSession {
private void processOrEnqueueTask(SpellCheckerParams scp) {
ISpellCheckerSession session;
synchronized (this) {
+ if (scp.mWhat == TASK_CLOSE && (mState == STATE_CLOSED_AFTER_CONNECTION
+ || mState == STATE_CLOSED_BEFORE_CONNECTION)) {
+ // It is OK to call SpellCheckerSession#close() multiple times.
+ // Don't output confusing/misleading warning messages.
+ return;
+ }
if (mState != STATE_WAIT_CONNECTION && mState != STATE_CONNECTED) {
Log.e(TAG, "ignoring processOrEnqueueTask due to unexpected mState="
- + taskToString(scp.mWhat)
+ + stateToString(mState)
+ " scp.mWhat=" + taskToString(scp.mWhat));
return;
}
diff --git a/core/java/android/webkit/TracingConfig.java b/core/java/android/webkit/TracingConfig.java
index 68badecaec3a..d95ca61dff3f 100644
--- a/core/java/android/webkit/TracingConfig.java
+++ b/core/java/android/webkit/TracingConfig.java
@@ -35,9 +35,9 @@ public class TracingConfig {
private @TracingMode int mTracingMode;
/** @hide */
- @IntDef(flag = true, value = {CATEGORIES_NONE, CATEGORIES_WEB_DEVELOPER,
- CATEGORIES_INPUT_LATENCY, CATEGORIES_RENDERING, CATEGORIES_JAVASCRIPT_AND_RENDERING,
- CATEGORIES_FRAME_VIEWER})
+ @IntDef(flag = true, value = {CATEGORIES_NONE, CATEGORIES_ALL, CATEGORIES_ANDROID_WEBVIEW,
+ CATEGORIES_WEB_DEVELOPER, CATEGORIES_INPUT_LATENCY, CATEGORIES_RENDERING,
+ CATEGORIES_JAVASCRIPT_AND_RENDERING, CATEGORIES_FRAME_VIEWER})
@Retention(RetentionPolicy.SOURCE)
public @interface PredefinedCategories {}
@@ -90,34 +90,28 @@ public class TracingConfig {
public static final int CATEGORIES_FRAME_VIEWER = 1 << 6;
/** @hide */
- @IntDef({RECORD_UNTIL_FULL, RECORD_CONTINUOUSLY, RECORD_UNTIL_FULL_LARGE_BUFFER})
+ @IntDef({RECORD_UNTIL_FULL, RECORD_CONTINUOUSLY})
@Retention(RetentionPolicy.SOURCE)
public @interface TracingMode {}
/**
- * Record trace events until the internal tracing buffer is full. Default tracing mode.
- * Typically the buffer memory usage is between {@link #RECORD_CONTINUOUSLY} and the
- * {@link #RECORD_UNTIL_FULL_LARGE_BUFFER}. Depending on the implementation typically allows
- * up to 256k events to be stored.
+ * Record trace events until the internal tracing buffer is full.
+ *
+ * Typically the buffer memory usage is larger than {@link #RECORD_CONTINUOUSLY}.
+ * Depending on the implementation typically allows up to 256k events to be stored.
*/
public static final int RECORD_UNTIL_FULL = 0;
/**
- * Record trace events continuously using an internal ring buffer. Overwrites
- * old events if they exceed buffer capacity. Uses less memory than both
- * {@link #RECORD_UNTIL_FULL} and {@link #RECORD_UNTIL_FULL_LARGE_BUFFER} modes.
- * Depending on the implementation typically allows up to 64k events to be stored.
+ * Record trace events continuously using an internal ring buffer. Default tracing mode.
+ *
+ * Overwrites old events if they exceed buffer capacity. Uses less memory than the
+ * {@link #RECORD_UNTIL_FULL} mode. Depending on the implementation typically allows
+ * up to 64k events to be stored.
*/
public static final int RECORD_CONTINUOUSLY = 1;
/**
- * Record trace events using a larger internal tracing buffer until it is full.
- * Uses significantly more memory than {@link #RECORD_UNTIL_FULL} and may not be
- * suitable on devices with smaller RAM.
- */
- public static final int RECORD_UNTIL_FULL_LARGE_BUFFER = 2;
-
- /**
* @hide
*/
public TracingConfig(@PredefinedCategories int predefinedCategories,
@@ -182,7 +176,7 @@ public class TracingConfig {
public static class Builder {
private @PredefinedCategories int mPredefinedCategories = CATEGORIES_NONE;
private final List<String> mCustomIncludedCategories = new ArrayList<String>();
- private @TracingMode int mTracingMode = RECORD_UNTIL_FULL;
+ private @TracingMode int mTracingMode = RECORD_CONTINUOUSLY;
/**
* Default constructor for Builder.
@@ -202,7 +196,9 @@ public class TracingConfig {
*
* @param predefinedCategories list or bitmask of predefined category sets to use:
* {@link #CATEGORIES_NONE}, {@link #CATEGORIES_ALL},
- * {@link #CATEGORIES_WEB_DEVELOPER}, {@link #CATEGORIES_INPUT_LATENCY},
+ * {@link #CATEGORIES_ANDROID_WEBVIEW},
+ * {@link #CATEGORIES_WEB_DEVELOPER},
+ * {@link #CATEGORIES_INPUT_LATENCY},
* {@link #CATEGORIES_RENDERING},
* {@link #CATEGORIES_JAVASCRIPT_AND_RENDERING} or
* {@link #CATEGORIES_FRAME_VIEWER}.
@@ -250,9 +246,8 @@ public class TracingConfig {
/**
* Sets the tracing mode for this configuration.
*
- * @param tracingMode tracing mode to use, one of {@link #RECORD_UNTIL_FULL},
- * {@link #RECORD_CONTINUOUSLY} or
- * {@link #RECORD_UNTIL_FULL_LARGE_BUFFER}.
+ * @param tracingMode tracing mode to use, one of {@link #RECORD_UNTIL_FULL} or
+ * {@link #RECORD_CONTINUOUSLY}.
* @return The builder to facilitate chaining.
*/
public Builder setTracingMode(@TracingMode int tracingMode) {
diff --git a/core/java/android/webkit/TracingController.java b/core/java/android/webkit/TracingController.java
index 7871021a33c8..50068f5abfb2 100644
--- a/core/java/android/webkit/TracingController.java
+++ b/core/java/android/webkit/TracingController.java
@@ -60,9 +60,8 @@ public abstract class TracingController {
* Starts tracing all webviews. Depending on the trace mode in traceConfig
* specifies how the trace events are recorded.
*
- * For tracing modes {@link TracingConfig#RECORD_UNTIL_FULL},
- * {@link TracingConfig#RECORD_CONTINUOUSLY} and
- * {@link TracingConfig#RECORD_UNTIL_FULL_LARGE_BUFFER} the events are recorded
+ * For tracing modes {@link TracingConfig#RECORD_UNTIL_FULL} and
+ * {@link TracingConfig#RECORD_CONTINUOUSLY} the events are recorded
* using an internal buffer and flushed to the outputStream when
* {@link #stop(OutputStream, Executor)} is called.
*
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 5178a97e6b68..fc94b1f21fa1 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2451,6 +2451,14 @@ public class WebView extends AbsoluteLayout
* Returns the {@link Looper} corresponding to the thread on which WebView calls must be made.
*/
@NonNull
+ public Looper getWebViewLooper() {
+ return mWebViewThread;
+ }
+
+ /**
+ * Returns the {@link Looper} corresponding to the thread on which WebView calls must be made.
+ */
+ @NonNull
public Looper getLooper() {
return mWebViewThread;
}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 9a99963e9374..298c61e403ab 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -89,7 +89,7 @@ import java.util.List;
/**
* Base class that can be used to implement virtualized lists of items. A list does
- * not have a spatial definition here. For instance, subclases of this class can
+ * not have a spatial definition here. For instance, subclasses of this class can
* display the content of the list in a grid, in a carousel, as stack, etc.
*
* @attr ref android.R.styleable#AbsListView_listSelector
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index e2601dcb91ac..df04bebee52c 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -215,6 +215,10 @@ public final class Magnifier {
mWindow.destroy();
mWindow = null;
}
+ mPrevPosInView.x = NONEXISTENT_PREVIOUS_CONFIG_VALUE;
+ mPrevPosInView.y = NONEXISTENT_PREVIOUS_CONFIG_VALUE;
+ mPrevStartCoordsInSurface.x = NONEXISTENT_PREVIOUS_CONFIG_VALUE;
+ mPrevStartCoordsInSurface.y = NONEXISTENT_PREVIOUS_CONFIG_VALUE;
}
}
@@ -321,19 +325,24 @@ public final class Magnifier {
// Clamp copy coordinates inside the surface to avoid displaying distorted content.
final int clampedStartXInSurface = Math.max(0,
- Math.min(startXInSurface, surfaceWidth - mWindowWidth));
+ Math.min(startXInSurface, surfaceWidth - mBitmapWidth));
final int clampedStartYInSurface = Math.max(0,
- Math.min(startYInSurface, surfaceHeight - mWindowHeight));
+ Math.min(startYInSurface, surfaceHeight - mBitmapHeight));
+
+ // Clamp window coordinates inside the parent surface, to avoid displaying
+ // the magnifier out of screen or overlapping with system insets.
+ final Rect insets = mView.getRootWindowInsets().getSystemWindowInsets();
+ final int windowCoordsX = Math.max(insets.left,
+ Math.min(surfaceWidth - mWindowWidth - insets.right, mWindowCoords.x));
+ final int windowCoordsY = Math.max(insets.top,
+ Math.min(surfaceHeight - mWindowHeight - insets.bottom, mWindowCoords.y));
// Perform the pixel copy.
mPixelCopyRequestRect.set(clampedStartXInSurface,
clampedStartYInSurface,
clampedStartXInSurface + mBitmapWidth,
clampedStartYInSurface + mBitmapHeight);
- final int windowCoordsX = mWindowCoords.x;
- final int windowCoordsY = mWindowCoords.y;
final InternalPopupWindow currentWindowInstance = mWindow;
-
final Bitmap bitmap =
Bitmap.createBitmap(mBitmapWidth, mBitmapHeight, Bitmap.Config.ARGB_8888);
PixelCopy.request(surface, mPixelCopyRequestRect, bitmap,
diff --git a/core/java/android/widget/MediaControlView2.java b/core/java/android/widget/MediaControlView2.java
index 3ec8ab9240bd..f52854a87159 100644
--- a/core/java/android/widget/MediaControlView2.java
+++ b/core/java/android/widget/MediaControlView2.java
@@ -33,6 +33,7 @@ import java.lang.annotation.RetentionPolicy;
// TODO: Use link annotation to refer VideoView2 once VideoView2 became unhidden.
/**
+ * @hide
* A View that contains the controls for MediaPlayer2.
* It provides a wide range of UI including buttons such as "Play/Pause", "Rewind", "Fast Forward",
* "Subtitle", "Full Screen", and it is also possible to add multiple custom buttons.
@@ -150,7 +151,7 @@ public class MediaControlView2 extends ViewGroupHelper<MediaControlView2Provider
public MediaControlView2(@NonNull Context context, @Nullable AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super((instance, superProvider, privateProvider) ->
- ApiLoader.getProvider(context).createMediaControlView2(
+ ApiLoader.getProvider().createMediaControlView2(
(MediaControlView2) instance, superProvider, privateProvider,
attrs, defStyleAttr, defStyleRes),
context, attrs, defStyleAttr, defStyleRes);
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index be8c34c53ae6..6e855ba3f8f7 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -246,7 +246,7 @@ public final class SelectionActionModeHelper {
mTextView.invalidate();
}
mTextClassification = result.mClassification;
- } else if (actionMode == Editor.TextActionMode.TEXT_LINK) {
+ } else if (result != null && actionMode == Editor.TextActionMode.TEXT_LINK) {
mTextClassification = result.mClassification;
} else {
mTextClassification = null;
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 72c8426482aa..c366a9129d34 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -162,6 +162,7 @@ import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
+import android.view.textclassifier.TextClassification;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextLinks;
@@ -187,6 +188,10 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
/**
* A user interface element that displays text to the user.
@@ -5635,6 +5640,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
needEditableForNotification = true;
}
+ PrecomputedText precomputed =
+ (text instanceof PrecomputedText) ? (PrecomputedText) text : null;
if (type == BufferType.EDITABLE || getKeyListener() != null
|| needEditableForNotification) {
createEditorIfNeeded();
@@ -5644,10 +5651,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
setFilters(t, mFilters);
InputMethodManager imm = InputMethodManager.peekInstance();
if (imm != null) imm.restartInput(this);
- } else if (type == BufferType.SPANNABLE || mMovement != null) {
- text = mSpannableFactory.newSpannable(text);
- } else if (text instanceof PrecomputedText) {
- PrecomputedText precomputed = (PrecomputedText) text;
+ } else if (precomputed != null) {
if (mTextDir == null) {
mTextDir = getTextDirectionHeuristic();
}
@@ -5660,6 +5664,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
+ "PrecomputedText: " + precomputed.getParams()
+ "TextView: " + getTextMetricsParams());
}
+ } else if (type == BufferType.SPANNABLE || mMovement != null) {
+ text = mSpannableFactory.newSpannable(text);
} else if (!(text instanceof CharWrapper)) {
text = TextUtils.stringOrSpannedString(text);
}
@@ -11515,16 +11521,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
- * Starts an ActionMode for the specified TextLink.
+ * Starts an ActionMode for the specified TextLinkSpan.
*
* @return Whether or not we're attempting to start the action mode.
* @hide
*/
public boolean requestActionMode(@NonNull TextLinks.TextLinkSpan clickedSpan) {
Preconditions.checkNotNull(clickedSpan);
- final TextLinks.TextLink link = clickedSpan.getTextLink();
- Preconditions.checkNotNull(link);
- createEditorIfNeeded();
if (!(mText instanceof Spanned)) {
return false;
@@ -11533,15 +11536,55 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final int start = ((Spanned) mText).getSpanStart(clickedSpan);
final int end = ((Spanned) mText).getSpanEnd(clickedSpan);
- if (start < 0 || end < 1) {
+ if (start < 0 || end > mText.length() || start >= end) {
return false;
}
+ createEditorIfNeeded();
mEditor.startLinkActionModeAsync(start, end);
return true;
}
/**
+ * Handles a click on the specified TextLinkSpan.
+ *
+ * @return Whether or not the click is being handled.
+ * @hide
+ */
+ public boolean handleClick(@NonNull TextLinks.TextLinkSpan clickedSpan) {
+ Preconditions.checkNotNull(clickedSpan);
+ if (mText instanceof Spanned) {
+ final Spanned spanned = (Spanned) mText;
+ final int start = spanned.getSpanStart(clickedSpan);
+ final int end = spanned.getSpanEnd(clickedSpan);
+ if (start >= 0 && end <= mText.length() && start < end) {
+ final TextClassification.Options options = new TextClassification.Options()
+ .setDefaultLocales(getTextLocales());
+ final Supplier<TextClassification> supplier = () ->
+ getTextClassifier().classifyText(mText, start, end, options);
+ final Consumer<TextClassification> consumer = classification -> {
+ if (classification != null) {
+ final Intent intent = classification.getIntent();
+ if (intent != null) {
+ TextClassification.fireIntent(mContext, intent);
+ } else {
+ Log.d(LOG_TAG, "No link action to perform");
+ }
+ } else {
+ // classification == null
+ Log.d(LOG_TAG, "Timeout while classifying text");
+ }
+ };
+ CompletableFuture.supplyAsync(supplier)
+ .completeOnTimeout(null, 1, TimeUnit.SECONDS)
+ .thenAccept(consumer);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* @hide
*/
protected void stopTextActionMode() {
diff --git a/core/java/android/widget/VideoView2.java b/core/java/android/widget/VideoView2.java
index 6f08dc22aff1..388eae2ad400 100644
--- a/core/java/android/widget/VideoView2.java
+++ b/core/java/android/widget/VideoView2.java
@@ -47,6 +47,7 @@ import java.util.concurrent.Executor;
// TODO: Replace MediaSession wtih MediaSession2 once MediaSession2 is submitted.
/**
+ * @hide
* Displays a video file. VideoView2 class is a View class which is wrapping {@link MediaPlayer2}
* so that developers can easily implement a video rendering application.
*
@@ -143,7 +144,7 @@ public class VideoView2 extends ViewGroupHelper<VideoView2Provider> {
@NonNull Context context, @Nullable AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super((instance, superProvider, privateProvider) ->
- ApiLoader.getProvider(context).createVideoView2(
+ ApiLoader.getProvider().createVideoView2(
(VideoView2) instance, superProvider, privateProvider,
attrs, defStyleAttr, defStyleRes),
context, attrs, defStyleAttr, defStyleRes);
diff --git a/core/java/com/android/internal/app/ISoundTriggerService.aidl b/core/java/com/android/internal/app/ISoundTriggerService.aidl
index 1bee6924454d..93730df7dd47 100644
--- a/core/java/com/android/internal/app/ISoundTriggerService.aidl
+++ b/core/java/com/android/internal/app/ISoundTriggerService.aidl
@@ -17,8 +17,10 @@
package com.android.internal.app;
import android.app.PendingIntent;
+import android.content.ComponentName;
import android.hardware.soundtrigger.IRecognitionStatusCallback;
import android.hardware.soundtrigger.SoundTrigger;
+import android.os.Bundle;
import android.os.ParcelUuid;
/**
@@ -44,9 +46,15 @@ interface ISoundTriggerService {
int startRecognitionForIntent(in ParcelUuid soundModelId, in PendingIntent callbackIntent,
in SoundTrigger.RecognitionConfig config);
+
+ int startRecognitionForService(in ParcelUuid soundModelId, in Bundle params,
+ in ComponentName callbackIntent,in SoundTrigger.RecognitionConfig config);
+
+ /** For both ...Intent and ...Service based usage */
int stopRecognitionForIntent(in ParcelUuid soundModelId);
int unloadSoundModel(in ParcelUuid soundModelId);
+ /** For both ...Intent and ...Service based usage */
boolean isRecognitionActive(in ParcelUuid parcelUuid);
}
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index d3b4dbf1bd82..9a082ec21b3d 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -320,8 +320,8 @@ public class InputMethodUtils {
return builder;
}
- public static ArrayList<InputMethodInfo> getDefaultEnabledImes(final Context context,
- final ArrayList<InputMethodInfo> imis) {
+ public static ArrayList<InputMethodInfo> getDefaultEnabledImes(
+ Context context, ArrayList<InputMethodInfo> imis, boolean onlyMinimum) {
final Locale fallbackLocale = getFallbackLocaleForDefaultIme(imis, context);
// We will primarily rely on the system locale, but also keep relying on the fallback locale
// as a last resort.
@@ -329,11 +329,19 @@ public class InputMethodUtils {
// then pick up suitable auxiliary IMEs when necessary (e.g. Voice IMEs with "automatic"
// subtype)
final Locale systemLocale = getSystemLocaleFromContext(context);
- return getMinimumKeyboardSetWithSystemLocale(imis, context, systemLocale, fallbackLocale)
- .fillImes(imis, context, true /* checkDefaultAttribute */, systemLocale,
- true /* checkCountry */, SUBTYPE_MODE_ANY)
- .fillAuxiliaryImes(imis, context)
- .build();
+ final InputMethodListBuilder builder =
+ getMinimumKeyboardSetWithSystemLocale(imis, context, systemLocale, fallbackLocale);
+ if (!onlyMinimum) {
+ builder.fillImes(imis, context, true /* checkDefaultAttribute */, systemLocale,
+ true /* checkCountry */, SUBTYPE_MODE_ANY)
+ .fillAuxiliaryImes(imis, context);
+ }
+ return builder.build();
+ }
+
+ public static ArrayList<InputMethodInfo> getDefaultEnabledImes(
+ Context context, ArrayList<InputMethodInfo> imis) {
+ return getDefaultEnabledImes(context, imis, false /* onlyMinimum */);
}
public static Locale constructLocaleFromString(String localeStr) {
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 06230c1f8145..3c150c1d3aeb 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -19,6 +19,7 @@ package com.android.internal.os;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
+import android.app.job.JobProtoEnums;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.UidTraffic;
import android.content.ContentResolver;
@@ -137,7 +138,7 @@ public class BatteryStatsImpl extends BatteryStats {
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 176 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 177 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS;
@@ -1550,27 +1551,31 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
+ @VisibleForTesting
public static class LongSamplingCounter extends LongCounter implements TimeBaseObs {
final TimeBase mTimeBase;
- long mCount;
- long mLoadedCount;
- long mUnpluggedCount;
+ public long mCount;
+ public long mCurrentCount;
+ public long mLoadedCount;
+ public long mUnpluggedCount;
- LongSamplingCounter(TimeBase timeBase, Parcel in) {
+ public LongSamplingCounter(TimeBase timeBase, Parcel in) {
mTimeBase = timeBase;
mCount = in.readLong();
+ mCurrentCount = in.readLong();
mLoadedCount = in.readLong();
mUnpluggedCount = in.readLong();
timeBase.add(this);
}
- LongSamplingCounter(TimeBase timeBase) {
+ public LongSamplingCounter(TimeBase timeBase) {
mTimeBase = timeBase;
timeBase.add(this);
}
public void writeToParcel(Parcel out) {
out.writeLong(mCount);
+ out.writeLong(mCurrentCount);
out.writeLong(mLoadedCount);
out.writeLong(mUnpluggedCount);
}
@@ -1597,24 +1602,37 @@ public class BatteryStatsImpl extends BatteryStats {
@Override
public void logState(Printer pw, String prefix) {
pw.println(prefix + "mCount=" + mCount
+ + " mCurrentCount=" + mCurrentCount
+ " mLoadedCount=" + mLoadedCount
+ " mUnpluggedCount=" + mUnpluggedCount);
}
- void addCountLocked(long count) {
- addCountLocked(count, mTimeBase.isRunning());
+ public void addCountLocked(long count) {
+ update(mCurrentCount + count, mTimeBase.isRunning());
+ }
+
+ public void addCountLocked(long count, boolean isRunning) {
+ update(mCurrentCount + count, isRunning);
+ }
+
+ public void update(long count) {
+ update(count, mTimeBase.isRunning());
}
- void addCountLocked(long count, boolean isRunning) {
+ public void update(long count, boolean isRunning) {
+ if (count < mCurrentCount) {
+ mCurrentCount = 0;
+ }
if (isRunning) {
- mCount += count;
+ mCount += count - mCurrentCount;
}
+ mCurrentCount = count;
}
/**
* Clear state of this counter.
*/
- void reset(boolean detachIfReset) {
+ public void reset(boolean detachIfReset) {
mCount = 0;
mLoadedCount = mUnpluggedCount = 0;
if (detachIfReset) {
@@ -1622,18 +1640,16 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
- void detach() {
+ public void detach() {
mTimeBase.remove(this);
}
- void writeSummaryFromParcelLocked(Parcel out) {
+ public void writeSummaryFromParcelLocked(Parcel out) {
out.writeLong(mCount);
}
- void readSummaryFromParcelLocked(Parcel in) {
- mLoadedCount = in.readLong();
- mCount = mLoadedCount;
- mUnpluggedCount = mLoadedCount;
+ public void readSummaryFromParcelLocked(Parcel in) {
+ mCount = mUnpluggedCount= mLoadedCount = in.readLong();
}
}
@@ -10045,7 +10061,8 @@ public class BatteryStatsImpl extends BatteryStats {
if (t != null) {
t.startRunningLocked(elapsedRealtimeMs);
StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, getUid(), null,
- name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED);
+ name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED,
+ JobProtoEnums.STOP_REASON_CANCELLED);
}
}
@@ -10055,7 +10072,8 @@ public class BatteryStatsImpl extends BatteryStats {
t.stopRunningLocked(elapsedRealtimeMs);
if (!t.isRunningLocked()) { // only tell statsd if truly stopped
StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, getUid(), null,
- name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED);
+ name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED,
+ stopReason);
}
}
if (mBsi.mOnBatteryTimeBase.isRunning()) {
@@ -11600,10 +11618,6 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
- // Cache last value for comparison.
- private BluetoothActivityEnergyInfo mLastBluetoothActivityEnergyInfo =
- new BluetoothActivityEnergyInfo(0, 0, 0, 0, 0, 0);
-
/**
* Add modem tx power to history
* Device is said to be in high cellular transmit power when it has spent most of the transmit
@@ -11642,8 +11656,35 @@ public class BatteryStatsImpl extends BatteryStats {
return;
}
+ private final class BluetoothActivityInfoCache {
+ long idleTimeMs;
+ long rxTimeMs;
+ long txTimeMs;
+ long energy;
+
+ SparseLongArray uidRxBytes = new SparseLongArray();
+ SparseLongArray uidTxBytes = new SparseLongArray();
+
+ void set(BluetoothActivityEnergyInfo info) {
+ idleTimeMs = info.getControllerIdleTimeMillis();
+ rxTimeMs = info.getControllerRxTimeMillis();
+ txTimeMs = info.getControllerTxTimeMillis();
+ energy = info.getControllerEnergyUsed();
+ if (info.getUidTraffic() != null) {
+ for (UidTraffic traffic : info.getUidTraffic()) {
+ uidRxBytes.put(traffic.getUid(), traffic.getRxBytes());
+ uidTxBytes.put(traffic.getUid(), traffic.getTxBytes());
+ }
+ }
+ }
+ }
+
+ private final BluetoothActivityInfoCache mLastBluetoothActivityInfo
+ = new BluetoothActivityInfoCache();
+
/**
* Distribute Bluetooth energy info and network traffic to apps.
+ *
* @param info The energy information from the bluetooth controller.
*/
public void updateBluetoothStateLocked(@Nullable final BluetoothActivityEnergyInfo info) {
@@ -11658,12 +11699,13 @@ public class BatteryStatsImpl extends BatteryStats {
mHasBluetoothReporting = true;
final long elapsedRealtimeMs = mClocks.elapsedRealtime();
- final long rxTimeMs = info.getControllerRxTimeMillis() -
- mLastBluetoothActivityEnergyInfo.getControllerRxTimeMillis();
- final long txTimeMs = info.getControllerTxTimeMillis() -
- mLastBluetoothActivityEnergyInfo.getControllerTxTimeMillis();
- final long idleTimeMs = info.getControllerIdleTimeMillis() -
- mLastBluetoothActivityEnergyInfo.getControllerIdleTimeMillis();
+ final long rxTimeMs =
+ info.getControllerRxTimeMillis() - mLastBluetoothActivityInfo.rxTimeMs;
+ final long txTimeMs =
+ info.getControllerTxTimeMillis() - mLastBluetoothActivityInfo.txTimeMs;
+ final long idleTimeMs =
+ info.getControllerIdleTimeMillis() - mLastBluetoothActivityInfo.idleTimeMs;
+
if (DEBUG_ENERGY) {
Slog.d(TAG, "------ BEGIN BLE power blaming ------");
Slog.d(TAG, " Tx Time: " + txTimeMs + " ms");
@@ -11735,8 +11777,8 @@ public class BatteryStatsImpl extends BatteryStats {
}
if (DEBUG_ENERGY) {
- Slog.d(TAG, "Left over time for traffic RX=" + leftOverRxTimeMs
- + " TX=" + leftOverTxTimeMs);
+ Slog.d(TAG, "Left over time for traffic RX=" + leftOverRxTimeMs + " TX="
+ + leftOverTxTimeMs);
}
//
@@ -11747,70 +11789,56 @@ public class BatteryStatsImpl extends BatteryStats {
long totalRxBytes = 0;
final UidTraffic[] uidTraffic = info.getUidTraffic();
- final UidTraffic[] lastUidTraffic = mLastBluetoothActivityEnergyInfo.getUidTraffic();
- final ArrayList<UidTraffic> deltaTraffic = new ArrayList<>();
- int m = 0, n = 0;
- for (; m < uidTraffic.length && n < lastUidTraffic.length; m++) {
- final UidTraffic traffic = uidTraffic[m];
- final UidTraffic lastTraffic = lastUidTraffic[n];
- if (traffic.getUid() == lastTraffic.getUid()) {
- deltaTraffic.add(new UidTraffic(traffic.getUid(),
- traffic.getRxBytes() - lastTraffic.getRxBytes(),
- traffic.getTxBytes() - lastTraffic.getTxBytes()));
- n++;
- }
- }
- for (; m < uidTraffic.length; m ++) {
- deltaTraffic.add(uidTraffic[m]);
- }
-
- for (int i = 0, j = 0; i < deltaTraffic.size(); i++) {
- final UidTraffic traffic = deltaTraffic.get(i);
+ final int numUids = uidTraffic != null ? uidTraffic.length : 0;
+ for (int i = 0; i < numUids; i++) {
+ final UidTraffic traffic = uidTraffic[i];
+ final long rxBytes = traffic.getRxBytes() - mLastBluetoothActivityInfo.uidRxBytes.get(
+ traffic.getUid());
+ final long txBytes = traffic.getTxBytes() - mLastBluetoothActivityInfo.uidTxBytes.get(
+ traffic.getUid());
// Add to the global counters.
- mNetworkByteActivityCounters[NETWORK_BT_RX_DATA].addCountLocked(
- traffic.getRxBytes());
- mNetworkByteActivityCounters[NETWORK_BT_TX_DATA].addCountLocked(
- traffic.getTxBytes());
+ mNetworkByteActivityCounters[NETWORK_BT_RX_DATA].addCountLocked(rxBytes);
+ mNetworkByteActivityCounters[NETWORK_BT_TX_DATA].addCountLocked(txBytes);
// Add to the UID counters.
final Uid u = getUidStatsLocked(mapUid(traffic.getUid()));
- u.noteNetworkActivityLocked(NETWORK_BT_RX_DATA, traffic.getRxBytes(), 0);
- u.noteNetworkActivityLocked(NETWORK_BT_TX_DATA, traffic.getTxBytes(), 0);
+ u.noteNetworkActivityLocked(NETWORK_BT_RX_DATA, rxBytes, 0);
+ u.noteNetworkActivityLocked(NETWORK_BT_TX_DATA, txBytes, 0);
// Calculate the total traffic.
- totalTxBytes += traffic.getTxBytes();
- totalRxBytes += traffic.getRxBytes();
+ totalRxBytes += rxBytes;
+ totalTxBytes += txBytes;
}
- if ((totalTxBytes != 0 || totalRxBytes != 0) &&
- (leftOverRxTimeMs != 0 || leftOverTxTimeMs != 0)) {
- for (int i = 0; i < deltaTraffic.size(); i++) {
- final UidTraffic traffic = deltaTraffic.get(i);
+ if ((totalTxBytes != 0 || totalRxBytes != 0) && (leftOverRxTimeMs != 0
+ || leftOverTxTimeMs != 0)) {
+ for (int i = 0; i < numUids; i++) {
+ final UidTraffic traffic = uidTraffic[i];
+ final int uid = traffic.getUid();
+ final long rxBytes =
+ traffic.getRxBytes() - mLastBluetoothActivityInfo.uidRxBytes.get(uid);
+ final long txBytes =
+ traffic.getTxBytes() - mLastBluetoothActivityInfo.uidTxBytes.get(uid);
- final Uid u = getUidStatsLocked(mapUid(traffic.getUid()));
+ final Uid u = getUidStatsLocked(mapUid(uid));
final ControllerActivityCounterImpl counter =
u.getOrCreateBluetoothControllerActivityLocked();
- if (totalRxBytes > 0 && traffic.getRxBytes() > 0) {
- final long timeRxMs = (leftOverRxTimeMs * traffic.getRxBytes()) / totalRxBytes;
-
+ if (totalRxBytes > 0 && rxBytes > 0) {
+ final long timeRxMs = (leftOverRxTimeMs * rxBytes) / totalRxBytes;
if (DEBUG_ENERGY) {
- Slog.d(TAG, "UID=" + traffic.getUid() + " rx_bytes=" + traffic.getRxBytes()
- + " rx_time=" + timeRxMs);
+ Slog.d(TAG, "UID=" + uid + " rx_bytes=" + rxBytes + " rx_time=" + timeRxMs);
}
counter.getRxTimeCounter().addCountLocked(timeRxMs);
leftOverRxTimeMs -= timeRxMs;
}
- if (totalTxBytes > 0 && traffic.getTxBytes() > 0) {
- final long timeTxMs = (leftOverTxTimeMs * traffic.getTxBytes()) / totalTxBytes;
-
+ if (totalTxBytes > 0 && txBytes > 0) {
+ final long timeTxMs = (leftOverTxTimeMs * txBytes) / totalTxBytes;
if (DEBUG_ENERGY) {
- Slog.d(TAG, "UID=" + traffic.getUid() + " tx_bytes=" + traffic.getTxBytes()
- + " tx_time=" + timeTxMs);
+ Slog.d(TAG, "UID=" + uid + " tx_bytes=" + txBytes + " tx_time=" + timeTxMs);
}
-
counter.getTxTimeCounters()[0].addCountLocked(timeTxMs);
leftOverTxTimeMs -= timeTxMs;
}
@@ -11827,10 +11855,10 @@ public class BatteryStatsImpl extends BatteryStats {
if (opVolt != 0) {
// We store the power drain as mAms.
mBluetoothActivity.getPowerCounter().addCountLocked(
- (long) ((info.getControllerEnergyUsed() -
- mLastBluetoothActivityEnergyInfo.getControllerEnergyUsed() )/ opVolt));
+ (long) ((info.getControllerEnergyUsed() - mLastBluetoothActivityInfo.energy)
+ / opVolt));
}
- mLastBluetoothActivityEnergyInfo = info;
+ mLastBluetoothActivityInfo.set(info);
}
/**
diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java
new file mode 100644
index 000000000000..2c48506494bc
--- /dev/null
+++ b/core/java/com/android/internal/os/BinderCallsStats.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.internal.os;
+
+import android.os.Binder;
+import android.os.SystemClock;
+import android.util.ArrayMap;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+/**
+ * Collects statistics about CPU time spent per binder call across multiple dimensions, e.g.
+ * per thread, uid or call description.
+ */
+public class BinderCallsStats {
+ private static final int CALL_SESSIONS_POOL_SIZE = 100;
+ private static final BinderCallsStats sInstance = new BinderCallsStats();
+
+ private volatile boolean mTrackingEnabled = false;
+ private final SparseArray<UidEntry> mUidEntries = new SparseArray<>();
+ private final Queue<CallSession> mCallSessionsPool = new ConcurrentLinkedQueue<>();
+
+ private BinderCallsStats() {
+ }
+
+ @VisibleForTesting
+ public BinderCallsStats(boolean trackingEnabled) {
+ mTrackingEnabled = trackingEnabled;
+ }
+
+ public CallSession callStarted(Binder binder, int code) {
+ if (!mTrackingEnabled) {
+ return null;
+ }
+
+ return callStarted(binder.getClass().getName(), code);
+ }
+
+ private CallSession callStarted(String className, int code) {
+ CallSession s = mCallSessionsPool.poll();
+ if (s == null) {
+ s = new CallSession();
+ }
+ s.mCallStat.className = className;
+ s.mCallStat.msg = code;
+
+ s.mStarted = getThreadTimeMicro();
+ return s;
+ }
+
+ public void callEnded(CallSession s) {
+ if (!mTrackingEnabled) {
+ return;
+ }
+ Preconditions.checkNotNull(s);
+ final long cpuTimeNow = getThreadTimeMicro();
+ final long duration = cpuTimeNow - s.mStarted;
+ s.mCallingUId = Binder.getCallingUid();
+
+ synchronized (mUidEntries) {
+ UidEntry uidEntry = mUidEntries.get(s.mCallingUId);
+ if (uidEntry == null) {
+ uidEntry = new UidEntry(s.mCallingUId);
+ mUidEntries.put(s.mCallingUId, uidEntry);
+ }
+
+ // Find CallDesc entry and update its total time
+ CallStat callStat = uidEntry.mCallStats.get(s.mCallStat);
+ // Only create CallStat if it's a new entry, otherwise update existing instance
+ if (callStat == null) {
+ callStat = new CallStat(s.mCallStat.className, s.mCallStat.msg);
+ uidEntry.mCallStats.put(callStat, callStat);
+ }
+ uidEntry.time += duration;
+ uidEntry.callCount++;
+ callStat.callCount++;
+ callStat.time += duration;
+ }
+ if (mCallSessionsPool.size() < CALL_SESSIONS_POOL_SIZE) {
+ mCallSessionsPool.add(s);
+ }
+ }
+
+ public void dump(PrintWriter pw) {
+ Map<Integer, Long> uidTimeMap = new HashMap<>();
+ Map<Integer, Long> uidCallCountMap = new HashMap<>();
+ long totalCallsCount = 0;
+ long totalCallsTime = 0;
+ int uidEntriesSize = mUidEntries.size();
+ List<UidEntry> entries = new ArrayList<>();
+ synchronized (mUidEntries) {
+ for (int i = 0; i < uidEntriesSize; i++) {
+ UidEntry e = mUidEntries.valueAt(i);
+ entries.add(e);
+ totalCallsTime += e.time;
+ // Update per-uid totals
+ Long totalTimePerUid = uidTimeMap.get(e.uid);
+ uidTimeMap.put(e.uid,
+ totalTimePerUid == null ? e.time : totalTimePerUid + e.time);
+ Long totalCallsPerUid = uidCallCountMap.get(e.uid);
+ uidCallCountMap.put(e.uid, totalCallsPerUid == null ? e.callCount
+ : totalCallsPerUid + e.callCount);
+ totalCallsCount += e.callCount;
+ }
+ }
+ pw.println("Binder call stats:");
+ pw.println(" Raw data (uid,call_desc,time):");
+ entries.sort((o1, o2) -> {
+ if (o1.time < o2.time) {
+ return 1;
+ } else if (o1.time > o2.time) {
+ return -1;
+ }
+ return 0;
+ });
+ StringBuilder sb = new StringBuilder();
+ for (UidEntry uidEntry : entries) {
+ List<CallStat> callStats = new ArrayList<>(uidEntry.mCallStats.keySet());
+ callStats.sort((o1, o2) -> {
+ if (o1.time < o2.time) {
+ return 1;
+ } else if (o1.time > o2.time) {
+ return -1;
+ }
+ return 0;
+ });
+ for (CallStat e : callStats) {
+ sb.setLength(0);
+ sb.append(" ")
+ .append(uidEntry.uid).append(",").append(e).append(',').append(e.time);
+ pw.println(sb);
+ }
+ }
+ pw.println();
+ pw.println(" Per UID Summary(UID: time, total_time_percentage, calls_count):");
+ List<Map.Entry<Integer, Long>> uidTotals = new ArrayList<>(uidTimeMap.entrySet());
+ uidTotals.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
+ for (Map.Entry<Integer, Long> uidTotal : uidTotals) {
+ Long callCount = uidCallCountMap.get(uidTotal.getKey());
+ pw.println(String.format(" %5d: %11d %3.0f%% %8d",
+ uidTotal.getKey(), uidTotal.getValue(),
+ 100d * uidTotal.getValue() / totalCallsTime, callCount));
+ }
+ pw.println();
+ pw.println(String.format(" Summary: total_time=%d, "
+ + "calls_count=%d, avg_call_time=%.0f",
+ totalCallsTime, totalCallsCount,
+ (double)totalCallsTime / totalCallsCount));
+ }
+
+ private static long getThreadTimeMicro() {
+ return SystemClock.currentThreadTimeMicro();
+ }
+
+ public static BinderCallsStats getInstance() {
+ return sInstance;
+ }
+
+ public void setTrackingEnabled(boolean enabled) {
+ mTrackingEnabled = enabled;
+ }
+
+ public boolean isTrackingEnabled() {
+ return mTrackingEnabled;
+ }
+
+ private static class CallStat {
+ String className;
+ int msg;
+ long time;
+ long callCount;
+
+ CallStat() {
+ }
+
+ CallStat(String className, int msg) {
+ this.className = className;
+ this.msg = msg;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ CallStat callStat = (CallStat) o;
+
+ return msg == callStat.msg && (className == callStat.className);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = className.hashCode();
+ result = 31 * result + msg;
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return className + "/" + msg;
+ }
+ }
+
+ public static class CallSession {
+ int mCallingUId;
+ long mStarted;
+ CallStat mCallStat = new CallStat();
+ }
+
+ private static class UidEntry {
+ int uid;
+ long time;
+ long callCount;
+
+ UidEntry(int uid) {
+ this.uid = uid;
+ }
+
+ // Aggregate time spent per each call name: call_desc -> cpu_time_micros
+ Map<CallStat, CallStat> mCallStats = new ArrayMap<>();
+
+ @Override
+ public String toString() {
+ return "UidEntry{" +
+ "time=" + time +
+ ", callCount=" + callCount +
+ ", mCallStats=" + mCallStats +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ UidEntry uidEntry = (UidEntry) o;
+ return uid == uidEntry.uid;
+ }
+
+ @Override
+ public int hashCode() {
+ return uid;
+ }
+ }
+
+}
diff --git a/core/java/com/android/internal/os/WrapperInit.java b/core/java/com/android/internal/os/WrapperInit.java
index 49010802c784..f0e779694c90 100644
--- a/core/java/com/android/internal/os/WrapperInit.java
+++ b/core/java/com/android/internal/os/WrapperInit.java
@@ -115,6 +115,14 @@ public class WrapperInit {
command.append(' ');
command.append(appProcess);
+ // Generate bare minimum of debug information to be able to backtrace through JITed code.
+ // We assume that if the invoke wrapper is used, backtraces are desirable:
+ // * The wrap.sh script can only be used by debuggable apps, which would enable this flag
+ // without the script anyway (the fork-zygote path). So this makes the two consistent.
+ // * The wrap.* property can only be used on userdebug builds and is likely to be used by
+ // developers (e.g. enable debug-malloc), in which case backtraces are also useful.
+ command.append(" -Xcompiler-option --generate-mini-debug-info");
+
command.append(" /system/bin --application");
if (niceName != null) {
command.append(" '--nice-name=").append(niceName).append("'");
diff --git a/core/java/com/android/internal/util/FunctionalUtils.java b/core/java/com/android/internal/util/FunctionalUtils.java
index 82ac2412e4b2..d53090b4678c 100644
--- a/core/java/com/android/internal/util/FunctionalUtils.java
+++ b/core/java/com/android/internal/util/FunctionalUtils.java
@@ -17,6 +17,7 @@
package com.android.internal.util;
import android.os.RemoteException;
+import android.util.ExceptionUtils;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -36,21 +37,45 @@ public class FunctionalUtils {
}
/**
- *
+ * Wraps a given {@code action} into one that ignores any {@link RemoteException}s
*/
public static <T> Consumer<T> ignoreRemoteException(RemoteExceptionIgnoringConsumer<T> action) {
return action;
}
/**
+ * Wraps the given {@link ThrowingRunnable} into one that handles any exceptions using the
+ * provided {@code handler}
+ */
+ public static Runnable handleExceptions(ThrowingRunnable r, Consumer<Throwable> handler) {
+ return () -> {
+ try {
+ r.run();
+ } catch (Throwable t) {
+ handler.accept(t);
+ }
+ };
+ }
+
+ /**
* An equivalent of {@link Runnable} that allows throwing checked exceptions
*
* This can be used to specify a lambda argument without forcing all the checked exceptions
* to be handled within it
*/
@FunctionalInterface
- public interface ThrowingRunnable {
+ @SuppressWarnings("FunctionalInterfaceMethodChanged")
+ public interface ThrowingRunnable extends Runnable {
void runOrThrow() throws Exception;
+
+ @Override
+ default void run() {
+ try {
+ runOrThrow();
+ } catch (Exception ex) {
+ throw ExceptionUtils.propagate(ex);
+ }
+ }
}
/**
@@ -80,7 +105,7 @@ public class FunctionalUtils {
try {
acceptOrThrow(t);
} catch (Exception ex) {
- throw new RuntimeException(ex);
+ throw ExceptionUtils.propagate(ex);
}
}
}
diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java
index 933cc7af975a..577fa1758f5e 100644
--- a/core/java/com/android/internal/util/NotificationColorUtil.java
+++ b/core/java/com/android/internal/util/NotificationColorUtil.java
@@ -443,7 +443,7 @@ public class NotificationColorUtil {
*/
public static int resolveColor(Context context, int color) {
if (color == Notification.COLOR_DEFAULT) {
- return context.getColor(com.android.internal.R.color.notification_icon_default_color);
+ return context.getColor(com.android.internal.R.color.notification_default_color_light);
}
return color;
}
@@ -475,20 +475,15 @@ public class NotificationColorUtil {
int backgroundColor, boolean isDark) {
final int resolvedColor = resolveColor(context, notificationColor);
- final int actionBg = context.getColor(
- com.android.internal.R.color.notification_action_list);
-
int color = resolvedColor;
- color = NotificationColorUtil.ensureLargeTextContrast(color, actionBg, isDark);
color = NotificationColorUtil.ensureTextContrast(color, backgroundColor, isDark);
if (color != resolvedColor) {
if (DEBUG){
Log.w(TAG, String.format(
- "Enhanced contrast of notification for %s %s (over action)"
+ "Enhanced contrast of notification for %s"
+ " and %s (over background) by changing #%s to %s",
context.getPackageName(),
- NotificationColorUtil.contrastChange(resolvedColor, color, actionBg),
NotificationColorUtil.contrastChange(resolvedColor, color, backgroundColor),
Integer.toHexString(resolvedColor), Integer.toHexString(color)));
}
@@ -552,6 +547,17 @@ public class NotificationColorUtil {
}
}
+ public static int resolveDefaultColor(Context context, int backgroundColor) {
+ boolean useDark = shouldUseDark(backgroundColor);
+ if (useDark) {
+ return context.getColor(
+ com.android.internal.R.color.notification_default_color_light);
+ } else {
+ return context.getColor(
+ com.android.internal.R.color.notification_default_color_dark);
+ }
+ }
+
public static int resolveActionBarColor(Context context, int backgroundColor) {
if (backgroundColor == Notification.COLOR_DEFAULT) {
return context.getColor(com.android.internal.R.color.notification_action_list);
diff --git a/core/java/com/android/internal/util/NotificationMessagingUtil.java b/core/java/com/android/internal/util/NotificationMessagingUtil.java
index b962d4fc9f5e..bf796cddd89e 100644
--- a/core/java/com/android/internal/util/NotificationMessagingUtil.java
+++ b/core/java/com/android/internal/util/NotificationMessagingUtil.java
@@ -26,7 +26,6 @@ import android.os.Looper;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
-import android.text.TextUtils;
import android.util.ArrayMap;
import java.util.Objects;
@@ -47,6 +46,18 @@ public class NotificationMessagingUtil {
Settings.Secure.getUriFor(DEFAULT_SMS_APP_SETTING), false, mSmsContentObserver);
}
+ public boolean isImportantMessaging(StatusBarNotification sbn, int importance) {
+ if (importance < NotificationManager.IMPORTANCE_LOW) {
+ return false;
+ }
+
+ return hasMessagingStyle(sbn) || (isCategoryMessage(sbn) && isDefaultMessagingApp(sbn));
+ }
+
+ public boolean isMessaging(StatusBarNotification sbn) {
+ return hasMessagingStyle(sbn) || isDefaultMessagingApp(sbn) || isCategoryMessage(sbn);
+ }
+
@SuppressWarnings("deprecation")
private boolean isDefaultMessagingApp(StatusBarNotification sbn) {
final int userId = sbn.getUserId();
@@ -73,25 +84,12 @@ public class NotificationMessagingUtil {
}
};
- public boolean isImportantMessaging(StatusBarNotification sbn, int importance) {
- if (importance < NotificationManager.IMPORTANCE_LOW) {
- return false;
- }
-
- return isMessaging(sbn);
- }
-
- public boolean isMessaging(StatusBarNotification sbn) {
+ private boolean hasMessagingStyle(StatusBarNotification sbn) {
Class<? extends Notification.Style> style = sbn.getNotification().getNotificationStyle();
- if (Notification.MessagingStyle.class.equals(style)) {
- return true;
- }
-
- if (Notification.CATEGORY_MESSAGE.equals(sbn.getNotification().category)
- && isDefaultMessagingApp(sbn)) {
- return true;
- }
+ return Notification.MessagingStyle.class.equals(style);
+ }
- return false;
+ private boolean isCategoryMessage(StatusBarNotification sbn) {
+ return Notification.CATEGORY_MESSAGE.equals(sbn.getNotification().category);
}
}
diff --git a/core/java/com/android/internal/util/ProviderAccessStats.java b/core/java/com/android/internal/util/ProviderAccessStats.java
new file mode 100644
index 000000000000..c3ffb02c22f1
--- /dev/null
+++ b/core/java/com/android/internal/util/ProviderAccessStats.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.internal.util;
+
+import android.os.SystemClock;
+import android.util.SparseBooleanArray;
+import android.util.SparseLongArray;
+
+import java.io.PrintWriter;
+
+public class ProviderAccessStats {
+ private final Object mLock = new Object();
+
+ private final long mStartUptime = SystemClock.uptimeMillis();
+
+ private final SparseBooleanArray mAllCallingUids = new SparseBooleanArray();
+ private final SparseLongArray mQueryStats = new SparseLongArray(16);
+ private final SparseLongArray mBatchStats = new SparseLongArray(0);
+ private final SparseLongArray mInsertStats = new SparseLongArray(0);
+ private final SparseLongArray mUpdateStats = new SparseLongArray(0);
+ private final SparseLongArray mDeleteStats = new SparseLongArray(0);
+ private final SparseLongArray mInsertInBatchStats = new SparseLongArray(0);
+ private final SparseLongArray mUpdateInBatchStats = new SparseLongArray(0);
+ private final SparseLongArray mDeleteInBatchStats = new SparseLongArray(0);
+
+ private final SparseLongArray mOperationDurationMillis = new SparseLongArray(16);
+
+ private static class PerThreadData {
+ public int nestCount;
+ public long startUptimeMillis;
+ }
+
+ private final ThreadLocal<PerThreadData> mThreadLocal =
+ ThreadLocal.withInitial(() -> new PerThreadData());
+
+ private void incrementStats(int callingUid, SparseLongArray stats) {
+ synchronized (mLock) {
+ stats.put(callingUid, stats.get(callingUid) + 1);
+ mAllCallingUids.put(callingUid, true);
+ }
+
+ final PerThreadData data = mThreadLocal.get();
+ data.nestCount++;
+ if (data.nestCount == 1) {
+ data.startUptimeMillis = SystemClock.uptimeMillis();
+ }
+ }
+
+ private void incrementStats(int callingUid, boolean inBatch,
+ SparseLongArray statsNonBatch, SparseLongArray statsInBatch) {
+ incrementStats(callingUid, inBatch ? statsInBatch : statsNonBatch);
+ }
+
+ public final void incrementInsertStats(int callingUid, boolean inBatch) {
+ incrementStats(callingUid, inBatch, mInsertStats, mInsertInBatchStats);
+ }
+
+ public final void incrementUpdateStats(int callingUid, boolean inBatch) {
+ incrementStats(callingUid, inBatch, mUpdateStats, mUpdateInBatchStats);
+ }
+
+ public final void incrementDeleteStats(int callingUid, boolean inBatch) {
+ incrementStats(callingUid, inBatch, mDeleteStats, mDeleteInBatchStats);
+ }
+
+ public final void incrementQueryStats(int callingUid) {
+ incrementStats(callingUid, mQueryStats);
+ }
+
+ public final void incrementBatchStats(int callingUid) {
+ incrementStats(callingUid, mBatchStats);
+ }
+
+ public void finishOperation(int callingUid) {
+ final PerThreadData data = mThreadLocal.get();
+ data.nestCount--;
+ if (data.nestCount == 0) {
+ // Because we only have millisecond granularity, let's always attribute at least 1ms
+ // for each operation.
+ final long duration = Math.max(1, SystemClock.uptimeMillis() - data.startUptimeMillis);
+
+ synchronized (mLock) {
+ mOperationDurationMillis.put(callingUid,
+ mOperationDurationMillis.get(callingUid) + duration);
+ }
+ }
+ }
+
+ public void dump(PrintWriter pw, String prefix) {
+ synchronized (mLock) {
+ pw.print(" Process uptime: ");
+ pw.print((SystemClock.uptimeMillis() - mStartUptime) / (60 * 1000));
+ pw.println(" minutes");
+ pw.println();
+
+ pw.print(prefix);
+ pw.println("Client activities:");
+ pw.print(prefix);
+ pw.println(" UID Query Insert Update Delete Batch Insert Update Delete"
+ + " Sec");
+ for (int i = 0; i < mAllCallingUids.size(); i++) {
+ final int uid = mAllCallingUids.keyAt(i);
+ pw.print(prefix);
+ pw.println(String.format(
+ " %-9d %6d %6d %6d %6d %6d %6d %6d %6d %12.3f",
+ uid,
+ mQueryStats.get(uid),
+ mInsertStats.get(uid),
+ mUpdateStats.get(uid),
+ mDeleteStats.get(uid),
+ mBatchStats.get(uid),
+ mInsertInBatchStats.get(uid),
+ mUpdateInBatchStats.get(uid),
+ mDeleteInBatchStats.get(uid),
+ (mOperationDurationMillis.get(uid) / 1000.0)
+ ));
+ }
+ pw.println();
+ }
+ }
+}
diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl
index 25e1589db74e..bff34ca23956 100644
--- a/core/java/com/android/internal/widget/ILockSettings.aidl
+++ b/core/java/com/android/internal/widget/ILockSettings.aidl
@@ -74,14 +74,17 @@ interface ILockSettings {
void setRecoverySecretTypes(in int[] secretTypes);
int[] getRecoverySecretTypes();
int[] getPendingRecoverySecretTypes();
- void recoverySecretAvailable(in KeyChainProtectionParams recoverySecret);
byte[] startRecoverySession(in String sessionId,
in byte[] verifierPublicKey, in byte[] vaultParams, in byte[] vaultChallenge,
in List<KeyChainProtectionParams> secrets);
- byte[] startRecoverySessionWithCertPath(in String sessionId,
+ byte[] startRecoverySessionWithCertPath(in String sessionId, in String rootCertificateAlias,
in RecoveryCertPath verifierCertPath, in byte[] vaultParams, in byte[] vaultChallenge,
in List<KeyChainProtectionParams> secrets);
Map/*<String, byte[]>*/ recoverKeys(in String sessionId, in byte[] recoveryKeyBlob,
in List<WrappedApplicationKey> applicationKeys);
+ Map/*<String, String>*/ recoverKeyChainSnapshot(
+ in String sessionId,
+ in byte[] recoveryKeyBlob,
+ in List<WrappedApplicationKey> applicationKeys);
void closeSession(in String sessionId);
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index fde7e961b843..d4ab4265b3fb 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -16,6 +16,15 @@
package com.android.internal.widget;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_MANAGED;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.app.admin.DevicePolicyManager;
@@ -59,7 +68,6 @@ import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-
/**
* Utilities for the lock pattern and its settings.
*/
@@ -585,7 +593,7 @@ public class LockPatternUtils {
return quality;
}
- return DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+ return PASSWORD_QUALITY_UNSPECIFIED;
}
/**
@@ -604,13 +612,16 @@ public class LockPatternUtils {
* Clear any lock pattern or password.
*/
public void clearLock(String savedCredential, int userHandle) {
- setLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, userHandle);
+ final int currentQuality = getKeyguardStoredPasswordQuality(userHandle);
+ setKeyguardStoredPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED, userHandle);
try{
getLockSettings().setLockCredential(null, CREDENTIAL_TYPE_NONE, savedCredential,
- DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, userHandle);
- } catch (RemoteException e) {
- // well, we tried...
+ PASSWORD_QUALITY_UNSPECIFIED, userHandle);
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to clear lock", e);
+ setKeyguardStoredPasswordQuality(currentQuality, userHandle);
+ return;
}
if (userHandle == UserHandle.USER_SYSTEM) {
@@ -669,32 +680,34 @@ public class LockPatternUtils {
* @param userId the user whose pattern is to be saved.
*/
public void saveLockPattern(List<LockPatternView.Cell> pattern, String savedPattern, int userId) {
- try {
- if (pattern == null || pattern.size() < MIN_LOCK_PATTERN_SIZE) {
- throw new IllegalArgumentException("pattern must not be null and at least "
- + MIN_LOCK_PATTERN_SIZE + " dots long.");
- }
-
- setLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, userId);
- getLockSettings().setLockCredential(patternToString(pattern), CREDENTIAL_TYPE_PATTERN,
- savedPattern, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, userId);
+ if (pattern == null || pattern.size() < MIN_LOCK_PATTERN_SIZE) {
+ throw new IllegalArgumentException("pattern must not be null and at least "
+ + MIN_LOCK_PATTERN_SIZE + " dots long.");
+ }
- // Update the device encryption password.
- if (userId == UserHandle.USER_SYSTEM
- && LockPatternUtils.isDeviceEncryptionEnabled()) {
- if (!shouldEncryptWithCredentials(true)) {
- clearEncryptionPassword();
- } else {
- String stringPattern = patternToString(pattern);
- updateEncryptionPassword(StorageManager.CRYPT_TYPE_PATTERN, stringPattern);
- }
+ final String stringPattern = patternToString(pattern);
+ final int currentQuality = getKeyguardStoredPasswordQuality(userId);
+ setKeyguardStoredPasswordQuality(PASSWORD_QUALITY_SOMETHING, userId);
+ try {
+ getLockSettings().setLockCredential(stringPattern, CREDENTIAL_TYPE_PATTERN,
+ savedPattern, PASSWORD_QUALITY_SOMETHING, userId);
+ } catch (Exception e) {
+ Log.e(TAG, "Couldn't save lock pattern", e);
+ setKeyguardStoredPasswordQuality(currentQuality, userId);
+ return;
+ }
+ // Update the device encryption password.
+ if (userId == UserHandle.USER_SYSTEM
+ && LockPatternUtils.isDeviceEncryptionEnabled()) {
+ if (!shouldEncryptWithCredentials(true)) {
+ clearEncryptionPassword();
+ } else {
+ updateEncryptionPassword(StorageManager.CRYPT_TYPE_PATTERN, stringPattern);
}
-
- reportPatternWasChosen(userId);
- onAfterChangingPassword(userId);
- } catch (RemoteException re) {
- Log.e(TAG, "Couldn't save lock pattern " + re);
}
+
+ reportPatternWasChosen(userId);
+ onAfterChangingPassword(userId);
}
private void updateCryptoUserInfo(int userId) {
@@ -796,25 +809,27 @@ public class LockPatternUtils {
*/
public void saveLockPassword(String password, String savedPassword, int requestedQuality,
int userHandle) {
- try {
- if (password == null || password.length() < MIN_LOCK_PASSWORD_SIZE) {
- throw new IllegalArgumentException("password must not be null and at least "
- + "of length " + MIN_LOCK_PASSWORD_SIZE);
- }
-
- setLong(PASSWORD_TYPE_KEY,
- computePasswordQuality(CREDENTIAL_TYPE_PASSWORD, password, requestedQuality),
- userHandle);
- getLockSettings().setLockCredential(password, CREDENTIAL_TYPE_PASSWORD, savedPassword,
- requestedQuality, userHandle);
+ if (password == null || password.length() < MIN_LOCK_PASSWORD_SIZE) {
+ throw new IllegalArgumentException("password must not be null and at least "
+ + "of length " + MIN_LOCK_PASSWORD_SIZE);
+ }
- updateEncryptionPasswordIfNeeded(password,
- PasswordMetrics.computeForPassword(password).quality, userHandle);
- updatePasswordHistory(password, userHandle);
- } catch (RemoteException re) {
- // Cant do much
- Log.e(TAG, "Unable to save lock password " + re);
+ final int currentQuality = getKeyguardStoredPasswordQuality(userHandle);
+ setKeyguardStoredPasswordQuality(
+ computePasswordQuality(CREDENTIAL_TYPE_PASSWORD, password, requestedQuality),
+ userHandle);
+ try {
+ getLockSettings().setLockCredential(password, CREDENTIAL_TYPE_PASSWORD,
+ savedPassword, requestedQuality, userHandle);
+ } catch (Exception e) {
+ Log.e(TAG, "Unable to save lock password", e);
+ setKeyguardStoredPasswordQuality(currentQuality, userHandle);
+ return;
}
+
+ updateEncryptionPasswordIfNeeded(password,
+ PasswordMetrics.computeForPassword(password).quality, userHandle);
+ updatePasswordHistory(password, userHandle);
}
/**
@@ -828,9 +843,8 @@ public class LockPatternUtils {
if (!shouldEncryptWithCredentials(true)) {
clearEncryptionPassword();
} else {
- boolean numeric = quality == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
- boolean numericComplex = quality
- == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
+ boolean numeric = quality == PASSWORD_QUALITY_NUMERIC;
+ boolean numericComplex = quality == PASSWORD_QUALITY_NUMERIC_COMPLEX;
int type = numeric || numericComplex ? StorageManager.CRYPT_TYPE_PIN
: StorageManager.CRYPT_TYPE_PASSWORD;
updateEncryptionPassword(type, password);
@@ -894,8 +908,11 @@ public class LockPatternUtils {
* @return stored password quality
*/
public int getKeyguardStoredPasswordQuality(int userHandle) {
- return (int) getLong(PASSWORD_TYPE_KEY,
- DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, userHandle);
+ return (int) getLong(PASSWORD_TYPE_KEY, PASSWORD_QUALITY_UNSPECIFIED, userHandle);
+ }
+
+ private void setKeyguardStoredPasswordQuality(int quality, int userHandle) {
+ setLong(PASSWORD_TYPE_KEY, quality, userHandle);
}
/**
@@ -909,9 +926,9 @@ public class LockPatternUtils {
int computedQuality = PasswordMetrics.computeForPassword(credential).quality;
quality = Math.max(requestedQuality, computedQuality);
} else if (type == CREDENTIAL_TYPE_PATTERN) {
- quality = DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+ quality = PASSWORD_QUALITY_SOMETHING;
} else /* if (type == CREDENTIAL_TYPE_NONE) */ {
- quality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+ quality = PASSWORD_QUALITY_UNSPECIFIED;
}
return quality;
}
@@ -1125,12 +1142,12 @@ public class LockPatternUtils {
}
private boolean isLockPasswordEnabled(int mode, int userId) {
- final boolean passwordEnabled = mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
- || mode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
- || mode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX
- || mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
- || mode == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX
- || mode == DevicePolicyManager.PASSWORD_QUALITY_MANAGED;
+ final boolean passwordEnabled = mode == PASSWORD_QUALITY_ALPHABETIC
+ || mode == PASSWORD_QUALITY_NUMERIC
+ || mode == PASSWORD_QUALITY_NUMERIC_COMPLEX
+ || mode == PASSWORD_QUALITY_ALPHANUMERIC
+ || mode == PASSWORD_QUALITY_COMPLEX
+ || mode == PASSWORD_QUALITY_MANAGED;
return passwordEnabled && savedPasswordExists(userId);
}
@@ -1155,8 +1172,7 @@ public class LockPatternUtils {
}
private boolean isLockPatternEnabled(int mode, int userId) {
- return mode == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
- && savedPatternExists(userId);
+ return mode == PASSWORD_QUALITY_SOMETHING && savedPatternExists(userId);
}
/**
@@ -1551,7 +1567,7 @@ public class LockPatternUtils {
token, quality, userId)) {
return false;
}
- setLong(PASSWORD_TYPE_KEY, quality, userId);
+ setKeyguardStoredPasswordQuality(quality, userId);
updateEncryptionPasswordIfNeeded(credential, quality, userId);
updatePasswordHistory(credential, userId);
@@ -1560,12 +1576,10 @@ public class LockPatternUtils {
throw new IllegalArgumentException("password must be emtpy for NONE type");
}
if (!localService.setLockCredentialWithToken(null, CREDENTIAL_TYPE_NONE,
- tokenHandle, token, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED,
- userId)) {
+ tokenHandle, token, PASSWORD_QUALITY_UNSPECIFIED, userId)) {
return false;
}
- setLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED,
- userId);
+ setKeyguardStoredPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED, userId);
if (userId == UserHandle.USER_SYSTEM) {
// Set the encryption password to default.
diff --git a/core/jni/android/graphics/AnimatedImageDrawable.cpp b/core/jni/android/graphics/AnimatedImageDrawable.cpp
index d6496cdf499a..7166c757e602 100644
--- a/core/jni/android/graphics/AnimatedImageDrawable.cpp
+++ b/core/jni/android/graphics/AnimatedImageDrawable.cpp
@@ -42,7 +42,6 @@ static jlong AnimatedImageDrawable_nCreate(JNIEnv* env, jobject /*clazz*/,
}
auto* imageDecoder = reinterpret_cast<ImageDecoder*>(nativeImageDecoder);
- auto info = imageDecoder->mCodec->getInfo();
const SkISize scaledSize = SkISize::Make(width, height);
SkIRect subset;
if (jsubset) {
@@ -51,6 +50,35 @@ static jlong AnimatedImageDrawable_nCreate(JNIEnv* env, jobject /*clazz*/,
subset = SkIRect::MakeWH(width, height);
}
+ auto info = imageDecoder->mCodec->getInfo();
+ bool hasRestoreFrame = false;
+ if (imageDecoder->mCodec->getEncodedFormat() == SkEncodedImageFormat::kWEBP) {
+ if (width < info.width() && height < info.height()) {
+ // WebP will scale its SkBitmap to the scaled size.
+ // FIXME: b/73529447 GIF should do the same.
+ info = info.makeWH(width, height);
+ }
+ } else {
+ const int frameCount = imageDecoder->mCodec->codec()->getFrameCount();
+ for (int i = 0; i < frameCount; ++i) {
+ SkCodec::FrameInfo frameInfo;
+ if (!imageDecoder->mCodec->codec()->getFrameInfo(i, &frameInfo)) {
+ doThrowIOE(env, "Failed to read frame info!");
+ return 0;
+ }
+ if (frameInfo.fDisposalMethod == SkCodecAnimation::DisposalMethod::kRestorePrevious) {
+ hasRestoreFrame = true;
+ break;
+ }
+ }
+ }
+
+ size_t bytesUsed = info.computeMinByteSize();
+ // SkAnimatedImage has one SkBitmap for decoding, plus an extra one if there is a
+ // kRestorePrevious frame. AnimatedImageDrawable has two SkPictures storing the current
+ // frame and the next frame. (The former assumes that the image is animated, and the
+ // latter assumes that it is drawn to a hardware canvas.)
+ bytesUsed *= hasRestoreFrame ? 4 : 3;
sk_sp<SkPicture> picture;
if (jpostProcess) {
SkRect bounds = SkRect::MakeWH(subset.width(), subset.height());
@@ -63,6 +91,7 @@ static jlong AnimatedImageDrawable_nCreate(JNIEnv* env, jobject /*clazz*/,
return 0;
}
picture = recorder.finishRecordingAsPicture();
+ bytesUsed += picture->approximateBytesUsed();
}
@@ -74,7 +103,10 @@ static jlong AnimatedImageDrawable_nCreate(JNIEnv* env, jobject /*clazz*/,
return 0;
}
- sk_sp<AnimatedImageDrawable> drawable(new AnimatedImageDrawable(animatedImg));
+ bytesUsed += sizeof(animatedImg.get());
+
+ sk_sp<AnimatedImageDrawable> drawable(new AnimatedImageDrawable(std::move(animatedImg),
+ bytesUsed));
return reinterpret_cast<jlong>(drawable.release());
}
@@ -202,10 +234,9 @@ static void AnimatedImageDrawable_nSetOnAnimationEndListener(JNIEnv* env, jobjec
}
}
-static long AnimatedImageDrawable_nNativeByteSize(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
+static jlong AnimatedImageDrawable_nNativeByteSize(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
- // FIXME: Report the size of the internal SkBitmap etc.
- return sizeof(drawable);
+ return drawable->byteSize();
}
static void AnimatedImageDrawable_nMarkInvisible(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
diff --git a/core/jni/android/graphics/ColorFilter.cpp b/core/jni/android/graphics/ColorFilter.cpp
index 4b6578bdff7f..3fcedd0264ae 100644
--- a/core/jni/android/graphics/ColorFilter.cpp
+++ b/core/jni/android/graphics/ColorFilter.cpp
@@ -30,8 +30,8 @@ using namespace uirenderer;
class SkColorFilterGlue {
public:
- static void SafeUnref(SkShader* shader) {
- SkSafeUnref(shader);
+ static void SafeUnref(SkColorFilter* filter) {
+ SkSafeUnref(filter);
}
static jlong GetNativeFinalizer(JNIEnv*, jobject) {
diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp
index e2ce1a465fd7..726c450a4af2 100644
--- a/core/jni/android/graphics/ImageDecoder.cpp
+++ b/core/jni/android/graphics/ImageDecoder.cpp
@@ -38,48 +38,81 @@ using namespace android;
static jclass gImageDecoder_class;
static jclass gSize_class;
-static jclass gIncomplete_class;
+static jclass gDecodeException_class;
static jclass gCanvas_class;
static jmethodID gImageDecoder_constructorMethodID;
static jmethodID gImageDecoder_postProcessMethodID;
static jmethodID gSize_constructorMethodID;
-static jmethodID gIncomplete_constructorMethodID;
+static jmethodID gDecodeException_constructorMethodID;
static jmethodID gCallback_onPartialImageMethodID;
static jmethodID gCanvas_constructorMethodID;
static jmethodID gCanvas_releaseMethodID;
-static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream) {
+// Clear and return any pending exception for handling other than throwing directly.
+static jthrowable get_and_clear_exception(JNIEnv* env) {
+ jthrowable jexception = env->ExceptionOccurred();
+ if (jexception) {
+ env->ExceptionClear();
+ }
+ return jexception;
+}
+
+// Throw a new ImageDecoder.DecodeException. Returns null for convenience.
+static jobject throw_exception(JNIEnv* env, ImageDecoder::Error error, const char* msg,
+ jthrowable cause, jobject source) {
+ jstring jstr = nullptr;
+ if (msg) {
+ jstr = env->NewStringUTF(msg);
+ if (!jstr) {
+ // Out of memory.
+ return nullptr;
+ }
+ }
+ jthrowable exception = (jthrowable) env->NewObject(gDecodeException_class,
+ gDecodeException_constructorMethodID, error, jstr, cause, source);
+ // Only throw if not out of memory.
+ if (exception) {
+ env->Throw(exception);
+ }
+ return nullptr;
+}
+
+static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream, jobject source) {
if (!stream.get()) {
- doThrowIOE(env, "Failed to create a stream");
- return nullptr;
+ return throw_exception(env, ImageDecoder::kSourceMalformedData, "Failed to create a stream",
+ nullptr, source);
}
std::unique_ptr<ImageDecoder> decoder(new ImageDecoder);
SkCodec::Result result;
auto codec = SkCodec::MakeFromStream(std::move(stream), &result, decoder->mPeeker.get());
+ if (jthrowable jexception = get_and_clear_exception(env)) {
+ return throw_exception(env, ImageDecoder::kSourceException, "", jexception, source);
+ }
if (!codec) {
switch (result) {
case SkCodec::kIncompleteInput:
- env->ThrowNew(gIncomplete_class, "Incomplete input");
- break;
+ return throw_exception(env, ImageDecoder::kSourceIncomplete, "", nullptr, source);
default:
SkString msg;
msg.printf("Failed to create image decoder with message '%s'",
SkCodec::ResultToString(result));
- doThrowIOE(env, msg.c_str());
- break;
+ return throw_exception(env, ImageDecoder::kSourceMalformedData, msg.c_str(),
+ nullptr, source);
}
- return nullptr;
}
- // FIXME: Avoid parsing the whole image?
const bool animated = codec->getFrameCount() > 1;
+ if (jthrowable jexception = get_and_clear_exception(env)) {
+ return throw_exception(env, ImageDecoder::kSourceException, "", jexception, source);
+ }
+
decoder->mCodec = SkAndroidCodec::MakeFromCodec(std::move(codec),
SkAndroidCodec::ExifOrientationBehavior::kRespect);
if (!decoder->mCodec.get()) {
- doThrowIOE(env, "Could not create AndroidCodec");
- return nullptr;
+ return throw_exception(env, ImageDecoder::kSourceMalformedData, "", nullptr, source);
}
+
const auto& info = decoder->mCodec->getInfo();
const int width = info.width();
const int height = info.height();
@@ -89,26 +122,26 @@ static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream) {
}
static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/,
- jobject fileDescriptor) {
+ jobject fileDescriptor, jobject source) {
int descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor);
struct stat fdStat;
if (fstat(descriptor, &fdStat) == -1) {
- doThrowIOE(env, "broken file descriptor; fstat returned -1");
- return nullptr;
+ return throw_exception(env, ImageDecoder::kSourceMalformedData,
+ "broken file descriptor; fstat returned -1", nullptr, source);
}
int dupDescriptor = dup(descriptor);
FILE* file = fdopen(dupDescriptor, "r");
if (file == NULL) {
close(dupDescriptor);
- doThrowIOE(env, "Could not open file");
- return nullptr;
+ return throw_exception(env, ImageDecoder::kSourceMalformedData, "Could not open file",
+ nullptr, source);
}
std::unique_ptr<SkFILEStream> fileStream(new SkFILEStream(file));
if (::lseek(descriptor, 0, SEEK_CUR) == 0) {
- return native_create(env, std::move(fileStream));
+ return native_create(env, std::move(fileStream), source);
}
// FIXME: This allows us to pretend the current location is the beginning,
@@ -116,44 +149,46 @@ static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/,
// point as the beginning.
std::unique_ptr<SkStream> stream(SkFrontBufferedStream::Make(std::move(fileStream),
SkCodec::MinBufferedBytesNeeded()));
- return native_create(env, std::move(stream));
+ return native_create(env, std::move(stream), source);
}
static jobject ImageDecoder_nCreateInputStream(JNIEnv* env, jobject /*clazz*/,
- jobject is, jbyteArray storage) {
+ jobject is, jbyteArray storage, jobject source) {
std::unique_ptr<SkStream> stream(CreateJavaInputStreamAdaptor(env, is, storage, false));
if (!stream.get()) {
- doThrowIOE(env, "Failed to create stream!");
- return nullptr;
+ return throw_exception(env, ImageDecoder::kSourceMalformedData, "Failed to create a stream",
+ nullptr, source);
}
+
std::unique_ptr<SkStream> bufferedStream(
SkFrontBufferedStream::Make(std::move(stream),
SkCodec::MinBufferedBytesNeeded()));
- return native_create(env, std::move(bufferedStream));
+ return native_create(env, std::move(bufferedStream), source);
}
-static jobject ImageDecoder_nCreateAsset(JNIEnv* env, jobject /*clazz*/, jlong assetPtr) {
+static jobject ImageDecoder_nCreateAsset(JNIEnv* env, jobject /*clazz*/, jlong assetPtr,
+ jobject source) {
Asset* asset = reinterpret_cast<Asset*>(assetPtr);
std::unique_ptr<SkStream> stream(new AssetStreamAdaptor(asset));
- return native_create(env, std::move(stream));
+ return native_create(env, std::move(stream), source);
}
static jobject ImageDecoder_nCreateByteBuffer(JNIEnv* env, jobject /*clazz*/, jobject jbyteBuffer,
- jint initialPosition, jint limit) {
+ jint initialPosition, jint limit, jobject source) {
std::unique_ptr<SkStream> stream = CreateByteBufferStreamAdaptor(env, jbyteBuffer,
initialPosition, limit);
if (!stream) {
- doThrowIOE(env, "Failed to read ByteBuffer");
- return nullptr;
+ return throw_exception(env, ImageDecoder::kSourceMalformedData, "Failed to read ByteBuffer",
+ nullptr, source);
}
- return native_create(env, std::move(stream));
+ return native_create(env, std::move(stream), source);
}
static jobject ImageDecoder_nCreateByteArray(JNIEnv* env, jobject /*clazz*/, jbyteArray byteArray,
- jint offset, jint length) {
+ jint offset, jint length, jobject source) {
std::unique_ptr<SkStream> stream(CreateByteArrayStreamAdaptor(env, byteArray, offset, length));
- return native_create(env, std::move(stream));
+ return native_create(env, std::move(stream), source);
}
jint postProcessAndRelease(JNIEnv* env, jobject jimageDecoder, std::unique_ptr<Canvas> canvas) {
@@ -170,10 +205,8 @@ jint postProcessAndRelease(JNIEnv* env, jobject jimageDecoder, std::unique_ptr<C
return env->CallIntMethod(jimageDecoder, gImageDecoder_postProcessMethodID, jcanvas);
}
-// Note: jpostProcess points to an ImageDecoder object if it has a PostProcess object, and nullptr
-// otherwise.
static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong nativePtr,
- jobject jcallback, jobject jpostProcess,
+ jobject jdecoder, jboolean jpostProcess,
jint desiredWidth, jint desiredHeight, jobject jsubset,
jboolean requireMutable, jint allocator,
jboolean requireUnpremul, jboolean preferRamOverQuality,
@@ -264,11 +297,8 @@ static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong
SkAndroidCodec::AndroidOptions options;
options.fSampleSize = sampleSize;
auto result = codec->getAndroidPixels(decodeInfo, bm.getPixels(), bm.rowBytes(), &options);
- jthrowable jexception = env->ExceptionOccurred();
- if (jexception) {
- env->ExceptionClear();
- }
- int onPartialImageError = jexception ? 1 // ImageDecoder.java's ERROR_SOURCE_EXCEPTION
+ jthrowable jexception = get_and_clear_exception(env);
+ int onPartialImageError = jexception ? ImageDecoder::kSourceException
: 0; // No error.
switch (result) {
case SkCodec::kSuccess:
@@ -278,12 +308,12 @@ static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong
break;
case SkCodec::kIncompleteInput:
if (!jexception) {
- onPartialImageError = 2; // ImageDecoder.java's ERROR_SOURCE_EXCEPTION
+ onPartialImageError = ImageDecoder::kSourceIncomplete;
}
break;
case SkCodec::kErrorInInput:
if (!jexception) {
- onPartialImageError = 3; // ImageDecoder.java's ERROR_SOURCE_ERROR
+ onPartialImageError = ImageDecoder::kSourceMalformedData;
}
break;
default:
@@ -293,24 +323,12 @@ static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong
return nullptr;
}
- if (jexception || onPartialImageError) {
- bool throwException = !jcallback ||
- !env->CallBooleanMethod(jcallback, gCallback_onPartialImageMethodID,
- onPartialImageError);
+ if (onPartialImageError) {
+ env->CallVoidMethod(jdecoder, gCallback_onPartialImageMethodID, onPartialImageError,
+ jexception);
if (env->ExceptionCheck()) {
return nullptr;
}
-
- if (throwException) {
- if (jexception) {
- env->Throw(jexception);
- } else if (onPartialImageError == 2) {
- env->ThrowNew(gIncomplete_class, "Incomplete input");
- } else {
- doThrowIOE(env, "image has an error!");
- }
- return nullptr;
- }
}
float scaleX = 1.0f;
@@ -357,11 +375,6 @@ static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong
SkIRect subset;
GraphicsJNI::jrect_to_irect(env, jsubset, &subset);
- // FIXME: If there is no scale, should this instead call
- // SkBitmap::extractSubset? If we could upload a subset
- // (b/70626068), this would save memory and time. Even for a
- // software Bitmap, the extra speed might be worth the memory
- // tradeoff if the subset is large?
translateX = -subset.fLeft;
translateY = -subset.fTop;
desiredWidth = subset.width();
@@ -404,7 +417,7 @@ static jobject ImageDecoder_nDecodeBitmap(JNIEnv* env, jobject /*clazz*/, jlong
if (jpostProcess) {
std::unique_ptr<Canvas> canvas(Canvas::create_canvas(bm));
- jint pixelFormat = postProcessAndRelease(env, jpostProcess, std::move(canvas));
+ jint pixelFormat = postProcessAndRelease(env, jdecoder, std::move(canvas));
if (env->ExceptionCheck()) {
return nullptr;
}
@@ -495,12 +508,12 @@ static jstring ImageDecoder_nGetMimeType(JNIEnv* env, jobject /*clazz*/, jlong n
}
static const JNINativeMethod gImageDecoderMethods[] = {
- { "nCreate", "(J)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateAsset },
- { "nCreate", "(Ljava/nio/ByteBuffer;II)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer },
- { "nCreate", "([BII)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteArray },
- { "nCreate", "(Ljava/io/InputStream;[B)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateInputStream },
- { "nCreate", "(Ljava/io/FileDescriptor;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateFd },
- { "nDecodeBitmap", "(JLandroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder;IILandroid/graphics/Rect;ZIZZZ)Landroid/graphics/Bitmap;",
+ { "nCreate", "(JLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateAsset },
+ { "nCreate", "(Ljava/nio/ByteBuffer;IILandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer },
+ { "nCreate", "([BIILandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteArray },
+ { "nCreate", "(Ljava/io/InputStream;[BLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateInputStream },
+ { "nCreate", "(Ljava/io/FileDescriptor;Landroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateFd },
+ { "nDecodeBitmap", "(JLandroid/graphics/ImageDecoder;ZIILandroid/graphics/Rect;ZIZZZ)Landroid/graphics/Bitmap;",
(void*) ImageDecoder_nDecodeBitmap },
{ "nGetSampledSize","(JI)Landroid/util/Size;", (void*) ImageDecoder_nGetSampledSize },
{ "nGetPadding", "(JLandroid/graphics/Rect;)V", (void*) ImageDecoder_nGetPadding },
@@ -516,10 +529,10 @@ int register_android_graphics_ImageDecoder(JNIEnv* env) {
gSize_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/util/Size"));
gSize_constructorMethodID = GetMethodIDOrDie(env, gSize_class, "<init>", "(II)V");
- gIncomplete_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/ImageDecoder$IncompleteException"));
- gIncomplete_constructorMethodID = GetMethodIDOrDie(env, gIncomplete_class, "<init>", "()V");
+ gDecodeException_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/ImageDecoder$DecodeException"));
+ gDecodeException_constructorMethodID = GetMethodIDOrDie(env, gDecodeException_class, "<init>", "(ILjava/lang/String;Ljava/lang/Throwable;Landroid/graphics/ImageDecoder$Source;)V");
- gCallback_onPartialImageMethodID = GetMethodIDOrDie(env, gImageDecoder_class, "onPartialImage", "(I)Z");
+ gCallback_onPartialImageMethodID = GetMethodIDOrDie(env, gImageDecoder_class, "onPartialImage", "(ILjava/lang/Throwable;)V");
gCanvas_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Canvas"));
gCanvas_constructorMethodID = GetMethodIDOrDie(env, gCanvas_class, "<init>", "(J)V");
diff --git a/core/jni/android/graphics/ImageDecoder.h b/core/jni/android/graphics/ImageDecoder.h
index 5d7e67690c22..fd9827bd74ca 100644
--- a/core/jni/android/graphics/ImageDecoder.h
+++ b/core/jni/android/graphics/ImageDecoder.h
@@ -33,6 +33,13 @@ struct ImageDecoder {
kHardware_Allocator = 3,
};
+ // These need to stay in sync with ImageDecoder.java's Error constants.
+ enum Error {
+ kSourceException = 1,
+ kSourceIncomplete = 2,
+ kSourceMalformedData = 3,
+ };
+
// These need to stay in sync with PixelFormat.java's Format constants.
enum PixelFormat {
kUnknown = 0,
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index 0017f6cd8a41..c9bfa137c7ac 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -18,6 +18,7 @@
#include "GraphicsJNI.h"
#include "core_jni_helpers.h"
+#include <android/api-level.h>
#include <androidfw/ResourceTypes.h>
#include <hwui/Canvas.h>
#include <hwui/Paint.h>
@@ -467,6 +468,13 @@ static void drawBitmapArray(JNIEnv* env, jobject, jlong canvasHandle,
static void drawBitmapMesh(JNIEnv* env, jobject, jlong canvasHandle, jobject jbitmap,
jint meshWidth, jint meshHeight, jfloatArray jverts,
jint vertIndex, jintArray jcolors, jint colorIndex, jlong paintHandle) {
+ if (Canvas::GetApiLevel() < __ANDROID_API_P__) {
+ // Before P we forgot to respect these. Now that we do respect them, explicitly
+ // zero them for backward compatibility.
+ vertIndex = 0;
+ colorIndex = 0;
+ }
+
const int ptCount = (meshWidth + 1) * (meshHeight + 1);
AutoJavaFloatArray vertA(env, jverts, vertIndex + (ptCount << 1));
AutoJavaIntArray colorA(env, jcolors, colorIndex + ptCount);
@@ -474,7 +482,8 @@ static void drawBitmapMesh(JNIEnv* env, jobject, jlong canvasHandle, jobject jbi
const Paint* paint = reinterpret_cast<Paint*>(paintHandle);
Bitmap& bitmap = android::bitmap::toBitmap(env, jbitmap);
get_canvas(canvasHandle)->drawBitmapMesh(bitmap, meshWidth, meshHeight,
- vertA.ptr(), colorA.ptr(), paint);
+ vertA.ptr() + vertIndex*2,
+ colorA.ptr() + colorIndex, paint);
}
static void drawTextChars(JNIEnv* env, jobject, jlong canvasHandle, jcharArray text,
diff --git a/core/jni/android_text_MeasuredParagraph.cpp b/core/jni/android_text_MeasuredParagraph.cpp
index d33337dabae0..9d794175de18 100644
--- a/core/jni/android_text_MeasuredParagraph.cpp
+++ b/core/jni/android_text_MeasuredParagraph.cpp
@@ -16,6 +16,7 @@
#define LOG_TAG "MeasuredParagraph"
+#include "GraphicsJNI.h"
#include "ScopedIcuLocale.h"
#include "unicode/locid.h"
#include "unicode/brkiter.h"
@@ -109,6 +110,33 @@ static jfloat nGetWidth(jlong ptr, jint start, jint end) {
return r;
}
+// Regular JNI
+static void nGetBounds(JNIEnv* env, jobject, jlong ptr, jcharArray javaText, jlong paintPtr,
+ jint start, jint end, jint bidiFlags, jobject bounds) {
+ ScopedCharArrayRO text(env, javaText);
+ const minikin::U16StringPiece textBuffer(text.get(), text.size());
+
+ minikin::MeasuredText* mt = toMeasuredParagraph(ptr);
+ Paint* paint = toPaint(paintPtr);
+ const Typeface* typeface = Typeface::resolveDefault(paint->getAndroidTypeface());
+ minikin::Layout layout = MinikinUtils::doLayout(paint,
+ static_cast<minikin::Bidi>(bidiFlags), typeface, textBuffer.data(), start, end - start,
+ textBuffer.size(), mt);
+
+ minikin::MinikinRect rect;
+ layout.getBounds(&rect);
+
+ SkRect r;
+ r.fLeft = rect.mLeft;
+ r.fTop = rect.mTop;
+ r.fRight = rect.mRight;
+ r.fBottom = rect.mBottom;
+
+ SkIRect ir;
+ r.roundOut(&ir);
+ GraphicsJNI::irect_to_jrect(ir, env, bounds);
+}
+
// CriticalNative
static jlong nGetReleaseFunc() {
return toJLong(&releaseMeasuredParagraph);
@@ -128,6 +156,7 @@ static const JNINativeMethod gMethods[] = {
// MeasuredParagraph native functions.
{"nGetWidth", "(JII)F", (void*) nGetWidth}, // Critical Natives
+ {"nGetBounds", "(J[CJIIILandroid/graphics/Rect;)V", (void*) nGetBounds}, // Regular JNI
{"nGetReleaseFunc", "()J", (void*) nGetReleaseFunc}, // Critical Natives
{"nGetMemoryUsage", "(J)I", (void*) nGetMemoryUsage}, // Critical Native
};
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index 8770d788fc37..37ea8106ecd6 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -266,6 +266,10 @@ static jboolean android_view_RenderNode_setPivotY(jlong renderNodePtr, float py)
return SET_AND_DIRTY(setPivotY, py, RenderNode::GENERIC);
}
+static jboolean android_view_RenderNode_resetPivot(jlong renderNodePtr) {
+ return SET_AND_DIRTY(resetPivot, /* void */, RenderNode::GENERIC);
+}
+
static jboolean android_view_RenderNode_setCameraDistance(jlong renderNodePtr, float distance) {
return SET_AND_DIRTY(setCameraDistance, distance, RenderNode::GENERIC);
}
@@ -613,6 +617,7 @@ static const JNINativeMethod gMethods[] = {
{ "nSetScaleY", "(JF)Z", (void*) android_view_RenderNode_setScaleY },
{ "nSetPivotX", "(JF)Z", (void*) android_view_RenderNode_setPivotX },
{ "nSetPivotY", "(JF)Z", (void*) android_view_RenderNode_setPivotY },
+ { "nResetPivot", "(J)Z", (void*) android_view_RenderNode_resetPivot },
{ "nSetCameraDistance", "(JF)Z", (void*) android_view_RenderNode_setCameraDistance },
{ "nSetLeft", "(JI)Z", (void*) android_view_RenderNode_setLeft },
{ "nSetTop", "(JI)Z", (void*) android_view_RenderNode_setTop },
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index a30b2ade0e57..04cb08f51efa 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -116,9 +116,13 @@ static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj,
ScopedUtfChars name(env, nameStr);
sp<SurfaceComposerClient> client(android_view_SurfaceSession_getClient(env, sessionObj));
SurfaceControl *parent = reinterpret_cast<SurfaceControl*>(parentObject);
- sp<SurfaceControl> surface = client->createSurface(
- String8(name.c_str()), w, h, format, flags, parent, windowType, ownerUid);
- if (surface == NULL) {
+ sp<SurfaceControl> surface;
+ status_t err = client->createSurfaceChecked(
+ String8(name.c_str()), w, h, format, &surface, flags, parent, windowType, ownerUid);
+ if (err == NAME_NOT_FOUND) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ return 0;
+ } else if (err != NO_ERROR) {
jniThrowException(env, OutOfResourcesException, NULL);
return 0;
}
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 7c8a52d1432b..b5fd7929eeae 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -666,7 +666,9 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra
}
}
- if (!is_system_server) {
+ // If this zygote isn't root, it won't be able to create a process group,
+ // since the directory is owned by root.
+ if (!is_system_server && getuid() == 0) {
int rc = createProcessGroup(uid, getpid());
if (rc != 0) {
if (rc == -EROFS) {
diff --git a/core/proto/android/app/jobparameters.proto b/core/proto/android/app/job/enums.proto
index 4f6a2a247e72..0f14f20e586a 100644
--- a/core/proto/android/app/jobparameters.proto
+++ b/core/proto/android/app/job/enums.proto
@@ -15,19 +15,18 @@
*/
syntax = "proto2";
-option java_multiple_files = true;
-package android.app;
+package android.app.job;
-/**
- * An android.app.JobParameters object.
- */
-message JobParametersProto {
- enum CancelReason {
- REASON_CANCELLED = 0;
- REASON_CONSTRAINTS_NOT_SATISFIED = 1;
- REASON_PREEMPT = 2;
- REASON_TIMEOUT = 3;
- REASON_DEVICE_IDLE = 4;
- }
+option java_outer_classname = "JobProtoEnums";
+option java_multiple_files = true;
+
+// Reasons a job is stopped.
+// Primarily used in android.app.job.JobParameters.java.
+enum StopReasonEnum {
+ STOP_REASON_CANCELLED = 0;
+ STOP_REASON_CONSTRAINTS_NOT_SATISFIED = 1;
+ STOP_REASON_PREEMPT = 2;
+ STOP_REASON_TIMEOUT = 3;
+ STOP_REASON_DEVICE_IDLE = 4;
}
diff --git a/core/proto/android/os/batterystats.proto b/core/proto/android/os/batterystats.proto
index 345c8ef18603..8e98ac9e0e40 100644
--- a/core/proto/android/os/batterystats.proto
+++ b/core/proto/android/os/batterystats.proto
@@ -19,7 +19,7 @@ option java_multiple_files = true;
package android.os;
-import "frameworks/base/core/proto/android/app/jobparameters.proto";
+import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/os/powermanager.proto";
import "frameworks/base/core/proto/android/telephony/enums.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";
@@ -637,7 +637,7 @@ message UidProto {
message ReasonCount {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional android.app.JobParametersProto.CancelReason name = 1;
+ optional android.app.job.StopReasonEnum name = 1;
optional int32 count = 2;
}
repeated ReasonCount reason_count = 2;
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index 4657dc478059..476d5fe45692 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -118,17 +118,17 @@ message IncidentProto {
// Stack dumps
optional android.os.BackTraceProto native_traces = 1200 [
- (section).type = SECTION_TOMBSTONE,
+ (section).type = SECTION_NONE,
(section).args = "native"
];
optional android.os.BackTraceProto hal_traces = 1201 [
- (section).type = SECTION_TOMBSTONE,
+ (section).type = SECTION_NONE,
(section).args = "hal"
];
optional android.os.BackTraceProto java_traces = 1202 [
- (section).type = SECTION_TOMBSTONE,
+ (section).type = SECTION_NONE,
(section).args = "java"
];
@@ -169,7 +169,7 @@ message IncidentProto {
];
optional GZippedFileProto last_kmsg = 2007 [
- (section).type = SECTION_GZIP,
+ (section).type = SECTION_NONE, // disable until selinux permission is gained
(section).args = "/sys/fs/pstore/console-ramoops /sys/fs/pstore/console-ramoops-0 /proc/last_kmsg",
(privacy).dest = DEST_AUTOMATIC
];
@@ -231,22 +231,22 @@ message IncidentProto {
(section).args = "procstats --proto"
];
- optional com.android.server.am.proto.ActivityManagerServiceDumpActivitiesProto activities = 3012 [
+ optional com.android.server.am.ActivityManagerServiceDumpActivitiesProto activities = 3012 [
(section).type = SECTION_DUMPSYS,
(section).args = "activity --proto activities"
];
- optional com.android.server.am.proto.ActivityManagerServiceDumpBroadcastsProto broadcasts = 3013 [
+ optional com.android.server.am.ActivityManagerServiceDumpBroadcastsProto broadcasts = 3013 [
(section).type = SECTION_DUMPSYS,
(section).args = "activity --proto broadcasts"
];
- optional com.android.server.am.proto.ActivityManagerServiceDumpServicesProto amservices = 3014 [
+ optional com.android.server.am.ActivityManagerServiceDumpServicesProto amservices = 3014 [
(section).type = SECTION_DUMPSYS,
(section).args = "activity --proto service"
];
- optional com.android.server.am.proto.ActivityManagerServiceDumpProcessesProto amprocesses = 3015 [
+ optional com.android.server.am.ActivityManagerServiceDumpProcessesProto amprocesses = 3015 [
(section).type = SECTION_DUMPSYS,
(section).args = "activity --proto processes"
];
@@ -256,12 +256,12 @@ message IncidentProto {
(section).args = "alarm --proto"
];
- optional com.android.server.wm.proto.WindowManagerServiceDumpProto window = 3017 [
+ optional com.android.server.wm.WindowManagerServiceDumpProto window = 3017 [
(section).type = SECTION_DUMPSYS,
(section).args = "window --proto"
];
- optional com.android.server.am.proto.MemInfoDumpProto meminfo = 3018 [
+ optional com.android.server.am.MemInfoDumpProto meminfo = 3018 [
(section).type = SECTION_DUMPSYS,
(section).args = "meminfo -a --proto"
];
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index 53e6532419a6..89665dbf6282 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -228,6 +228,7 @@ message GlobalSettingsProto {
optional SettingProto ble_scan_low_power_interval_ms = 161 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto ble_scan_balanced_interval_ms = 162 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto ble_scan_low_latency_interval_ms = 163 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto ble_scan_background_mode = 389 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto wifi_saved_state = 164 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto wifi_supplicant_scan_interval_ms = 165 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto wifi_enhanced_auto_join = 166 [ (android.privacy).dest = DEST_AUTOMATIC ];
@@ -466,8 +467,10 @@ message GlobalSettingsProto {
// skipped.
optional SettingProto override_settings_provider_restore_any_version = 355 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto chained_battery_attribution_enabled = 356 [ (android.privacy).dest = DEST_AUTOMATIC ];
- optional SettingProto autofill_compat_allowed_packages = 357 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto autofill_compat_mode_allowed_packages = 357 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto hidden_api_blacklist_exemptions = 358 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto sound_trigger_detection_service_op_timeout = 387 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto max_sound_trigger_detection_service_ops_per_day = 388 [ (android.privacy).dest = DEST_AUTOMATIC ];
// Subscription to be used for voice call on a multi sim device. The
// supported values are 0 = SUB1, 1 = SUB2 and etc.
optional SettingProto multi_sim_voice_call_subscription = 359 [ (android.privacy).dest = DEST_AUTOMATIC ];
@@ -505,7 +508,7 @@ message GlobalSettingsProto {
optional SettingsProto backup_agent_timeout_parameters = 386;
// Please insert fields in the same order as in
// frameworks/base/core/java/android/provider/Settings.java.
- // Next tag = 387;
+ // Next tag = 390;
}
message SecureSettingsProto {
@@ -742,9 +745,10 @@ message SecureSettingsProto {
optional SettingProto backup_manager_constants = 193;
optional SettingProto backup_local_transport_parameters = 194;
optional SettingProto bluetooth_on_while_driving = 195 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingsProto volume_hush_gesture = 196 [ (android.privacy).dest = DEST_AUTOMATIC ];
// Please insert fields in the same order as in
// frameworks/base/core/java/android/provider/Settings.java.
- // Next tag = 196
+ // Next tag = 197
}
message SystemSettingsProto {
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index fcb980708157..0c617fff6b97 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -16,7 +16,7 @@
syntax = "proto2";
-package com.android.server.am.proto;
+package com.android.server.am;
import "frameworks/base/core/proto/android/app/activitymanager.proto";
import "frameworks/base/core/proto/android/app/enums.proto";
@@ -59,11 +59,11 @@ message ActivityManagerServiceDumpActivitiesProto {
message ActivityStackSupervisorProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
repeated ActivityDisplayProto displays = 2;
optional KeyguardControllerProto keyguard_controller = 3;
optional int32 focused_stack_id = 4;
- optional .com.android.server.wm.proto.IdentifierProto resumed_activity = 5;
+ optional .com.android.server.wm.IdentifierProto resumed_activity = 5;
// Whether or not the home activity is the recents activity. This is needed for the CTS tests to
// know what activity types to check for when invoking splitscreen multi-window.
optional bool is_home_recents_component = 6;
@@ -73,7 +73,7 @@ message ActivityStackSupervisorProto {
message ActivityDisplayProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
optional int32 id = 2;
repeated ActivityStackProto stacks = 3;
}
@@ -81,10 +81,10 @@ message ActivityDisplayProto {
message ActivityStackProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
optional int32 id = 2;
repeated TaskRecordProto tasks = 3;
- optional .com.android.server.wm.proto.IdentifierProto resumed_activity = 4;
+ optional .com.android.server.wm.IdentifierProto resumed_activity = 4;
optional int32 display_id = 5;
optional bool fullscreen = 6;
optional .android.graphics.RectProto bounds = 7;
@@ -93,7 +93,7 @@ message ActivityStackProto {
message TaskRecordProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
optional int32 id = 2;
repeated ActivityRecordProto activities = 3;
optional int32 stack_id = 4;
@@ -111,8 +111,8 @@ message TaskRecordProto {
message ActivityRecordProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1;
- optional .com.android.server.wm.proto.IdentifierProto identifier = 2;
+ optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+ optional .com.android.server.wm.IdentifierProto identifier = 2;
optional string state = 3;
optional bool visible = 4;
optional bool front_of_task = 5;
@@ -689,25 +689,14 @@ message ActivityManagerServiceDumpProcessesProto {
}
optional SleepStatus sleep_status = 27;
- message VoiceProto {
+ message Voice {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional string session = 1;
optional .android.os.PowerManagerProto.WakeLock wakelock = 2;
}
- optional VoiceProto running_voice = 28;
+ optional Voice running_voice = 28;
- message VrControllerProto {
- option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
- enum VrMode {
- FLAG_NON_VR_MODE = 0;
- FLAG_VR_MODE = 1;
- FLAG_PERSISTENT_VR_MODE = 2;
- }
- repeated VrMode vr_mode = 1;
- optional int32 render_thread_id = 2;
- }
optional VrControllerProto vr_controller = 29;
message DebugApp {
@@ -854,6 +843,19 @@ message ImportanceTokenProto {
optional string reason = 3;
}
+// proto of class VrController.java
+message VrControllerProto {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ enum VrMode {
+ FLAG_NON_VR_MODE = 0;
+ FLAG_VR_MODE = 1;
+ FLAG_PERSISTENT_VR_MODE = 2;
+ }
+ repeated VrMode vr_mode = 1;
+ optional int32 render_thread_id = 2;
+}
+
message ProcessOomProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/server/animationadapter.proto b/core/proto/android/server/animationadapter.proto
index c4ffe8c477aa..9bfa79455e0b 100644
--- a/core/proto/android/server/animationadapter.proto
+++ b/core/proto/android/server/animationadapter.proto
@@ -20,7 +20,7 @@ import "frameworks/base/core/proto/android/graphics/point.proto";
import "frameworks/base/core/proto/android/view/remote_animation_target.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";
-package com.android.server.wm.proto;
+package com.android.server.wm;
option java_multiple_files = true;
message AnimationAdapterProto {
diff --git a/core/proto/android/server/appwindowthumbnail.proto b/core/proto/android/server/appwindowthumbnail.proto
index 8f48d75a7f76..54ad193675e9 100644
--- a/core/proto/android/server/appwindowthumbnail.proto
+++ b/core/proto/android/server/appwindowthumbnail.proto
@@ -19,7 +19,7 @@ syntax = "proto2";
import "frameworks/base/core/proto/android/server/surfaceanimator.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";
-package com.android.server.wm.proto;
+package com.android.server.wm;
option java_multiple_files = true;
/**
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 9193129def11..122e5c48214d 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -20,7 +20,7 @@ package com.android.server.job;
option java_multiple_files = true;
-import "frameworks/base/core/proto/android/app/jobparameters.proto";
+import "frameworks/base/core/proto/android/app/job/enums.proto";
import "frameworks/base/core/proto/android/content/clipdata.proto";
import "frameworks/base/core/proto/android/content/component_name.proto";
import "frameworks/base/core/proto/android/content/intent.proto";
@@ -465,7 +465,7 @@ message DataSetProto {
message StopReasonCount {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional .android.app.JobParametersProto.CancelReason reason = 1;
+ optional .android.app.job.StopReasonEnum reason = 1;
optional int32 count = 2;
}
repeated StopReasonCount stop_reasons = 9;
@@ -516,7 +516,7 @@ message JobPackageHistoryProto {
optional int32 job_id = 4;
optional string tag = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
// Only valid for STOP_JOB or STOP_PERIODIC_JOB Events.
- optional .android.app.JobParametersProto.CancelReason stop_reason = 6;
+ optional .android.app.job.StopReasonEnum stop_reason = 6;
}
repeated HistoryEvent history_event = 1;
}
diff --git a/core/proto/android/server/surfaceanimator.proto b/core/proto/android/server/surfaceanimator.proto
index dcc2b3443f2b..84560bc0eef2 100644
--- a/core/proto/android/server/surfaceanimator.proto
+++ b/core/proto/android/server/surfaceanimator.proto
@@ -20,7 +20,7 @@ import "frameworks/base/core/proto/android/server/animationadapter.proto";
import "frameworks/base/core/proto/android/view/surfacecontrol.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";
-package com.android.server.wm.proto;
+package com.android.server.wm;
option java_multiple_files = true;
/**
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index 9598f24b6ff1..063135d1de8b 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -28,7 +28,7 @@ import "frameworks/base/core/proto/android/view/surface.proto";
import "frameworks/base/core/proto/android/view/windowlayoutparams.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";
-package com.android.server.wm.proto;
+package com.android.server.wm;
option java_multiple_files = true;
diff --git a/core/proto/android/server/windowmanagertrace.proto b/core/proto/android/server/windowmanagertrace.proto
index 96a90bfe63da..f502961d2c45 100644
--- a/core/proto/android/server/windowmanagertrace.proto
+++ b/core/proto/android/server/windowmanagertrace.proto
@@ -18,7 +18,7 @@ syntax = "proto2";
import "frameworks/base/core/proto/android/server/windowmanagerservice.proto";
-package com.android.server.wm.proto;
+package com.android.server.wm;
option java_multiple_files = true;
diff --git a/core/proto/android/service/package.proto b/core/proto/android/service/package.proto
index f8050a15e78e..88bb4a6f4295 100644
--- a/core/proto/android/service/package.proto
+++ b/core/proto/android/service/package.proto
@@ -110,6 +110,7 @@ message PackageProto {
optional bool is_launched = 6;
optional EnabledState enabled_state = 7;
optional string last_disabled_app_caller = 8;
+ optional string suspending_package = 9;
}
// Name of package. e.g. "com.android.providers.telephony".
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 9b11a33593bd..c4d3667badde 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -180,6 +180,8 @@
<protected-broadcast
android:name="android.bluetooth.hearingaid.profile.action.PLAYING_STATE_CHANGED" />
<protected-broadcast
+ android:name="android.bluetooth.hearingaid.profile.action.ACTIVE_DEVICE_CHANGED" />
+ <protected-broadcast
android:name="android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
android:name="android.bluetooth.a2dp.profile.action.ACTIVE_DEVICE_CHANGED" />
@@ -1341,6 +1343,13 @@
android:label="@string/permlab_changeWifiState"
android:protectionLevel="normal" />
+ <!-- @SystemApi @hide Allows apps to create and manage IPsec tunnels.
+ <p>Only granted to applications that are currently bound by the
+ system for creating and managing IPsec-based interfaces.
+ -->
+ <permission android:name="android.permission.MANAGE_IPSEC_TUNNELS"
+ android:protectionLevel="signature|appop" />
+
<!-- @SystemApi @hide Allows applications to read Wi-Fi credential.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.READ_WIFI_CREDENTIAL"
@@ -1441,6 +1450,13 @@
android:label="@string/permlab_bluetooth"
android:protectionLevel="normal" />
+ <!-- @SystemApi Allows an application to suspend other apps, which will prevent the user
+ from using them until they are unsuspended.
+ @hide
+ -->
+ <permission android:name="android.permission.SUSPEND_APPS"
+ android:protectionLevel="signature|privileged" />
+
<!-- Allows applications to discover and pair bluetooth devices.
<p>Protection level: normal
-->
@@ -3274,6 +3290,11 @@
android:protectionLevel="signature|privileged|development|appop" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
+ <!-- @hide @SystemApi Allows an application to observe usage time of apps. The app can register
+ for callbacks when apps reach a certain usage time limit, etc. -->
+ <permission android:name="android.permission.OBSERVE_APP_USAGE"
+ android:protectionLevel="signature|privileged" />
+
<!-- @hide @SystemApi Allows an application to change the app idle state of an app.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CHANGE_APP_IDLE_STATE"
@@ -3310,8 +3331,9 @@
<permission android:name="android.permission.BACKUP"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows application to manage RecoverableKeyStoreLoader.
- <p>Not for use by third-party applications.
+ <!-- @SystemApi Allows application to manage
+ {@link android.security.keystore.recovery.RecoveryController}.
+ <p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.RECOVER_KEYSTORE"
android:protectionLevel="signature|privileged" />
@@ -3754,10 +3776,17 @@
<!-- Must be required by system/priv apps when accessing the sound trigger
APIs given by {@link SoundTriggerManager}.
- @hide <p>Not for use by third-party applications.</p> -->
+ @hide
+ @SystemApi -->
<permission android:name="android.permission.MANAGE_SOUND_TRIGGER"
android:protectionLevel="signature|privileged" />
+ <!-- Must be required by system/priv apps implementing sound trigger detection services
+ @hide
+ @SystemApi -->
+ <permission android:name="android.permission.BIND_SOUND_TRIGGER_DETECTION_SERVICE"
+ android:protectionLevel="signature" />
+
<!-- @SystemApi Allows trusted applications to dispatch managed provisioning message to Managed
Provisioning app. If requesting app does not have permission, it will be ignored.
@hide -->
@@ -3879,6 +3908,12 @@
<permission android:name="android.permission.WATCH_APPOPS"
android:protectionLevel="signature" />
+ <!-- Allows an application to directly open the "Open by default" page inside a package's
+ Details screen.
+ @hide <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.OPEN_APPLICATION_DETAILS_OPEN_BY_DEFAULT_PAGE"
+ android:protectionLevel="signature" />
+
<application android:process="system"
android:persistent="true"
android:hasCode="false"
diff --git a/core/res/res/layout/autofill_save.xml b/core/res/res/layout/autofill_save.xml
index 5c5b985b26a2..d90352426311 100644
--- a/core/res/res/layout/autofill_save.xml
+++ b/core/res/res/layout/autofill_save.xml
@@ -35,8 +35,8 @@
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp"
android:orientation="vertical">
<LinearLayout
@@ -52,7 +52,7 @@
<TextView
android:id="@+id/autofill_save_title"
- android:paddingLeft="8dp"
+ android:paddingStart="8dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/autofill_save_title"
@@ -100,7 +100,7 @@
android:id="@+id/autofill_save_yes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- style="@style/Widget.Material.Button.Colored"
+ style="@style/Widget.DeviceDefault.Button.Colored"
android:text="@string/autofill_save_yes">
</Button>
diff --git a/core/res/res/layout/shutdown_dialog.xml b/core/res/res/layout/shutdown_dialog.xml
index 398bfb1824c7..2d214b32164b 100644
--- a/core/res/res/layout/shutdown_dialog.xml
+++ b/core/res/res/layout/shutdown_dialog.xml
@@ -29,7 +29,7 @@
<TextView
android:id="@id/text1"
android:layout_width="wrap_content"
- android:layout_height="32dp"
+ android:layout_height="32sp"
android:text="@string/shutdown_progress"
android:textDirection="locale"
android:textSize="24sp"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 86b9c5127a31..faecfb7ef9d5 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Beller-ID se verstek is nie beperk nie. Volgende oproep: nie beperk nie"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Diens nie verskaf nie."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Jy kan nie die beller-ID-instelling verander nie."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Geen datadiens nie"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Geen noodoproepe nie"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Geen mobiele datadiens nie"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Noodoproepe is onbeskikbaar"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Geen stemdiens nie"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Geen stem- of nooddiens nie"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Word tydelik nie deur die selnetwerk by jou ligging aangebied nie"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk nie bereik nie"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Om opvangs te verbeter, probeer die tipe verander wat by Instellings &gt; Netwerk en internet &gt; Mobiele netwerke &gt; Voorkeurnetwerktipe gekies is."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi-oproepe is aktief"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Noodoproepe vereis \'n mobiele netwerk."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Geen stemdiens of noodoproepe nie"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Tydelik deur jou diensverskaffer afgeskakel"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Kan nie selnetwerk bereik nie"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Probeer die voorkeurnetwerk verander. Tik om te verander."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Noodoproepe is onbeskikbaar"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Kan nie noodoproepe oor Wi-Fi maak nie"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Opletberigte"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproepaanstuur"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Noodterugbel-modus"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Swerfbanier aan"</string>
<string name="roamingText12" msgid="1189071119992726320">"Swerfbanier af"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Soek vir diens"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-oproepe"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Om oproepe te maak en boodskappe oor Wi-Fi te stuur, vra eers jou diensverskaffer om hierdie diens op te stel. Skakel Wi-Fi-oproepe dan weer in Instellings aan. (Foutkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registreer by jou diensverskaffer (foutkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi-oproep"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Te veel versoeke word verwerk. Probeer weer later."</string>
<string name="notification_title" msgid="8967710025036163822">"Aanmeldfout vir <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinkroniseer"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkroniseer"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Te veel <xliff:g id="CONTENT_TYPE">%s</xliff:g> uitgevee."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Kan nie sinkroniseer nie"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Het te veel <xliff:g id="CONTENT_TYPE">%s</xliff:g> probeer uitvee."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet se berging is vol. Vee \'n aantal lêers uit om spasie vry te maak."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Horlosieberging is vol! Vee \'n paar lêers uit om plek te maak."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV-berging is vol. Vee \'n paar lêers uit om spasie beskikbaar te stel."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Deur jou werkprofieladministrateur"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Deur <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Werkprofiel is uitgevee"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Werkprofiel is weens ontbrekende administrasieprogram uitgevee"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Die werkprofiel se administrasieprogram ontbreek of is korrup. Gevolglik is jou werkprofiel en verwante data uitgevee. Kontak jou administrateur vir bystand."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Jou werkprofiel is nie meer op hierdie toestel beskikbaar nie"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Te veel wagwoordpogings"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Toestel word bestuur"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Jou organisasie bestuur hierdie toestel en kan netwerkverkeer monitor. Tik vir besonderhede."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Jou toestel sal uitgevee word"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Die administrasieprogram kan nie gebruik word nie. Jou toestel sal nou uitgevee word.\n\nKontak jou organisasie se administrateur as jy vrae het."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Die administrasieprogram kan nie gebruik word nie. Jou toestel sal nou uitgevee word.\n\nKontak jou organisasie se administrateur as jy vrae het."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Druk is gedeaktiveer deur <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Ek"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tablet-opsies"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Vliegtuigmodus"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Vliegtuigmodus is AAN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Vliegtuigmodus is AF"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterybespaarder"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterybespaarder is AF"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterybespaarder is AAN"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Instellings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Help"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Stembystand"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Skakel oor na werkprofiel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"in te gaan by jou kontakte"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou kontakte"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou kontakte?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Ligging"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"toegang te verkry tot hierdie toestel se ligging"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot hierdie toestel se ligging"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot hierdie toestel se ligging?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"by jou kalender in te gaan"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou kalender"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou kalender?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS-boodskappe te stuur en te bekyk"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om SMS\'e te stuur en te bekyk"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om SMS\'e te stuur en te bekyk?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Stoor"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"toegang te verkry tot foto\'s, media en lêers op jou toestel"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou foto\'s, media en lêers op jou toestel"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou foto\'s, media en lêers op jou toestel?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofoon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"oudio op te neem"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om oudio op te neem"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om oudio op te neem?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"foto\'s en video te neem"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om foto\'s te neem en video\'s op te neem"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om foto\'s te neem en video\'s op te neem?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Foon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"foonoproepe te maak en te bestuur"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om foonoproepe te maak en te bestuur"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om foonoproepe te maak en te bestuur?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Liggaamsensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"toegang te verkry tot sensordata oor jou lewenstekens"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot sensordata oor jou lewenstekens"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot sensordata oor jou lewenstekens?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Venster-inhoud ophaal"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ondersoek die inhoud van \'n venster waarmee jy interaksie het."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Verken deur raak aanskakel"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Voer gebare uit"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Kan tik, swiep, knyp en ander gebare uitvoer."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Vingerafdrukgebare"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Kan gebare wat op die toestel se vingerafdruksensor uitgevoer word, vasvang"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Kan gebare vasvang wat op die toestel se vingerafdruksensor uitgevoer word."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"deaktiveer of verander statusbalk"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Laat die program toe om die statusbalk te deaktiveer en stelselikone by te voeg of te verwyder."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"wees die statusbalk"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Laat die program toe om dele van ditself deurdringend in die geheue te hou. Dit kan geheue wat aan ander programme beskikbaar is, beperk, en die tablet stadiger maak."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Laat die program toe om dele van homself blywend in die berging te maak. Dit kan die berging wat beskikbaar is vir ander programme beperk, wat die TV stadiger sal maak."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Laat die program toe om dele van ditself deurdringend in die geheue te hou. Dit kan geheue wat aan ander programme beskikbaar is, beperk, en die foon stadiger maak."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"laat loop voorgronddiens"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Laat die program toe om van voorgronddienste gebruik te maak."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"meet programberging-ruimte"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Laat die program toe om sy kode, data en kasgroottes op te haal"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"verander stelsel-instellings"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Patroon ontsluit."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Gesigslot."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN ontsluit."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM-PIN-ontsluiting."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM-PUK-ontsluiting."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Wagwoord ontsluit."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Patroonarea."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sleep-area."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Teks na knipbord gekopieër."</string>
<string name="more_item_label" msgid="4650918923083320495">"Meer"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Kieslys+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Simbool+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funksie+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"spasie"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"vee uit"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Kyk vir opdatering"</string>
<string name="smv_application" msgid="3307209192155442829">"Die program <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) het sy selfopgelegde StrictMode-beleid oortree."</string>
<string name="smv_process" msgid="5120397012047462446">"Die proses <xliff:g id="PROCESS">%1$s</xliff:g> het die selfopgelegde StrictMode-beleid geskend."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android gradeer tans op..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android begin tans …"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Foon dateer tans op …"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet dateer tans oop …"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Toestel dateer tans op …"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Foon begin tans …"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet begin tans …"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Toestel begin tans …"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimeer tans berging."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Voltooi tans Android-opdatering …"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Sommige programme sal dalk nie behoorlik werk voordat die opgradering voltooi is nie"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Voltooi tans stelselopdatering …"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> gradeer tans op …"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimeer program <xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Berei tans <xliff:g id="APPNAME">%1$s</xliff:g> voor."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Begin programme."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Voltooi herlaai."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> loop"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tik om na die speletjie terug te keer"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Kies speletjie"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Ter wille van beter werkverrigting kan net een van hierdie speletjies op \'n slag oop wees."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Gaan terug na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Maak <xliff:g id="NEW_APP">%1$s</xliff:g> oop"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> sal toemaak sonder om te stoor"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> het berginglimiet oorskry"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Hoopstorting is ingesamel; tik om te deel"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Hoopstorting is ingesamel. Tik om te deel."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Deel hoopstorting?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Die proses <xliff:g id="PROC">%1$s</xliff:g> het sy prosesberginglimiet van <xliff:g id="SIZE">%2$s</xliff:g> oorskry. \'n Hoopstorting is beskikbaar wat jy met sy ontwikkelaar kan deel. Pas op: Hierdie hoopstorting kan enige van jou persoonlike inligting bevat waartoe die program toegang het."</string>
<string name="sendText" msgid="5209874571959469142">"Kies \'n handeling vir teks"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Koppel aan oop Wi-Fi-netwerk"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Koppel aan diensverskaffer se Wi‑Fi-netwerk"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Koppel tans aan oop Wi‑Fi-netwerk"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Aan Wi-Fi-netwerk gekoppel"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kon nie aan Wi-Fi-netwerk koppel nie"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerke te sien"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Koppel"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alle netwerke"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netwerke"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi sal outomaties aanskakel"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Wanneer jy naby \'n gestoorde hoëgehaltenetwerk is"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Moenie weer aanskakel nie"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Herbegin"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktiveer mobiele diens"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Laai die diensverskafferprogram af om jou nuwe SIM te aktiveer"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Laai die <xliff:g id="APP_NAME">%1$s</xliff:g>-program af om jou nuwe SIM te aktiveer"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Laai program af"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nuwe SIM is ingesit"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tik om dit op te stel"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB is aangeskakel"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB-verbinding is aangeskakel"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB is aangeskakel"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-bykomstigheidmodus is aangeskakel"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-bykomstigheid is gekoppel"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tik vir meer opsies."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Laai tans gekoppelde toestel. Tik vir meer opsies."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoë oudiobykomstigheid bespeur"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Die aangehegde toestel is nie met hierdie foon versoenbaar nie. Tik om meer te wete te kom."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-ontfouter gekoppel"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tik om USB-ontfouting te deaktiveer."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Tik om USB-ontfouting af te skakel"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Kies om USB-ontfouting te deaktiveer."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Neem tans foutverslag …"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Deel foutverslag?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> word bo-oor ander programme gewys"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wys bo-oor ander programme"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"As jy nie wil hê dat <xliff:g id="NAME">%s</xliff:g> hierdie kenmerk gebruik nie, tik om instellings oop te maak en skakel dit af."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SKAKEL AF"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Skakel af"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Berei tans <xliff:g id="NAME">%s</xliff:g> voor"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kyk tans vir foute"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nuwe <xliff:g id="NAME">%s</xliff:g> bespeur"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Altydaan-VPN koppel tans..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Altydaan-VPN gekoppel"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Ontkoppel van altyd-aan-VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Altydaan-VPN-fout"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Kon nie aan altyd-aan-VPN koppel nie"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Verander netwerk- of VPN-instellings"</string>
<string name="upload_file" msgid="2897957172366730416">"Kies lêer"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Geen lêer gekies nie"</string>
<string name="reset" msgid="2448168080964209908">"Stel terug"</string>
<string name="submit" msgid="1602335572089911941">"Dien in"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Motormodus geaktiveer"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tik om motormodus te verlaat."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Bestuurprogram werk tans"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tik om die bestuurprogram te verlaat."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Verbinding of Wi-Fi-warmkol aktief"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tik om op te stel."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Verbinding is gedeaktiveer"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g>-USB-datastokkie"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-berging"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Redigeer"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Datagebruik-opletberig"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Tik om gebruik en instellings te bekyk."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G-datalimiet bereik"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G-datalimiet bereik"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Datawaarskuwing"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Jy het <xliff:g id="APP">%s</xliff:g> se data gebruik"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobiele data se limiet is bereik"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi-datalimiet bereik"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data vir res van siklus laat wag"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G-datalimiet oorskry"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G-datalimiet oorskry"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobiele datalimiet oorskry"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi se datalimiet oorskry"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> oor gespesifiseerde limiet."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data is vir die res van jou siklus onderbreek"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Oor jou mobieledatalimiet"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Oor jou Wi-Fi-datalimiet"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Jy is <xliff:g id="SIZE">%s</xliff:g> oor jou gestelde limiet"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Agtergronddata is beperk"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Tik om beperking te verwyder."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Groot datagebruik"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Jou datagebruik was die laaste paar dae groter as normaalweg. Tik om die gebruik en instellings te bekyk."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Groot mobieledatagebruik"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Jou programme het meer data as gewoonlik gebruik"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> het meer data as gewoonlik gebruik"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Sekuriteitsertifikaat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Die sertifikaat is geldig."</string>
<string name="issued_to" msgid="454239480274921032">"Uitgereik aan:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Geïnstalleer deur jou administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Opgedateer deur jou administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Uitgevee deur jou administrateur"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Om batterylewe te help verbeter, verminder Batterybespaarder jou toestel se werkverrigting en beperk vibrasie, liggingdienste en die meeste agtergronddata. E-pos, boodskappe en ander programme wat op sinkronisering staatmaak, sal dalk nie opdateer tensy jy hulle oopmaak nie.\n\nBatterybespaarder skakel outomaties af wanneer jou toestel besig is om te laai."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Databespaarder verhoed sommige programme om data in die agtergrond te stuur of te aanvaar om datagebruik te help verminder. \'n Program wat jy tans gebruik kan by data ingaan, maar sal dit dalk minder gereeld doen. Dit kan byvoorbeeld beteken dat prente nie wys totdat jy op hulle tik nie."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Skakel Databespaarder aan?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Skakel aan"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d min. lank (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">1 min. lank (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d uur lank (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Een uur lank (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">1 uur lank (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d uur lank (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">%d min. lank</item>
<item quantity="one">1 min. lank</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d uur lank</item>
- <item quantity="one">Een uur lank</item>
+ <item quantity="one">1 uur lank</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d uur lank</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"Gedemp deur <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Daar is \'n interne probleem met jou toestel en dit sal dalk onstabiel wees totdat jy \'n fabriekterugstelling doen."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Daar is \'n interne probleem met jou toestel. Kontak jou vervaardiger vir besonderhede."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-versoek is gewysig tot DIAL-versoek."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-versoek is gewysig tot SS-versoek."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-versoek is gewysig tot nuwe USSD-versoek."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-versoek is gewysig tot Video DIAL-versoek."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-versoek is gewysig tot DIAL-versoek."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-versoek is gewysig tot Video DIAL-versoek."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-versoek is gewysig tot USSD-versoek."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-versoek is gewysig tot nuwe SS-versoek."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Werkprofiel"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Vou uit"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Vou in"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Skadelike program is bespeur"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wil <xliff:g id="APP_2">%2$s</xliff:g>-skyfies wys"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Wysig"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Oproepe en kennisgewings sal vibreer"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Oproepe en kennisgewings sal gedemp wees"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Stelselveranderinge"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Moenie Steur Nie"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Moenie Steur Nie versteek tans kennisgewings om jou te help om te fokus"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dit is nuwe gedrag. Tik om te verander."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Moenie Steur Nie het verander"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tik om jou optrede-instellings vir onderbrekings na te gaan"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tik om te kyk wat geblokkeer word."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Stelsel"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Instellings"</string>
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index f0253a22f9f0..34b4b3d07de7 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Zəng edənin kimliyi defolt olaraq qadağan deyil. Növbəti zəng: Qadağan deyil"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Xidmət təmin edilməyib."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Çağrı kimliyi ayarını dəyişə bilməzsiniz."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Data xidməti yoxdur"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Təcili zəng yoxdur"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Mobil data xidməti yoxdur"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Təcili zəng əlçatan deyil"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Səsli xidmət yoxdur"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Səsli/təcili xidmət yoxdur"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Müvəqqəti olaraq məkanda mobil şəbəkə tərəfindən təklif edilmir"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Şəbəkəyə daxil olmaq mümkün deyil"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Qəbulu inkişaf etdirmək üçün seçilmiş növü Ayarlar &gt; Şəbəkə və internet &gt; Mobil şəbəkə &gt; Tərcih edilən şəbəkə növü bölməsində dəyişə bilərsiniz."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi zəngi aktivdir"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Təcili zənglər üçün mobil şəbəkə tələb olunur."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Səs xidməti və ya təcili zəng yoxdur"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Operator tərəfindən müvəqqəti olaraq deaktiv edildi"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobil şəbəkəyə daxil olmaq mümkün deyil"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tərcih edilən şəbəkəni dəyişin. Dəyişmək üçün klikləyin."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Təcili zəng əlçatan deyil"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi‑Fi vasitəsilə təcili zənglər etmək mümkün deyil"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Siqnallar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Zəng yönləndirmə"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Təcili geriyə zəng rejimi"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Rominq Banneri Açıqdır"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Xidmət axtarılır"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi zəngi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Zəng etmək və Wi-Fi üzərindən mesaj göndərmək üçün əvvəlcə operatordan bu cihazı quraşdırmağı tələb edin. Sonra Ayarlardan Wi-Fi zəngini deaktiv edin. (Xəta kodu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Operator ilə qeydiyyatdan keçin (Xəta kodu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Zəngi"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Həddindən çox sorğu işlənilir. Daha sonra yoxlayın."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> üçün giriş xətası"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinxronlaşdırma"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinxronlaşdırma"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Həddindən çox <xliff:g id="CONTENT_TYPE">%s</xliff:g> silinmələri var."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Sinxronizasiya etmək olmur"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Həddindən artıq <xliff:g id="CONTENT_TYPE">%s</xliff:g> kontent növünün silinməsinə cəhd olundu."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Planşetin yaddaşı doludur. Boş yer üçün bəzi faylları silin."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Yaddaş dolub. Boşaltmaq üçün bəzi faylları silin."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV-nin yaddaşı doludur. Yer boşaltmaq üçün bəzi faylları silin."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"İş profilinin admini tərəfindən"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tərəfindən"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"İş profili silindi"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Admin tətbiqi olmadığından iş profili silindi"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"İş profili admin tətbiqi ya yoxdur, ya da korlanıb. Nəticədə iş profili və onunla bağlı data silinib. Kömək üçün admin ilə əlaqə saxlayın."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"İş profili artıq bu cihazda əlçatan deyil"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Həddindən çox parol cəhdi"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Cihaz idarə olunur"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Təşkilat bu cihazı idarə edir və şəbəkənin ötürülməsinə nəzarət edə bilər. Detallar üçün klikləyin."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Cihazınız təmizlənəcəkdir"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Bu admin tətbiqini istifadə etmək mümkün deyil. Cihaz indi təmizlənəcək.\n\nSualınız varsa, təşkilatın admini ilə əlaqə saxlayın."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Admin tətbiqini istifadə etmək mümkün deyil. Cihaz indi təmizlənəcək.\n\nSualınız varsa, təşkilatın admini ilə əlaqə saxlayın."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Çap <xliff:g id="OWNER_APP">%s</xliff:g> tərəfindən deaktiv edildi."</string>
<string name="me" msgid="6545696007631404292">"Mən"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Planşet seçimləri"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Təyyarə rejimi"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uçuş rejimi açıqdır"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Təyyarə rejimi qapalıdır"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batareya qənaəti"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batareya qənaəti DEAKTİVDİR"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batareya qənaəti AKTİVDİR"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Yardım"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Səs Yardımçısı"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"İş profilinə keçin"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktlar"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"kontaktlarınıza daxil olun"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə kontaktlara daxil olmaq icazəsi verin"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə kontaktlara daxil olmaq icazəsi verilsin?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Yer"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"cihazın yerini bilmək"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə bu cihazın məkanına daxil olmaq icazəsi verin"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə bu cihazın məkanına daxil olmaq icazəsi verilsin?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Təqvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"təqvimə daxil olun"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə təqvimə daxil olmaq icazəsi verin"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə təqvimə daxil olmaq icazəsi verilsin?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"göndərin və SMS mesajlarına baxın"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə SMS mesajları göndərmək və onlara baxmaq icazəsi verin"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə SMS mesajları göndərmək və onlara baxmaq icazəsi verilsin?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Depo"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"cihazınızda foto, media və fayllara daxil olun"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə cihazdakı foto, media və fayllara daxil olmaq icazəsi verin"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə cihazdakı foto, media və fayllara daxil olmaq icazəsi verilsin?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"səsi qeydə alın"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə səs yazmaq icazəsi verin"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə səs yazmaq icazəsi verilsin?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"şəkil çəkin və video yazın"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə şəkil və video çəkmək icazəsi verin"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə şəkil və video çəkmək icazəsi verilsin?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon zəngləri edin və onları idarə edin"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə telefon zəngləri etmək və onları idarə etmək icazəsi verin"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə telefon zəngləri etmək və onları idarə etmək icazəsi verilsin?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Bədən Sensorları"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"Həyati əlamətlər haqqında sensor dataya daxil olun"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə həyati əlamətlər haqqında sensor dataya daxi olmaq icazəsi verin"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə həyati əlamətlər haqqında sensor dataya daxil olmaq icazəsi verilsin?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pəncərənin məzmununu əldə edin"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Əlaqədə olduğunuz pəncərənin məzmununu nəzərdən keçirin."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Toxunaraq Kəşf et funksiyasını yandırın"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Jestlər ilə əməliyyat aparın"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Digər jestlərə tıklaya, sürüşdürə və əməliyyat apara bilərsiniz."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Barmaq izi işarələri"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Cihazların barmaq izi sensorunda olan işarələri əldə edə bilər"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Cihazların barmaq izi sensorunda olan işarələri əldə edə bilər."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"status panelini deaktivləşdir və ya dəyişdir"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Tətbiqə status panelini deaktiv etməyə və ya sistem ikonalarını əlavə etmək və ya silmək imkanı verir."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"status paneli edin"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tətbiqə öz komponentlərini yaddaşda saxlama icazəsi verir. Bu planşetin sürətini zəiflətməklə, digər tətbiqlər üçün mövcud olan yaddaşı limitləyə bilər."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Proqrama öz hissələrini yaddaşda davamlı etmək imkanı verir. Bu TV-ni zəiflədərək başqa proqramlar üçün mövcud olan yaddaşı məhdudlaşdıra bilər."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Tətbiqə öz komponentlərini yaddaşda saxlama icazəsi verir. Bu digər tətbiqlər üçün mövcud olan yaddaşı limitləyə bilər."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ön fon xidmətindən istifadə edin"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Tətbiqə ön fon xidmətlərini işlətmək icazəsi verin."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"tətbiq saxlama yaddaşını ölçmək"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Tətbiqə özünün kodunu, məlumatını və keş ölçüsünü alma icazəsi verir."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"sistem ayarlarında dəyişiklik etmək"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kild açma modeli."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sifət Kilidi"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin kilid açması."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Sim Pin kilidini açın."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Sim Puk kilidini açın."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Şifrə kilidi."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Model sahəsi."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sürüşdürmə sahəsi."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Mətn panoya kopyalandı."</string>
<string name="more_item_label" msgid="4650918923083320495">"Digər"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menyu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funksiya+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"boşluq"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"daxil olun"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"sil"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Güncəlləməni yoxlayın"</string>
<string name="smv_application" msgid="3307209192155442829">"Tətbiq <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) StrictMode siyasətini pozdu."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> prosesi StrictMode siyasətini pozdu."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android təkmilləşdirilir..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android işə başlayır..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefon yenilənir…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Planşet yenilənir…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Cihaz yenilənir…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon başlayır…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Planşet başlayır…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Cihaz başlayır…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Yaddaş optimallaşdırılır."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android güncəlləməsi tamamlanır..."</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Güncəllənmə tamamlanana kimi bəzi tətbiqlər düzgün işləməyə bilər"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Sistem güncəlləmələri tamamlanır…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> təkmilləşdirilir…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> əddədən <xliff:g id="NUMBER_0">%1$d</xliff:g> tətbiq optimallaşır."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> proqramının hazırlanması."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Tətbiqlər başladılır."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Yükləmə başa çatır."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışır"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Oyuna qayıtmaq üçün klikləyin"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Oyun seçin"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Daha yaxşı fəaliyyət üçün bu oyunlardan yalnız biri eyni anda açıla bilər."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> tətbiqinə geri qayıdın"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> tətbiqini açın"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> yadda saxlamadan bağlanacaq"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> yaddaş limitini keçdi"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Yığın toplanıb; paylaşmaq üçün tıklayın"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Şəkil çəkildi. Paylaşmaq üçün klikləyin."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Yığın paylaşılsın?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> prosesi <xliff:g id="SIZE">%2$s</xliff:g> ölçüsünün yaddaş limitini prosesini keçib. Yığın tərtibatçısı ilə paylaşmaq üçün sizə istifadəsi mümkündür. Ehtiyatlı olun: bu yığında proqramın giriş icazəsi olduğu şəxsi məlumatlarınız ola bilər."</string>
<string name="sendText" msgid="5209874571959469142">"Mətn üçün əməliyyat seçin"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Açıq Wi‑Fi şəbəkəsinə qoşulun"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Operatorun Wi‑Fi şəbəkəsinə qoşulun"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Açıq Wi‑Fi şəbəkəsinə qoşulur"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi şəbəkəsinə qoşuldu"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi şəbəkəsinə qoşulmaq mümkün deyil"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Bütün şəbəkələri görmək üçün klikləyin"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Qoşulun"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Bütün Şəbəkələr"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Bütün şəbəkələr"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi avtomatik olaraq aktiv ediləcək"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Yadda saxlanmış yüksək keyfiyyətli şəbəkələr yaxınlıqda olduqda"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Yenidən aktiv etməyin"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Yenidən başlat"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobil xidməti aktiv edin"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Yeni SIM-i aktiv etmək üçün operator tətbiqini endirin"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Yeni SIM-i aktiv etmək üçün <xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqini endirin"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Tətbiqi endirin"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Yeni SIM kart taxılıb"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Quraşdırmaq üçün tıklayın"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB vasitəsilə PTP aktiv edildi"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB birləşmə aktiv edildi"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB vasitəsilə MIDI aktiv edildi"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB aksesuar rejimi aktiv edildi"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB aksesuarı qoşulub"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Əlavə seçimlər üçün tıklayın."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Qoşulmuş cihaza enerji doldurulur. Əlavə seçimlər üçün klikləyin."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoq audio aksesuar aşkarlandı"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Əlavə edilən cihaz bu telefonla uyğun deyil. Ətraflı məlumat üçün klikləyin."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB sazlama qoşuludur"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB debaqı deaktivasiya etmək üçün tıklayın."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB sazlamanı deaktiv etmək üçün klikləyin"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USb debaqı deaktivasiya etməyi seçin."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Baq hesabatı verilir..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Baq hesabatı paylaşılsın?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> digər tətbiqlər üzərindən göstərilir"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> tətbiq üzərindən göstərilir"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> adlı şəxsin bu funksiyadan istifadə etməyini istəmirsinizsə, ayarları açmaq və deaktiv etmək üçün klikləyin."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEAKTİV EDİN"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Deaktiv edin"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> hazırlanır"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Səhvlər yoxlanılır"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yeni <xliff:g id="NAME">%s</xliff:g> aşkarlandı"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Həmişə aktiv VPN bağlanır..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN bağlantısı həmişə aktiv"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Həmişə aktiv VPN bağlantısı kəsildi"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Həmişə aktiv VPN xətası"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Həmişə aktiv VPN-ə qoşulmaq mümkün olmadı"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Şəbəkə və ya VPN ayarlarını dəyişin"</string>
<string name="upload_file" msgid="2897957172366730416">"Fayl seçin"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Heç bir fayl seçilməyib"</string>
<string name="reset" msgid="2448168080964209908">"Sıfırlayın"</string>
<string name="submit" msgid="1602335572089911941">"Göndər"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Avtomobil rejimi aktivdir"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Avtomobil rejimindən çıxmaq üçün tıklayın."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Sürücülük tətbiqi işləyir"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Sürücülük tətbiqindən çıxmaq üçün klikləyin."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tezerinq və ya hotspot aktivdir"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Quraşdırmaq üçün tıklayın."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Birləşmə deaktivdir"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drayv"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB yaddaş"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Düzəliş edin"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Data istifadə siqnalı"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"İstifadə və ayarları görmək üçün tıklayın."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G data limitinə çatdı"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G data limitinə çatdı"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Data xəbərdarlığı"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> data istifadə etdiniz"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobil data limitinə çatdı"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi data limitinə çatdı"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Dövrün digər hissəsi üçün data durduruldu"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G data limiti aşılıb"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G data limiti keçildi"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobil data limiti keçildi"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi data limiti keçildi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> müəyyən edilmiş limit aşır."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Prosesin qalan hissəsi üçün data dayandırıldı"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Mobil data limiti keçilib"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi data limiti keçilib"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Set limitini <xliff:g id="SIZE">%s</xliff:g> keçmisiniz"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Arxaplan datası məhdudlaşdırıldı"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Məhdudiyyəti aradan qaldırmaq üçün tıklayın."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Geniş data istifadəsi"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Son bir neçə gün ərzində olan data istifadəniz normadan çoxdur. İstifadəyə və ayarlara baxmaq üçün klikləyin."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Yüksək mobil data istifadəsi"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Tətbiqlər adi halda olduğundan çox data istifadə ediblər"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> adi halda olduğundan çox data istifadə edib"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Təhlükəsizlik sertifikatı"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Bu sertifikat etibarlıdır."</string>
<string name="issued_to" msgid="454239480274921032">"Verilib:"</string>
@@ -1669,7 +1676,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Admin tərəfindən quraşdırıldı"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Admin tərəfindən yeniləndi"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Admin tərəfindən silindi"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Batareyanın istifadə müddətini təkmilləşdirmək üçün Batareya Qənaəti cihazın performansını azaldıraq titrətmə, məkan xidmətləri və arxa fon məlumatlarını məhdudlaşdırır. Sinxronizasiyaya etibar edən e-poçt, mesajlaşma və digər tətbiqlər Siz onları açmayana kimi güncəllənməyə bilər.\n\nCihaz doldurulan zaman Batareya Qənaəti avtomatik olaraq sönür."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Batareya istifdəsini təkmillədirmək üçün, Batareya Qənaəti cihazın performansını azaldır və vibrasiyanı, məkan xidmətləri və arxa fon datasını deaktiv edir. Sinxronizasiyadan istifadə edən e-poçt, mesajlaşma və digər proqramlar siz onları açmayana qədər yenilənməyə bilər.\n\nCihazınız doldurularkən batareya qənaəti avtomatik olaraq deaktiv edilir."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Data istifadəsini azalatmaq üçün, Data Qanaəti bəzi tətbiqlərin arxafonda data göndərməsini və qəbulunun qarşısını alır. Hazırda istifadə etdiyiniz tətbiq dataya daxil ola bilər, lakin çox az hissəsini tez-tez edə bilər. Bu o deməkdir ki, məsələn, üzərinə tıklamadıqca o şəkillər göstərilməyəcək."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Data Qənaəti aktiv edilsin?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivləşdirin"</string>
@@ -1681,9 +1688,9 @@
<item quantity="other">%1$d dəq üçün (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> qədər)</item>
<item quantity="one">1 dəqiqə üçün (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> qədər)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d saatlıq (saat <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> radəsinə qədər)</item>
- <item quantity="one">Bir saatlıq (saat <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> radəsinə qədər)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d saatlıq (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> olana qədər)</item>
+ <item quantity="one">1 saatlıq (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> olana qədər)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d saat üçün (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> qədər)</item>
@@ -1697,9 +1704,9 @@
<item quantity="other">%d dəq üçün</item>
<item quantity="one">1 dəq üçün</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other"> %d saatlıq</item>
- <item quantity="one">Bir saatlıq</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d saatlıq</item>
+ <item quantity="one">1 saatlıq</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d saat üçün</item>
@@ -1720,14 +1727,14 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> tərəfindən susdurulub"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Cihazınızın daxili problemi var və istehsalçı sıfırlanması olmayana qədər qeyri-stabil ola bilər."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Cihazınızın daxili problemi var. Əlavə məlumat üçün istehsalçı ilə əlaqə saxlayın."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD sorğusu DIAL sorğusuna dəyişdirildi."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD sorğusu SS sorğusuna dəyişdirildi."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD sorğusu yeni USSD sorğusuna dəyişdirildi."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD sorğusu Video DIAL sorğusuna dəyişdirildi."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS sorğusu DIAL sorğusuna dəyişdirildi."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS sorğusu Video DIAL sorğusuna dəyişdirildi."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS sorğusu USSD sorğusuna dəyişdirildi."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS sorğusu yeni SS sorğusuna dəyişdirildi."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD sorğusu adi zəngə dəyişdirildi"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD sorğusu yeni SS sorğusuna dəyişdirildi"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Yeni USSD sorğusun dəyişdirildi"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD sorğusu video zəngə dəyişdirildi"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS sorğusu adi zəngə dəyişdirildi"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS sorğusu video zəngə dəyişdirildi"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS sorğusu USSD sorğusuna dəyişdirildi"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Yeni SS sorğusuna dəyişdirildi"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"İş profili"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Genişləndirin"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Yığcamlaşdırın"</string>
@@ -1837,7 +1844,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Zərərli tətbiq aşkarlandı"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> tətbiqindən bölmələr göstərmək istəyir"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Redaktə edin"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Zəng və bildirişlər vibrasiya verəcək"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Zəng və bildirişlər səssiz ediləcək"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistem dəyişiklikləri"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Narahat Etməyin"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"\"Narahat Etməyin\" rejimi diqqətinizi yayındırmamaq üçün bildirişləri gizlədir"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Bu, yeni davranışdır. Dəyişmək üçün klikləyin."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Narahat Etməyin\" rejimi dəyişdirildi"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Kəsintilər üçün funksiya ayarlarını yoxlamağa görə klikləyin"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Nəyin blok edildiyini yoxlamaq üçün klikləyin."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Ayarlar"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index bd3de481b530..564790dfbae4 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -79,15 +79,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Налады ідэнтыфікатару АВН па змаўчанні: не абмяжавана. Наступны выклік: не абмежавана"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Служба не прадастаўляецца."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Вы не можаце змяніць налады ідэнтыфікатара абанента, якi тэлефануе."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Няма сэрвісу перадачы даных"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Немагчыма выклікаць экстраную дапамогу"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Мабільны інтэрнэт недаступны"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Экстранныя выклікі недаступныя"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Няма сэрвісу галасавых выклікаў"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Няма сэрвісу галасавых / экстранных выклікаў"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Часова не прапаноўваецца сеткай мабільнай сувязі ў вашым месцазанходжанні"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Немагчыма падключыцца да сеткі"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Каб палепшыць якасць прыёму, паспрабуйце змяніць тып, выбраны ў меню \"Налады &gt; Сетка і інтэрнэт &gt; Мабільныя сеткі &gt; Прыярытэтны тып сеткі\"."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi-Fi-тэлефанія актыўная"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Для экстранных выклікаў патрабуецца мабільная сетка."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Галасавыя або экстранныя выклікі недаступныя"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Часова выключана аператарам сувязі"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Сетка мабільнай сувязі недаступная"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Націсніце, каб выбраць іншую сетку."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Экстранныя выклікі недаступныя"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Экстранныя выклікі ў сетцы Wi‑Fi недаступныя"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Абвесткі"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Пераадрасацыя выкліку"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Рэжым экстраннага зваротнага выкліку"</string>
@@ -122,13 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Банэр роўмінгу ўключаны"</string>
<string name="roamingText12" msgid="1189071119992726320">"Банэр роўмінгу адключаны"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Пошук службы"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-тэлефанія"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Каб рабіць выклікі і адпраўляць паведамленні па Wi-Fi, спачатку папрасіце свайго аператара наладзіць гэту паслугу. Затым зноў уключыце Wi-Fi-тэлефанію ў меню Налады. (Код памылкі: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Зарэгіструйцеся ў свайго аператара (Код памылкі: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Wi-Fi-тэлефанія %s"</item>
@@ -162,8 +161,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Апрацоўваецца занадта шмат запытаў. Паспрабуйце яшчэ раз пазней."</string>
<string name="notification_title" msgid="8967710025036163822">"Памылка ўваходу ва ўлiковы запiс <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Сінхранізацыя"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Сінхранізацыя"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Занадта шмат выдаленняў <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Памяць планшэта поўная. Выдаліце некаторыя файлы, каб вызваліць месца."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Сховішча гадзінніка перапоўнена. Выдаліце некаторыя файлы, каб вызваліць месца."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Сховішча тэлевізара перапоўнена. Выдаліце некаторыя файлы, каб вызваліць месца."</string>
@@ -178,7 +179,6 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Адміністратар вашага працоўнага профілю"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Рабочы профіль выдалены"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Працоўны профіль выдалены з-за адсутнасці праграмы адміністратара"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Праграма адміністратара для працоўнага профілю адсутнічае або пашкоджана. У выніку гэтага ваш працоўны профіль і звязаныя з ім даныя былі выдалены. Звярніцеся па дапамогу да адміністратара."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Ваш працоўны профіль больш не даступны на гэтай прыладзе"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Занадта шмат спроб уводу пароля"</string>
@@ -278,31 +278,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Пераключыцца на працоўны профіль"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Кантакты"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"атрымліваць доступ да вашых кантактаў"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Дазволіць &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; атрымліваць доступ да вашых кантактаў"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Месцазнаходжанне"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"атрымліваць доступ да месцазнаходжання гэтай прылады"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; атрымліваць доступ да звестак аб месцазнаходжанні гэтай прылады"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Каляндар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"атрымліваць доступ да вашага календара"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Дазволіць &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; атрымліваць доступ да вашага календара"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"адпраўляць і праглядаць SMS-паведамленні"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Дазволіць &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; адпраўляць і праглядваць SMS-паведамленні"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Сховішча"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"атрымліваць доступ да фатаграфій, медыяфайлаў і файлаў на вашай прыладзе"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Дазволіць &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; атрымліваць доступ да фота, мультымедыя і файлаў на вашай прыладзе"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Мікрафон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"запісваць аўдыя"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Дазволіць &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; запісваць аўдыя"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"рабіць фатаздымкі і запісваць відэа"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Дазволіць &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; рабіць фота і запісваць відэа"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Тэлефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"рабіць тэлефонныя выклікі і кіраваць імі"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Дазволіць &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; рабіць тэлефонныя выклікі і кіраваць імі"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Датчыкі цела"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"атрымліваць з датчыка даныя асноўных фізіялагічных паказчыкаў"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Дазволіць &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; атрымліваць доступ да даных з датчыкаў пра вашы асноўныя фізіялагічныя паказчыкі"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Атрымліваць змесціва вакна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Аналізаваць змесціва актыўнага вакна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Уключаць Азнаямленне дотыкам"</string>
@@ -876,6 +885,12 @@
<string name="text_copied" msgid="4985729524670131385">"Тэкст скапіяваны ў буфер абмену."</string>
<string name="more_item_label" msgid="4650918923083320495">"Больш"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Меню+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"прабел"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"выдаліць"</string>
@@ -1121,21 +1136,14 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Праверыць на наяўнасць абнаўленняў"</string>
<string name="smv_application" msgid="3307209192155442829">"Прыкладанне <xliff:g id="APPLICATION">%1$s</xliff:g> (працэс <xliff:g id="PROCESS">%2$s</xliff:g>) парушыла ўласную палітыку StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Працэс <xliff:g id="PROCESS">%1$s</xliff:g> парушыў уласную палітыку StrictMode."</string>
- <!-- no translation found for android_upgrading_title (7513829952443484438) -->
- <skip />
- <!-- no translation found for android_upgrading_title (4503169817302593560) -->
- <skip />
- <!-- no translation found for android_upgrading_title (7009520271220804517) -->
- <skip />
- <!-- no translation found for android_start_title (4536778526365907780) -->
- <skip />
- <!-- no translation found for android_start_title (4929837533850340472) -->
- <skip />
- <!-- no translation found for android_start_title (7467484093260449437) -->
- <skip />
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Абнаўленне тэлефона…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Абнаўленне планшэта…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Абнаўленне прылады…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Запуск тэлефона…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Запуск планшэта…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Запуск прылады…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Аптымізацыя сховішча."</string>
- <!-- no translation found for android_upgrading_notification_title (1511552415039349062) -->
- <skip />
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Завяршэнне абнаўлення сістэмы…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> абнаўляецца…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Аптымізацыя прыкладання <xliff:g id="NUMBER_0">%1$d</xliff:g> з <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Падрыхтоўка <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
@@ -1149,7 +1157,8 @@
<string name="new_app_action" msgid="6694851182870774403">"Адкрыць праграму \"<xliff:g id="NEW_APP">%1$s</xliff:g>\""</string>
<string name="new_app_description" msgid="5894852887817332322">"Праграма \"<xliff:g id="OLD_APP">%1$s</xliff:g>\" будзе закрыта. Даныя не будуць захаваны"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Працэс <xliff:g id="PROC">%1$s</xliff:g> перавысіў ліміт памяці"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Быў сабраны дамп кучы; дакраніцеся, каб абагуліць"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Абагуліць дамп дынамічнай вобласці?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Працэс <xliff:g id="PROC">%1$s</xliff:g> перавысіў ліміт памяці працэсу <xliff:g id="SIZE">%2$s</xliff:g>. Дамп дынамічнай вобласці даступны для вас, вы можаце абагуліць яго з распрацоўшчыкам. Будзьце асцярожныя: гэты дамп дынамічнай вобласці можа ўтрымліваць асабістую інфармацыю, да якой маюць доступ праграмы."</string>
<string name="sendText" msgid="5209874571959469142">"Выберыце дзеянне для тэкста"</string>
@@ -1188,13 +1197,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Падключыцеся да адкрытай сеткі Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Падключэнне да сеткі Wi‑Fi аператара"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ідзе падключэнне да адкрытай сеткі Wi‑Fi"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Выканана падключэнне да адкрытай сеткі Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не атрымалася падключыцца да адкрытай сеткі Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Дакраніцеся, каб убачыць усе сеткі"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Падключыцца"</string>
- <!-- no translation found for wifi_available_action_all_networks (4368435796357931006) -->
- <skip />
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Усе сеткі"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi уключыцца аўтаматычна"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Побач з захаванай сеткай з высакаякасным сігналам"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не ўключаць зноў"</string>
@@ -1279,13 +1288,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Перадача фота (PTP) праз USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Рэжым USB-мадэма"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI праз USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Рэжым USB-прылады"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-прылада падключана"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Дакраніцеся, каб атрымаць іншыя параметры."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Зарадка падключанай прылады. Націсніце, каб убачыць іншыя параметры."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Выяўлены аксесуар аналагавага аўдыя"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Далучаная прылада не сумяшчальная з гэтым тэлефонам. Націсніце, каб даведацца больш."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Адладка па USB падключана"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Дакраніцеся, каб адключыць адладку па USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Націсніце, каб адключыць адладку па USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Выберыце, каб адключыць адладку USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Стварэнне справаздачы пра памылку…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Падзяліцца справаздачай пра памылку?"</string>
@@ -1390,14 +1399,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Падключэнне заўсёды ўключанага VPN..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Заўсёды ўключаны i падключаны VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Адключана ад заўсёды ўключанай VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Памылка заўсёды ўключанага VPN"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Змяніць налады сеткі ці VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Выберыце файл"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Файл не выбраны"</string>
<string name="reset" msgid="2448168080964209908">"Скінуць"</string>
<string name="submit" msgid="1602335572089911941">"Перадаць"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Рэжым \"У машыне\" ўключаны"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Дакраніцеся, каб выйсці з рэжыму \"У машыне\"."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"USB-мадэм або кропка доступу Wi-Fi актыўныя"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Дакраніцеся, каб наладзіць."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Рэжым мадэма адключаны"</string>
@@ -1729,7 +1741,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Усталяваны вашым адміністратарам"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Абноўлены вашым адміністратарам"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Выдалены вашым адміністратарам"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Каб падоўжыць час працы акумулятара, у рэжыме эканоміі зараду памяншаецца прадукцыйнасць вашай прылады, абмяжоўваецца выкарыстанне вібрацыі, службаў вызначэння месцазнаходжання і большасці задач фонавай перадачы даных. Электронная пошта, абмен паведамленнямі і іншыя праграмы, якія выкарыстоўваюць сінхранізацыю, могуць не абнаўляцца, пакуль вы іх не адкрыеце.\n\nРэжым эканоміі зараду адключаецца аўтаматычна, калі прылада зараджаецца."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Каб паменшыць выкарыстанне даных, Эканомія трафіку не дазваляе некаторым праграмам адпраўляць ці атрымліваць даныя ў фонавым рэжыме. Праграма, якую вы зараз выкарыстоўваеце, можа атрымліваць доступ да даных, але можа рабіць гэта радзей. Гэта можа азначаць, напрыклад, што відарысы не паказваюцца, пакуль вы не дакраняцеся да іх."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Уключыць Эканомію трафіка?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Уключыць"</string>
@@ -1745,7 +1758,7 @@
<item quantity="many">На %1$d хв (да <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">На %1$d хв (да <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">На %1$d гадзіну (да <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="few">На %1$d гадзіны (да <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="many">На %1$d гадзін (да <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1769,7 +1782,7 @@
<item quantity="many">На %d хв</item>
<item quantity="other">На %d хв</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">На %d гадзіну</item>
<item quantity="few">На %d гадзіны</item>
<item quantity="many">На %d гадзін</item>
@@ -1796,14 +1809,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> адключыў(-ла) гук"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"На вашай прыладзе ўзнікла ўнутраная праблема, і яна можа працаваць нестабільна, пакуль вы не зробіце скід да заводскіх налад."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"На вашай прыладзе ўзнікла ўнутраная праблема. Для атрымання дадатковай інфармацыі звярніцеся да вытворцы."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Запыт USSD зменены на запыт DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Запыт USSD зменены на запыт SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Запыт USSD зменены на новы запыт USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Запыт USSD зменены на запыт Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Запыт SS зменены на запыт DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Запыт SS зменены на запыт Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Запыт SS зменены на запыт USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Запыт SS зменены на новы запыт SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Працоўны профіль"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Разгарнуць"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Згарнуць"</string>
@@ -1917,7 +1938,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Выяўлена шкодная праграма"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Праграма <xliff:g id="APP_0">%1$s</xliff:g> запытвае дазвол на паказ зрэзаў праграмы <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Рэдагаваць"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Для выклікаў і апавяшчэнняў уключаны вібрасігнал"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Для выклікаў і апавяшчэнняў гук выключаны"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Сістэмныя змены"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не турбаваць"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Рэжым \"Не турбаваць\" хавае апавяшчэнні, каб вы маглі сканцэнтравацца"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Гэта новае дзеянне. Націсніце, каб перайсці ў налады."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Зменены налады рэжыму \"Не турбаваць\""</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Націсніце, каб праверыць налады апавяшчэнняў"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Націсніце, каб паглядзець заблакіраванае."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 4319081e276f..5ef9c72a2b8c 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Стандартната идентификация на повикванията е „разрешено“. За следващото обаждане тя е разрешена."</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Услугата не е обезпечена."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Не можете да променяте настройката за идентификация на обажданията."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Няма услуга за данни"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Няма достъп до спешните обаждания"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Няма достъп до мобилната услуга за данни"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Няма достъп до спешните обаждания"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Няма услуга за гласови обаждания"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Няма услуга за гласови/спешни обаждания"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Временно не се предлага от мобилната мрежа в местоположението ви"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се установи връзка с мрежата"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"За да подобрите сигнала, променете избрания тип мрежа от „Настройки“ &gt; „Мрежа и интернет“ &gt; „Мобилни мрежи“ &gt; „Предпочитан тип мрежа“."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Функцията за обаждания през Wi-Fi е активна"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"За спешните обаждания се изисква мобилна мрежа."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Няма достъп до гласовата услуга, нито до спешните обаждания"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Временно е изключено от оператора ви"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Не може да се установи връзка с мобилната мрежа"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Изберете друга предпочитана мрежа. Докоснете за промяна."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Няма достъп до спешните обаждания"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Не може да се извършват спешни обаждания през Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Сигнали"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Пренасочване на обаждания"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на обратно обаждане при спешност"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Банерът за роуминг е включен"</string>
<string name="roamingText12" msgid="1189071119992726320">"Банерът за роуминг е изключен"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Търси се покритие"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Обаждания през Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"За да извършвате обаждания и да изпращате съобщения през Wi-Fi, първо, помолете оператора си да настрои тази услуга. След това включете отново функцията за обаждания през Wi-Fi от настройките. (Код на грешката: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Регистриране с оператора ви (код на грешката: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s – обаждания през Wi-Fi"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Обработват се твърде много заявки. Опитайте отново по-късно."</string>
<string name="notification_title" msgid="8967710025036163822">"Грешка при влизането за <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Синхронизиране"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синхронизиране"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Изтриванията за <xliff:g id="CONTENT_TYPE">%s</xliff:g> са твърде много."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Синхронизирането не е възможно"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Опитахте да изтриете твърде много <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Хранилището на таблета е пълно. Изтрийте файлове, за да освободите място."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Хранилището на часовника е пълно. Изтрийте файлове, за да освободите място."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Хранилището на телевизора е пълно. Изтрийте някои файлове, за да освободите място."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"От администратора на служебния ви потребителски профил"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"От <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Служебният потребителски профил е изтрит"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Служебният потребителски профил е изтрит поради липса на приложение за администриране"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Приложението за администриране на служебния потребителски профил липсва или е повредено. В резултат на това той и свързаните с него данни са изтрити. За съдействие се свържете с администратора си."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Служебният ви потребителски профил вече не е налице на това устройство"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Опитите за паролата са твърде много"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Устройството се управлява"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Организацията ви управлява това устройство и може да наблюдава мрежовия трафик. Докоснете за подробности."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Данните на устройството ви ще бъдат изтрити"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Приложението за администриране не може да се използва. Сега данните на устройството ви ще бъдат изтрити.\n\nАко имате въпроси, свържете се с администратора на организацията си."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Приложението за администриране не може да се използва. Сега данните на устройството ви ще бъдат изтрити.\n\nАко имате въпроси, свържете се с администратора на организацията си."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Отпечатването е деактивиранo от <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Аз"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Опции за таблета"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Самолетен режим"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Самолетният режим е ВКЛЮЧЕН"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Самолетният режим е ИЗКЛЮЧЕН"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Режим за запазване на батерията"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Режимът за запазване на батерията е ИЗКЛЮЧЕН"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Режимът за запазване на батерията е ВКЛЮЧЕН"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помощ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласова помощ"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Превключване към служебния потребителски профил"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"има достъп до контактите ви"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Разрешете на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до контактите ви"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до контактите ви?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Местоположение"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"получи достъп до местоположението на това устройство"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Разрешете на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до местоположението на това устройство"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до местоположението на това устройство?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"има достъп до календара ви"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Разрешете на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до календара ви"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до календара ви?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"да изпраща и преглежда SMS съобщения"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Разрешете на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да изпраща и преглежда SMS съобщения"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да изпраща и преглежда SMS съобщения?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Хранилище"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"да има достъп до снимките, мултимедията и файловете на устройството ви"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Разрешете на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до снимките, мултимедията и файловете на устройството ви"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до снимките, мултимедията и файловете на устройството ви?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"записва звук"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Разрешете на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да записва аудио"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да записва аудио?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"да прави снимки и записва видеоклипове"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Разрешете на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да прави снимки и да записва видеоклипове"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да прави снимки и да записва видеоклипове?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"да извършва телефонни обаждания и да ги управлява"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Разрешете на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да извършва и управлява телефонни обаждания"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да извършва и управлява телефонни обаждания?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Телесни сензори"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"достъп до сензорните данни за жизнените ви показатели"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Разрешете на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до данните от сензорите за жизнените ви показатели"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до данните от сензорите за жизнените ви показатели?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Извличане на съдържанието от прозореца"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Инспектиране на съдържанието на прозорец, с който взаимодействате."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включване на изследването чрез докосване"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Извършване на жестове"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Можете да докосвате, да прекарвате пръст, да събирате пръсти и да извършвате други жестове."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Жестове за отпечатък"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Може да улавя жестовете, извършени върху сензора за отпечатъци на устройството."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Може да улавя жестовете, извършени върху сензора за отпечатъци на устройството."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"деактивиране или промяна на лентата на състоянието"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Разрешава на приложението да деактивира лентата на състоянието или да добавя и премахва системни икони."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"изпълняване на ролята на лента на състоянието"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Разрешава на приложението да прави части от себе си постоянни в паметта. Това може да ограничи наличната за другите приложения, забавяйки таблета."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Разрешава на приложението да прави части от себе си постоянни в паметта. Това може да ограничи наличната памет за останалите приложения и да забави телевизора."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Разрешава на приложението да прави части от себе си постоянни в паметта. Това може да ограничи наличната за другите приложения, забавяйки телефона."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"изпълнение на услуги на преден план"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Разрешава на приложението да се възползва от услуги на преден план."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"измерване на ползваното от приложението място в хранилището"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Разрешава на приложението да извлича размера на своя код, данни и кеш"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"промяна на системните настройки"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Отключване с фигура."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Отключване с лице."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Отключване с ПИН код."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Отключване на SIM картата с ПИН код."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Отключване на SIM картата с PUK код."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Отключване с парола."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Област на фигурата."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Област на плъзгане."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Текстът е копиран в буферната памет."</string>
<string name="more_item_label" msgid="4650918923083320495">"Още"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Меню+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"интервал"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"изтриване"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Проверка за актуализация"</string>
<string name="smv_application" msgid="3307209192155442829">"Приложението „<xliff:g id="APPLICATION">%1$s</xliff:g>“ (процес „<xliff:g id="PROCESS">%2$s</xliff:g>“) наруши правилото за стриктен режим, наложено от самото него."</string>
<string name="smv_process" msgid="5120397012047462446">"Процесът <xliff:g id="PROCESS">%1$s</xliff:g> наруши правилото за стриктен режим, наложено от самия него."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android се надстройва..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android се стартира…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Телефонът се актуализира…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Таблетът се актуализира…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Устройството се актуализира…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Телефонът се стартира…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Таблетът се стартира…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Устройството се стартира…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Хранилището се оптимизира."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Актуализацията на Android приключва…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Някои приложения може да не работят правилно, докато надстройването не завърши"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Системната актуализация завършва…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> се надстройва…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимизира се приложение <xliff:g id="NUMBER_0">%1$d</xliff:g> от <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> се подготвя."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Приложенията се стартират."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Зареждането завършва."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> се изпълнява"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Докоснете, за да се върнете към играта"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Избиране на игра"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"За по-добра ефективност само една от тези игри може да бъде отворена в даден момент."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Връщане към <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Отваряне на <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ще се затвори без запазване"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> надхвърли ограничението за памет"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Извлечена е моментна снимка на паметта. Докоснете, за да я споделите"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Извлечена е моментна снимка на паметта. Докоснете, за да я споделите."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Да се сподели ли моментната снимка на паметта?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Процесът <xliff:g id="PROC">%1$s</xliff:g> надхвърли ограничението си от <xliff:g id="SIZE">%2$s</xliff:g>. Налице е моментна снимка на паметта, която да споделите със съответния програмист. Бъдете внимателни, защото тя може да съдържа ваши лични данни, до които приложението има достъп."</string>
<string name="sendText" msgid="5209874571959469142">"Избиране на действие за текст"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Свързване с отворена Wi‑Fi мрежа"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Свържете се с Wi‑Fi мрежа на оператор"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Установява се връзка с отворена Wi‑Fi мрежа"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Установихте връзка с Wi-Fi мрежата"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не можа да се установи връзка с Wi‑Fi мрежата"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Докоснете, за да видите всички мрежи"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Свързване"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Всички мрежи"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Всички мрежи"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ще се включи автоматично"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Когато сте в района на запазена мрежа с високо качество"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Без повторно включване"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Рестартиране"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активиране на мобилната услуга"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Изтеглете приложението на оператора, за да активирате новата си SIM карта"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Изтеглете приложението <xliff:g id="APP_NAME">%1$s</xliff:g>, за да активирате новата си SIM карта"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Изтегляне на приложението"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Поставена е нова SIM карта"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Докоснете, за да я настроите"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Режимът PTP през USB е включен"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Тетърингът през USB е включен"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Режимът MIDI през USB е включен"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Режимът за аксесоари за USB е включен"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Аксесоарът за USB е свързан"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Докоснете за още опции."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Свързаното устройство се зарежда. Докоснете за още опции."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Открит е аналогов аудиоаксесоар"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Свързаното устройство не е съвместимо с този телефон. Докоснете, за да научите повече."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отстраняване на грешки през USB"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Докоснете, за да деактивирате отстраняването на грешки през USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Докоснете, за да изключите отстраняването на грешки през USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Изберете, за да деактивирате отстраняването на грешки през USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Сигналът за програмна грешка се извлича…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Да се сподели ли сигналът за програмна грешка?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> се показва върху други приложения"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се показва в/у други прилож."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не искате <xliff:g id="NAME">%s</xliff:g> да използва тази функция, докоснете, за да отворите настройките, и я изключете."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИЗКЛЮЧВАНЕ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Изключване"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>: Подготвя се"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Проверява се за грешки"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Открито е ново хранилище (<xliff:g id="NAME">%s</xliff:g>)"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Установява се връзка с винаги включената виртуална частна мрежа (VPN)…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Установена е връзка с винаги включената виртуална частна мрежа (VPN)"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Връзката с винаги включената VPN е прекратена"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Грешка във винаги включената виртуална частна мрежа (VPN)"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Не можа да се установи връзка с винаги включената VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Промяна на настройките за мрежата или VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Избор на файл"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Няма избран файл"</string>
<string name="reset" msgid="2448168080964209908">"Повторно задаване"</string>
<string name="submit" msgid="1602335572089911941">"Изпращане"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Мото режимът е активиран"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Докоснете, за да излезете от моторежима."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Приложението за шофиране е включено"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Докоснете, за да излезете от приложението за шофиране."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Има активна споделена връзка или безжична точка за достъп"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Докоснете, за да настроите."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Функцията за тетъринг е деактивирана"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"USB устройство от <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB хранилище"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Редактиране"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Сигнал за преноса на данни"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Пренос и настройки: Докоснете за преглед."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Достигнат лимит за 2G/3G данните"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Достигнат лимит за 4G данните"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Предупреждение за данните"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Използвахте <xliff:g id="APP">%s</xliff:g> от данните"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Моб. данни: Лимитът е достигнат"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Достигнат лимит за Wi-Fi данните"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Данните са на пауза за ост. от цикъла"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Превишен лимит на 2G–3G данните"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Лимит за 4G данните – превишен"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Лимит за моб. данни – превишен"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Превишен лимит на Wi-Fi данните"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> над определения лимит."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Преносът на данни е поставен на пауза за остатъка от цикъла ви"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Над лимита ви за мобилни данни"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Над лимита ви за данни през Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Надхвърлихте зададения от вас лимит с/ъс <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Ограничени данни на заден план"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Докоснете и премахнете огранич."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Голям пренос на данни"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Преносът ви на данни през последните няколко дни е по-голям от обичайното. Докоснете за преглед на преноса и настройките."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Голям пренос на мобилни данни"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Приложенията ви са използвали повече данни от обикновено"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Приложението <xliff:g id="APP">%s</xliff:g> е използвало повече данни от обикновено"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Сертификат за сигурност"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Този сертификат е валиден."</string>
<string name="issued_to" msgid="454239480274921032">"Издаден на:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Инсталирано от администратора ви"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Актуализирано от администратора ви"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Изтрито от администратора ви"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"С цел удължаване на живота на батерията режимът за запазването й намалява ефективността на устройството ви и ограничава вибрирането, услугите за местоположение и повечето данни на заден план. Приложенията за електронна поща, съобщения и др., които разчитат на синхронизиране, може да не се актуализират, освен ако не ги отворите.\n\nРежимът за запазване на батерията се изключва автоматично, когато устройството ви се зарежда."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"С цел намаляване на преноса на данни функцията за икономия на данни не позволява на някои приложения да изпращат или получават данни на заден план. Понастоящем използвано от вас приложение може да използва данни, но по-рядко. Това например може да означава, че изображенията не се показват, докато не ги докоснете."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ще вкл. ли Икономия на данни?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Включване"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">За %1$d мин (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">За 1 мин (до <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">За %1$d часа (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">За един час (до <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">За 1 час (до <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">За %1$d ч (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">За %d мин</item>
<item quantity="one">За 1 мин</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">За %d часа</item>
- <item quantity="one">За един час</item>
+ <item quantity="one">За 1 час</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">За %d ч</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"Заглушено от <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Възникна вътрешен проблем с устройството ви. То може да е нестабилно, докато не възстановите фабричните настройки."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Възникна вътрешен проблем с устройството ви. За подробности се свържете с производителя."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD заявката е променена на DIAL заявка."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD заявката е променена на SS заявка."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD заявката е променена на нова USSD заявка."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD заявката е променена на DIAL заявка за видеообаждане."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS заявката е променена на DIAL заявка."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS заявката е променена на DIAL заявка за видеообаждане."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS заявката е променена на USSD заявка."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS заявката е променена на нова SS заявка."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Служебен потребителски профил"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Разгъване"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Свиване"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Открито е опасно приложение"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> иска да показва части от <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Редактиране"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"При обаждания и известия устройството ще вибрира"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Обажданията и известията ще бъдат заглушени"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Промени в системата"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не безпокойте"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Режимът „Не безпокойте“ скрива известията, за да ви помогне да се съсредоточите"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Това е ново поведение. Докоснете за промяна."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Настройките за „Не безпокойте“ са променени"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Докоснете, за да проверите настройките за поведението при прекъсвания"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Докоснете, за да проверите какво е блокирано."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Система"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Настройки"</string>
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 7052e484910b..e189d2f5ca29 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ডিফল্টরূপে কলার আইডি সীমাবদ্ধ করা থাকে না৷ পরবর্তী কল: সীমাবদ্ধ নয়"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"পরিষেবা প্রস্তুত নয়৷"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"আপনি কলার আইডি এর সেটিংস পরিবর্তন করতে পারবেন না৷"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ডেটা পরিষেবা নেই"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"কোনও জরুরী অবস্থার কল নেই"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"মোবাইল ডেটা পরিষেবা নেই"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"জরুরি কল করা যাবে না"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ভয়েস পরিষেবা নেই"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"কোনো ভয়েস/জরুরী পরিষেবা নেই"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"সাময়িকভাবে মোবাইল নেটওয়ার্ক আপনার অবস্থানে এই পরিষেবা দিচ্ছে না"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"নেটওয়ার্কের সিগন্যাল নেই"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"আরও ভাল সিগন্যাল পাওয়ার জন্য সেটিংস &gt; নেটওয়ার্ক এবং ইন্টারনেট &gt; মোবাইল নেটওয়ার্ক &gt; পছন্দের নেটওয়ার্কের ধরন বিকল্পে গিয়ে অন্য ধরনের নেটওয়ার্ক বেছে নিয়ে দেখুন।"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"ওয়াই-ফাই কলিং সক্রিয় আছে"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"জরুরি কলের জন্য মোবাইল নেটওয়ার্ক থাকতে হবে।"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ভয়েস পরিষেবা অথবা জরুরি কলের সুবিধা নেই"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"পরিষেবা প্রদানকারী এই সুবিধা সাময়িকভাবে বন্ধ রেখেছে"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"মোবাইল নেটওয়ার্কে কানেক্ট করা যাচ্ছে না"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"পছন্দের নেটওয়ার্ক পরিবর্তন করে দেখুন। অন্য নেটওয়ার্ক বেছে নিতে ট্যাপ করুন।"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"জরুরি কল করা যাবে না"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"ওয়াই-ফাইয়ের মাধ্যমে জরুরি কল করা যাবে না"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"সতর্কতা"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"কল ফরওয়ার্ড করা"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"জরুরি কলব্যাক মোড"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"রোমিং ব্যানার চালু আছে"</string>
<string name="roamingText12" msgid="1189071119992726320">"রোমিং ব্যানার বন্ধ আছে"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"পরিষেবা অনুসন্ধান করা হচ্ছে"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ওয়াই-ফাই কলিং"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ওয়াই-ফাই এর মাধ্যমে কল করতে ও মেসেজ পাঠাতে, প্রথমে আপনার পরিষেবা প্রদানকারীকে এই পরিষেবার সেট-আপ করতে বলুন। তারপর আবার সেটিংস থেকে ওয়াই-ফাই কলিং চালু করুন। (ত্রুটি কোড: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"আপনার পরিষেবা প্রদানকারীর সাথে রেজিস্টার করুন (ত্রুটি কোড: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s ওয়াই-ফাই কলিং"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"অনেকগুলি অনুরোধের প্রক্রিয়া করা হচ্ছে৷ পরে আবার চেষ্টা করুন৷"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> এ প্রবেশ করায় ত্রুটি"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"সিঙ্ক"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"সিঙ্ক"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"অনেকগুলি <xliff:g id="CONTENT_TYPE">%s</xliff:g> মুছে ফেলা হয়েছে৷"</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ট্যাবলেটের স্টোরেজে আর জায়গা খালি নেই৷ জায়গা খালি করতে কিছু ফাইল মুছে দিন৷"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ঘড়ির স্টোরেজে আর জায়গা খালি নেই৷ জায়গা খালি করতে কিছু ফাইল মুছে দিন৷"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"টিভির স্টোরেজ পূর্ণ হয়েছে। জায়গা খালি করতে কিছু ফাইল মুছে ফেলুন৷"</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"আপনার কর্মস্থলের প্রোফাইলের প্রশাসক দ্বারা"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> এর দ্বারা"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"কাজের প্রোফাইল মুছে ফেলা হয়েছে"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"প্রশাসক অ্যাপ না থাকায় কর্মস্থলের প্রোফাইল মুছে ফেলা হয়েছে"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"কর্মস্থলের প্রোফাইলের প্রশাসক অ্যাপটি হয় নেই, অথবা সেটি ক্ষতিগ্রস্ত হয়েছে৷ এর ফলে আপনার কর্মস্থলের প্রোফাইল এবং সম্পর্কিত ডেটা মুছে ফেলা হয়েছে৷ সহায়তার জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন৷"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"আপনার কর্মস্থলের প্রোফাইলটি আর এই ডিভাইসে নেই"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"বহুবার ভুল পাসওয়ার্ড দিয়েছেন"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"ডিভাইসটি পরিচালনা করা হচ্ছে"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"আপনার প্রতিষ্ঠান এই ডিভাইসটি পরিচালনা করে এবং এটির নেটওয়ার্ক ট্রাফিকের উপরে নজর রাখতে পারে। বিশদ বিবরণের জন্য ট্যাপ করুন।,"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"আপনার ডিভাইসটি মুছে ফেলা হবে"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"প্রশাসক অ্যাপটি ব্যবহার করা যাবে না। আপনার ডিভাইসে থাকা সবকিছু এখন মুছে ফেলা হবে।\n\nকোনও প্রশ্ন থাকলে আপনার প্রতিষ্ঠানের প্রশাসকের সাথে যোগাযোগ করুন।"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"অ্যাডমিন অ্যাপটি ব্যবহার করা যাবে না। আপনার ডিভাইসে থাকা সবকিছু এখন মুছে ফেলা হবে।\n\nকোনও প্রশ্ন থাকলে আপনার প্রতিষ্ঠানের অ্যাডমিনের সাথে যোগাযোগ করুন।"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> প্রিন্টিং বন্ধ রেখেছে।"</string>
<string name="me" msgid="6545696007631404292">"আমাকে"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ট্যাবলেট বিকল্পগুলি"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"বিমান মোড"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"বিমান মোড চালু করা আছে"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"বিমান মোড বন্ধ করা আছে"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ব্যাটারি সেভার"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ব্যাটারি সেভার বন্ধ আছে"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ব্যাটারি সেভার চালু আছে"</string>
<string name="global_action_settings" msgid="1756531602592545966">"সেটিংস"</string>
<string name="global_action_assist" msgid="3892832961594295030">"সহযোগিতা"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ভয়েস সহায়তা"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"এর বদলে কাজের প্রোফাইল ব্যবহার করুন"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"পরিচিতি"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"আপনার পরিচিতিগুলিতে অ্যাক্সেস"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; কে আপনার পরিচিতিগুলি অ্যাক্সেস করতে দিন"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"অবস্থান"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"এই ডিভাইসের অবস্থান অ্যাক্সেস"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; কে এই ডিভাইসের অবস্থান অ্যাক্সেস করতে দিন"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ক্যালেন্ডার"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"আপনার ক্যালেন্ডারে অ্যাক্সেস"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; কে আপনার ক্যালেন্ডার অ্যাক্সেস করতে দিন"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"এসএমএসগুলি পাঠাতে এবং দেখতে"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; কে এসএমএস মেসেজ দেখতে ও পাঠাতে দিন"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"স্টোরেজ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"আপনার ডিভাইসে ফটো, মিডিয়া এবং ফাইলগুলিতে অ্যাক্সেস"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; কে আপনার ডিভাইসের ফটো, মিডিয়া এবং ফাইল অ্যাক্সেস করতে দিন"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"মাইক্রোফোন"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"অডিও রেকর্ড"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; কে অডিও রেকর্ড করতে দিন"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"ক্যামেরা"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ছবি তোলা এবং ভিডিও রেকর্ড"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; কে ফটো তুলতে আর ভিডিও রেকর্ড করতে দিন"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"ফোন"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ফোন কলগুলি এবং পরিচালনা"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; কে কল করতে এবং কল পরিচালনা করতে দিন"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"বডি সেন্সরগুলি"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"আপনার অত্যাবশ্যক লক্ষণগুলির সম্পর্কে সেন্সর ডেটা অ্যাক্সেস করে"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; কে সেন্সর থেকে আপনার জৈবনিক লক্ষণের ডেটা অ্যাক্সেস করতে দিন"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"উইন্ডোর কন্টেন্ট পুনরুদ্ধার করে"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"আপনি ইন্টারঅ্যাক্ট করছেন এমন একটি উইন্ডোর সামগ্রীকে সযত্নে নিরীক্ষণ করে৷"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পর্শের মাধ্যমে অন্বেষণ করা চালু করুন"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"অঙ্গভঙ্গির কাজগুলি সম্পাদন করুন"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"আলতো চাপ দেওয়া, সোয়াইপ, পিঞ্চ করা এবং অন্যান্য ইঙ্গিতের কাজগুলি সম্পাদন করতে পারবেন৷"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ফিঙ্গারপ্রিন্ট সেন্সরের উপর করা অঙ্গভঙ্গিগুলি"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"ডিভাইসের আঙ্গুলের ছাপের সেন্সরের উপর আঙ্গুলের ইঙ্গিত ক্যাপচার করতে পারে।"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"ডিভাইসের আঙ্গুলের ছাপের সেন্সরের উপরে ইঙ্গিত করলে বুঝতে পারে।"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"স্ট্যাটাস বার নিষ্ক্রিয় অথবা সংশোধন করে"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"অ্যাপ্লিকেশনকে স্ট্যাটাস বার অক্ষম করতে এবং সিস্টেম আইকনগুলি সরাতে দেয়৷"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"স্থিতি দন্ডে থাকুন"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"মেমরিতে নিজের জন্য প্রয়োজনীয় জায়গা আলাদা করে রাখতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ এর ফলে অন্যান্য অ্যাপ্লিকেশানগুলির জায়গা সীমিত হয়ে পড়তে পারে ও ট্যাবলেটটি অপেক্ষাকৃত ধীরগতির হয়ে পড়তে পারে৷"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"অ্যাপ্লিকেশানটিকে মেমোরিতে থাকা সেটির নিজস্ব অধিকৃত স্থানের অংশগুলিকে অবিরত রাখতে করার অনুমতি দেয়৷ এটি টিভিকে ধীর করে এমন অন্য অ্যাপ্লিকেশানগুলির জন্য উপলব্ধ মেমোরি সীমিত করতে পারে৷"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"মেমরিতে নিজের জন্য প্রয়োজনীয় জায়গা আলাদা করে রাখতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ এর ফলে অন্যান্য অ্যাপ্লিকেশানগুলির জায়গা সীমিত হয়ে পড়তে পারে ও ফোনটি অপেক্ষাকৃত ধীরগতির হয়ে পড়তে পারে৷"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ফোরগ্রাউন্ডে পরিষেবা চালানো"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"অ্যাপটিকে ফোরগ্রাউন্ডের পরিষেবা ব্যবহার করতে দেয়।"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"অ্যাপ্লিকেশন সঞ্চয়স্থানের জায়গা পরিমাপ করে"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"অ্যাপ্লিকেশানকে এটির কোড, ডেটা, এবং ক্যাশে মাপ উদ্ধার করার অনুমতি দেয়"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"সিস্টেম সেটিংস পরিবর্তন করুন"</string>
@@ -395,11 +409,11 @@
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"অতিরিক্ত অবস্থান প্রদানকারী কমান্ডগুলি অ্যাক্সেস করে"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"অবস্থানের সাথে সম্পর্কিত তথ্য প্রদানকারীর অতিরিক্ত কম্যান্ডগুলিকে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ এটি অ্যাপ্লিকেশানটিকে GPS অথবা অন্যান্য অবস্থান নির্ণয়ের সাথে সম্পর্কিত উৎসগুলির ক্রিয়াপ্রণালীর নিয়ন্ত্রণকে মঞ্জুর করতে পারে৷"</string>
<string name="permlab_accessFineLocation" msgid="251034415460950944">"সুনির্দিষ্ট অবস্থান (GPS এবং নেটওয়ার্ক-ভিত্তিক) অ্যাক্সেস করুন"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক লোকেশন উৎসগুলি বা GPS এর উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন সনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷ এর জন্য অতিরিক্ত ব্যাটারি খরচ হতে পারে৷"</string>
+ <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক লোকেশন উৎসগুলি বা GPS এর উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন শনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷ এর জন্য অতিরিক্ত ব্যাটারি খরচ হতে পারে৷"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"আনুমানিক অবস্থান (নেটওয়ার্ক-ভিত্তিক) অ্যাক্সেস করুন"</string>
- <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন সনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেইজন্য সেগুলিকে আপনার ট্যাবলেটে উপলব্ধ করে রাখতে হবে৷"</string>
- <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্কের উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন সনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার টিভিতে উপলব্ধ করে রাখতে হবে৷"</string>
- <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন সনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷"</string>
+ <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন শনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেইজন্য সেগুলিকে আপনার ট্যাবলেটে উপলব্ধ করে রাখতে হবে৷"</string>
+ <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্কের উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন শনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার টিভিতে উপলব্ধ করে রাখতে হবে৷"</string>
+ <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন শনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"আপনার অডিও সেটিংস পরিবর্তন করে"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ভলিউম এবং যেখানে স্পিকার আউটপুট হিসাবে ব্যবহৃত হয় সেই সব ক্ষেত্রে গ্লোবাল অডিও সেটিংসের সংশোধন করতে অ্যাপ্লিকেশনটিকে মঞ্জুর করে৷"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"অডিও রেকর্ড"</string>
@@ -482,7 +496,7 @@
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"ব্যবহার করার জন্য আঙ্গুলের ছাপের টেম্প্লেটগুলি যোগ করা এবং মোছার পদ্ধতিগুলি গ্রহন করতে অ্যাপ্লিকেশানটিতে অমুমতি দেয়৷"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার ব্যবহার করুন"</string>
<string name="permdesc_useFingerprint" msgid="9165097460730684114">"অনুমোদনের জন্য আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার ব্যবহার করতে অ্যাপ্লিকেশানটিতে অনুমতি দেয়"</string>
- <string name="fingerprint_acquired_partial" msgid="735082772341716043">"আঙ্গুলের ছাপ আংশিক সনাক্ত করা হয়েছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
+ <string name="fingerprint_acquired_partial" msgid="735082772341716043">"আঙ্গুলের ছাপ আংশিক শনাক্ত করা হয়েছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"আঙ্গুলের ছাপ প্রক্রিয়া করা যায়নি৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"আঙ্গুলের ছাপ নেওয়ার সেন্সরটি অপরিস্কার৷ অনুগ্রহ করে পরিষ্কার করে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"আঙ্গুল অতি দ্রুত সরানো হয়েছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"প্যাটার্ন দিয়ে আনলক৷"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"মুখের সাহায্যে আনলক করুন৷"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"পিন দিয়ে আনলক৷"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"সিম পিন আনলক।"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"সিম পিইউকে আনলক।"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"পাসওয়ার্ড দিয়ে আনলক৷"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"প্যাটার্ন এলাকা৷"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"স্লাইড করার এলাকা৷"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"ক্লিপবোর্ডে পাঠ্য অনুলিপি করা হয়েছে৷"</string>
<string name="more_item_label" msgid="4650918923083320495">"আরও"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"মেনু+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"স্পেস"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"মুছুন"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"আপডেট পাওয়া যাচ্ছে কিনা দেখুন"</string>
<string name="smv_application" msgid="3307209192155442829">"অ্যাপ্লিকেশানটি <xliff:g id="APPLICATION">%1$s</xliff:g> (প্রক্রিয়া <xliff:g id="PROCESS">%2$s</xliff:g>) তার স্ব-প্রয়োগ করা কঠোর মোড নীতি লঙ্ঘন করেছে৷"</string>
<string name="smv_process" msgid="5120397012047462446">"প্রক্রিয়াটি <xliff:g id="PROCESS">%1$s</xliff:g> তার স্ব-প্রয়োগ করা কঠোর মোড নীতি লঙ্ঘন করেছে৷"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android আপগ্রেড করা হচ্ছে..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android চালু হচ্ছে…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ফোন আপডেট করা হচ্ছে…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ট্যাবলেট আপডেট করা হচ্ছে…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"ডিভাইস আপডেট করা হচ্ছে…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ফোন চালু করা হচ্ছে…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ট্যাবলেট চালু করা হচ্ছে…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"ডিভাইস চালু করা হচ্ছে…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"স্টোরেজ অপ্টিমাইজ করা হচ্ছে৷"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android আপডেট সম্পন্ন করা হচ্ছে…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"আপগ্রেড সম্পন্ন না হওয়া পর্যন্ত কিছু অ্যাপ্লিকেশান সঠিকভাবে কাজ নাও করতে পারে"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"সিস্টেম আপডেট শেষ করা হচ্ছে…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> আপগ্রেড করা হচ্ছে…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>টির মধ্যে <xliff:g id="NUMBER_0">%1$d</xliff:g>টি অ্যাপ্লিকেশান অপ্টিমাইজ করা হচ্ছে৷"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> প্রস্তুত করা হচ্ছে৷"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"অ্যাপ্লিকেশানগুলি শুরু করা হচ্ছে৷"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"চালু করা সম্পূর্ণ হচ্ছে৷"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> চলছে"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"গেমে ফিরে আসতে ট্যাপ করুন"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"গেম বেছে নিন"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"বেশি ভাল পারফরম্যান্সের জন্য, এক সময়ে এই গেমগুলির যেকোনও একটি খোলা যেতে পারে।"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> এ ফিরে যান"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> খুলুন"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"সেভ না করেই <xliff:g id="OLD_APP">%1$s</xliff:g> বন্ধ হবে"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> মেমরি সীমা অতিক্রম করেছে"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"অনেক ডেটা সংগ্রহ করা হয়েছে; শেয়ার করার জন্য ট্যাপ করুন"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"হিপ ডাম্প শেয়ার করবেন?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> প্রক্রিয়াটি তার <xliff:g id="SIZE">%2$s</xliff:g> এর মেমরি সীমা অতিক্রম করেছে৷ তার ডেভেলপারের সাথে শেয়ার করার জন্য একটি হিপ ডাম্প উপলব্ধ৷ সতর্কতা অবলম্বন করুন: এই হিপ ডাম্পে অ্যাপ্লিকেশানটির অ্যাক্সেস আছে এমন আপনার যেকোন ব্যক্তিগত তথ্য থাকতে পারে৷"</string>
<string name="sendText" msgid="5209874571959469142">"পাঠ্যের জন্য একটি কাজ বেছে নিন"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযোগ করুন"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"পরিষেবা প্রদানকারীর ওয়াই-ফাই নেটওয়ার্কে সংযোগ করুন"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযোগ করা হচ্ছে"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযুক্ত করা হয়েছে"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ওয়াই-ফাই নেটওয়ার্কে সংযোগ করা গেল না"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সমস্ত নেটওয়ার্ক দেখতে ট্যাপ করুন"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"সংযুক্ত করুন"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"সমস্ত নেটওয়ার্ক"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"সব নেটওয়ার্ক"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ওয়াই-ফাই নিজে থেকেই চালু হবে"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"যখন আপনি একটি উচ্চ মানের সংরক্ষিত নেটওয়ার্ক কাছাকাছি থাকেন"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"আবার চালু করবেন না"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"রিস্টার্ট করুন"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"মোবাইল পরিষেবা চালু করুন"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"আপনার নতুন সিম কার্ড চালু করতে পরিষেবা প্রদানকারীর অ্যাপটি ডাউনলোড করুন"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"আপনার নতুন সিম কার্ড চালু করতে <xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপটি ডাউনলোড করুন"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"অ্যাপ ডাউনলোড করুন"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"নতুন সিম ঢোকানো হয়েছে"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"এটিকে সেট আপ করতে আলতো চাপুন"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB এর মাধ্যমে PTP চালু করা হয়েছে"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB টিথারিং চালু করা হয়েছে"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB এর মাধ্যমে MIDI চালু করা হয়েছে"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB অ্যাক্সেসরি মোড চালু আছে"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"ইউএসবি অ্যাক্সেসরি কানেক্ট করা হয়েছে"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"আরও বিকল্পের জন্য আলতো চাপুন৷"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"সংযুক্ত ডিভাইস চার্জ করা হচ্ছে। আরও বিকল্প দেখতে ট্যাপ করুন।"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"অ্যানালগ অডিও অ্যাক্সেসরি শনাক্ত করা হয়েছে"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"সংযুক্ত ডিভাইসটি এই ফোনের সাথে ব্যবহার করা যাবে না। আরও জানতে ট্যাপ করুন।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ডিবাগিং সংযুক্ত হয়েছে"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB ডিবাগিং অক্ষম করতে আলতো চাপুন৷"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"ইউএসবি ডিবাগিং বন্ধ করতে ট্যাপ করুন"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ডিবাগিং অক্ষম করতে বেছে নিন।"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ত্রুটির প্রতিবেদন নেওয়া হচ্ছে..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ত্রুটির প্রতিবেদন শেয়ার করবেন?"</string>
@@ -1248,10 +1270,10 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপ্লিকেশানের ওপরেও প্রদর্শিত"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপের ওপর প্রদর্শিত হচ্ছে"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে, ট্যাপ করে সেটিংসে যান ও বৈশিষ্ট্যটি বন্ধ করে দিন।"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"বন্ধ করুন"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"বন্ধ করুন"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> প্রস্তুত করা হচ্ছে"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ত্রুটি রয়েছে কিনা পরীক্ষা করা হচ্ছে"</string>
- <string name="ext_media_new_notification_message" msgid="7589986898808506239">"নতুন <xliff:g id="NAME">%s</xliff:g> সনাক্ত করা হয়েছে"</string>
+ <string name="ext_media_new_notification_message" msgid="7589986898808506239">"নতুন <xliff:g id="NAME">%s</xliff:g> শনাক্ত করা হয়েছে"</string>
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ফটো এবং মিডিয়া ট্রান্সফার"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ৷ ঠিক করতে আলতো চাপুন৷"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"সর্বদা-চালু VPN সংযুক্ত হচ্ছে..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"সর্বদা-চালু VPN সংযুক্ত হয়েছে"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"সবসময়-চালু VPN এর সংযোগ বিচ্ছিন্ন আছে"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"সর্বদা-চালু VPN ত্রুটি"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"নেটওয়ার্ক অথবা VPN সেটিংস পরিবর্তন করুন"</string>
<string name="upload_file" msgid="2897957172366730416">"ফাইল বেছে নিন"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"কোনো ফাইল নির্বাচন করা হয়নি"</string>
<string name="reset" msgid="2448168080964209908">"আবার সেট করুন"</string>
<string name="submit" msgid="1602335572089911941">"জমা দিন"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"গাড়ি মোড সক্ষম করা হয়েছে"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"গাড়ি মোড থেকে প্রস্থান করতে আলতো চাপুন৷"</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"টিথারিং বা হটস্পট সক্রিয় আছে"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"সেট আপ করার জন্য আলতো চাপুন৷"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"টিথারিং অক্ষম করা আছে"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ড্রাইভ"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB স্টোরেজ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"সম্পাদনা করুন"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"ডেটা ব্যবহারের সতর্কতা"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"ব্যবহার এবং সেটিংস দেখতে আলতো চাপুন৷"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ডেটা সীমা ছাড়িয়েছে"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ডেটা সীমা ছাড়িয়েছে"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ডেটা সম্পর্কিত সতর্কতা"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"আপনি <xliff:g id="APP">%s</xliff:g> ডেটা ব্যবহার করেছেন"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"মোবাইল ডেটার সীমায় পৌঁছে গেছেন"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ওয়াই-ফাই ডেটা সীমা ছাড়িয়েছে"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"বাকি চক্রের জন্য ডেটা বিরামে গেছে"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G ডেটা সীমা ছাড়িয়ে গেছে"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ডেটা সীমা ছাড়িয়ে গেছে"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"মোবাইল ডেটার সীমা ছাড়িয়ে গেছে"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"ওয়াই-ফাই ডেটার সীমা ছাড়িয়ে গেছে"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"নির্দিষ্ট সীমার থেকে <xliff:g id="SIZE">%s</xliff:g> বেশি৷"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"আপনার বিলিং চক্রের বাকি দিনগুলির জন্য ডেটা বন্ধ করে দেওয়া হয়েছে"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"মোবাইল ডেটার সীমার চেয়ে বেশি"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"ওয়াই-ফাই ডেটার সীমার চেয়ে বেশি"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"আপনি নির্ধারিত সীমার চেয়ে <xliff:g id="SIZE">%s</xliff:g> বেশি ব্যবহার করেছেন"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"পটভূমি ডেটা সীমিত করা আছে"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"সীমাবদ্ধতা সরাতে আলতো চাপুন৷"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"বেশি ডেটা ব্যবহার হয়েছে"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"গত কয়েকদিনে আপনি স্বাভাবিকের থেকে বেশি ডেটা ব্যবহার করেছেন। ডেটার ব্যবহার দেখতে এবং সেটিংসে যেতে ট্যাপ করুন।"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"খুব বেশি মোবাইল ডেটার ব্যবহার"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"আপনার অ্যাপগুলিতে স্বাভাবিকের চেয়ে বেশি ডেটা ব্যবহার হয়েছে"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> অ্যাপে স্বাভাবিকের চেয়ে বেশি ডেটা ব্যবহার হয়েছে"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"নিরাপত্তার সার্টিফিকেট"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"শংসাপত্রটি বৈধ৷"</string>
<string name="issued_to" msgid="454239480274921032">"এর জন্য ইস্যু করা হয়েছে:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"আপনার প্রশাসক ইনস্টল করেছেন"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"আপনার প্রশাসক আপডেট করেছেন"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"আপনার প্রশাসক মুছে দিয়েছেন"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"ব্যাটরির লাইফ উন্নত করে সাহায্য করতে, ব্যাটারি সেভার আপনার ডিভাইসের পারফরম্যান্স কমিয়ে দেয় এবং কম্পন, লোকেশন পরিষেবা এবং অধিকাংশ ব্যাকগ্রাউন্ড ডেটা সীমিত করে। ইমেল, মেসেজিং এবং সিঙ্কের উপর নির্ভর করে এমন অন্যান্য অ্যাপগুলিকে আপনি না খোলা পর্যন্ত নাও আপডেট হতে পারে।\n\nআপনার ডিভাইসটিকে যখন চার্জ করা হয় তখন ব্যাটারি সেভার নিজে থেকে বন্ধ হয়ে যায়।"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার পটভূমিতে কিছু অ্যাপ্লিকেশনকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশন ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবিগুলিতে আলতো চাপ না দেওয়া পর্যন্ত সেগুলি প্রদর্শিত হবে না৷"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ডেটা সেভার চালু করবেন?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"চালু করুন"</string>
@@ -1682,9 +1705,9 @@
<item quantity="one">%1$d মিনিটের জন্য (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
<item quantity="other">%1$d মিনিটের জন্য (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">%1$d ঘন্টার জন্য (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
- <item quantity="other">%1$d ঘন্টার জন্য (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">%1$d ঘণ্টার জন্য (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
+ <item quantity="other">%1$d ঘণ্টার জন্য (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">%1$d ঘন্টার জন্য (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> পর্যন্ত)</item>
@@ -1698,9 +1721,9 @@
<item quantity="one">%d মিনিটের জন্য</item>
<item quantity="other">%d মিনিটের জন্য</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">%d ঘন্টার জন্য</item>
- <item quantity="other">%d ঘন্টার জন্য</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">%d ঘণ্টার জন্য</item>
+ <item quantity="other">%d ঘণ্টার জন্য</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">%d ঘন্টার জন্য</item>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> দ্বারা নিঃশব্দ করা হয়েছে"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে, এবং আপনি যতক্ষণ না পর্যন্ত এটিকে ফ্যাক্টরি ডেটা রিসেট করছেন ততক্ষণ এটি ঠিকভাবে কাজ নাও করতে পারে৷"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে৷ বিস্তারিত জানার জন্য প্রস্তুতকারকের সাথে যোগাযোগ করুন৷"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD অনুরোধটিকে ডায়াল অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD অনুরোধটিকে SS অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD অনুরোধটিকে নতুন USSD অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD অনুরোধটিকে ভিডিও DIAL অনুরোধে পরিবর্তন করা হয়েছে।"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS অনুরোধটিকে ডায়াল অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS অনুরোধটিকে ভিডিও DIAL অনুরোধে পরিবর্তন করা হয়েছে।"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS অনুরোধটিকে নতুন USSD অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS অনুরোধটিকে নতুন SS অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"কর্মস্থলের প্রোফাইল"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"বড় করুন"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"সঙ্কুচিত করুন"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ক্ষতিকর অ্যাপ শনাক্ত করা হয়েছে"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> অ্যাপটি <xliff:g id="APP_2">%2$s</xliff:g> এর অংশ দেখাতে চায়"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"এডিট করুন"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"কল এবং বিজ্ঞপ্তি আসলে ভাইব্রেট হবে"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"কল এবং বিজ্ঞপ্তিগুলি মিউট করা হবে"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"সিস্টেমে হয়ে থাকা পরিবর্তন"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"বিরক্ত করবেন না"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"আপনি যাতে মন দিয়ে কাজ করতে পারেন তার জন্য \'বিরক্ত করবেন না\' মোড বিজ্ঞপ্তি লুকিয়ে দিচ্ছে"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"এটি নতুন বৈশিষ্ট্য। পরিবর্তন করতে ট্যাপ করুন।"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'বিরক্ত করবেন না\' মোডের সেটিং বদলে গেছে"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"বিজ্ঞপ্তির উপর ট্যাপ করে জানুন আপনি বাধার জন্য কোন সেটিংস সেট করেছেন"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"কী কী ব্লক করা আছে তা দেখতে ট্যাপ করুন।"</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index da059ad72be7..3e903de472b0 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -78,15 +78,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Prikaz ID-a pozivaoca u zadanim postavkama nije zabranjen. Sljedeći poziv: nije zabranjen"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Uslugu nije moguće koristiti."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Ne možete promijeniti postavke ID-a pozivaoca."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Nema usluge prijenosa mobilnih podataka"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Nema hitnih poziva"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Nema usluge prijenosa podataka na mobilnoj mreži"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Hitni pozivi su nedostupni"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Nema usluge govornih poziva"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema govornih/hitnih usluga"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Trenutno nije u ponudi mobilne mreže na vašoj lokaciji"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nije moguće dosegnuti mrežu"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Da poboljšate prijem, pokušajte promijeniti odabrani tip u meniju Postavke &gt; Mreža i internet &gt; Mobilne mreže &gt; Preferirani tip mreže."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Aktivno je Wi‑Fi pozivanje"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Za hitne pozive potrebna je mreža"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nema glasovne usluge ili hitnih poziva"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Privremeno isključio mobilni operater"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Nije moguće dosegnuti mobilnu mrežu"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Pokušajte promijeniti preferiranu mrežu. Dodirnite za promjenu."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hitni pozivi su nedostupni"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Nije moguće uspostaviti hitne pozive putem Wi‑Fi mreže"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način rada za hitni povratni poziv"</string>
@@ -121,13 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Oznaka da je uređaj u roamingu uključena"</string>
<string name="roamingText12" msgid="1189071119992726320">"Oznaka da je uređaj u roamingu ugašena"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Traženje usluge"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi pozivanje"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Da biste pozivali i slali poruke koristeći Wi-Fi mrežu, prvo zatražite od operatera da postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozivanje u Postavkama. (Kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registrirajte se kod svog mobilnog operatera (Kȏd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Wi-Fi pozivanje preko operatera %s"</item>
@@ -161,8 +160,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Trenutno se obrađuje previše zahtjeva. Pokušajte ponovo kasnije."</string>
<string name="notification_title" msgid="8967710025036163822">"Greška u prijavi za račun <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinhroniziranje"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinhroniziranje"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Obrisano previše unosa aplikacije <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Pohrana tableta je puna. Izbrišite fajlove kako biste oslobodili prostor."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Prostor za gledanje je pun. Obrišite neke fajlove da oslobodite prostor."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Prostor TV-a za pohranu je pun. Obrišite neke fajlove da oslobodite prostor."</string>
@@ -176,14 +177,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Administrator vašeg radnog profila"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Od <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Poslovni profil je obrisan"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Radni profil je izbrisan jer nedostaje aplikacija administratora"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Nedostaje aplikacija administratora za radni profil ili je neispravna. Zbog toga su vaš radni profil i povezani podaci izbrisani. Obratite administratoru za pomoć."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Radni profil više nije dostupan na ovom uređaju"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Previše puta ste pokušali otključati uređaj"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Uređajem se upravlja."</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Vaša organizacija upravlja ovim uređajem i može pratiti mrežni saobraćaj. Dodirnite za detalje."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Uređaj će biti izbrisan"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Nije moguće koristiti aplikaciju administratora. Potpuno će se izbrisati podaci na vašem uređaju.\n\nAko imate pitanja, obratite se administratoru vaše organizacije."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Nije moguće koristiti aplikaciju administratora. Potpuno će se izbrisati podaci na vašem uređaju.\n\nAko imate pitanja, obratite se administratoru svoje organizacije."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Štampanje je onemogućila aplikacija <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Ja"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opcije tableta"</string>
@@ -239,6 +239,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Način rada u avionu"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uključen je način rada u avionu"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Način rada u avionu ugašen"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Ušteda baterije"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Ušteda baterije je ISKLJUČENA"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Ušteda baterije je UKLJUČENA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Postavke"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
@@ -272,31 +275,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Pređite na radni profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupa vašim kontaktima"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Dozvolite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristup vašim kontaktima"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupa lokaciji ovog uređaja"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Dozvolite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristup lokaciji ovog uređaja"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupa vašem kalendaru"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Dozvolite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristup vašem kalendaru"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"šalje i pregleda SMS poruke"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Dozvolite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; slanje i pregled SMS poruka"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Pohrana"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"pristupa slikama, medijskim fajlovima i fajlovima na vašem uređaju"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Dozvolite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristup fotografijama, medijima i fajlovima na vašem uređaju"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"snima zvuk"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Dozvolite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; snimanje zvuka"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"slika i snima videozapise"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Dozvolite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; snimanje slika i videozapisa"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"poziva i upravlja pozivima"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Dozvolite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uspostavljanje poziva i njihovo upravljanje"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Tjelesni senzori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupa podacima senzora o vašim vitalnim funkcijama"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Dozvolite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristup senzornim podacima o vašim vitalnim znacima"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Preuzima sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregleda sadržaj prozora koji trenutno koristite."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključi opciju Istraživanje dodirom"</string>
@@ -308,7 +320,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Praviti pokrete"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Može dodirivati, prevlačiti, hvatati prstima i praviti druge pokrete."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Pokreti otiska prsta"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Moguće je zabilježiti pokrete na senzoru za otisak prsta uređaja."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Moguće je zabilježiti pokrete na senzoru za otisak prsta uređaja."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"onemogućavanje ili mijenjanje statusne trake"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Dozvoljava aplikaciji onemogućavanje statusne trake ili dodavanje i uklanjanje sistemskih ikona."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"funkcioniranje u vidu statusne trake"</string>
@@ -359,6 +371,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Omogućava aplikaciji da neke svoje dijelove pohrani trajno u memoriji. Ovo može ograničiti veličinu raspoložive memorije za druge aplikacije i tako usporiti tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Dozvoljava aplikaciji da jednim dijelom trajno ostaje u memoriji. Time se ostalim aplikacijama dostupna memorija može ograničiti te usporiti rad TV-a."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Omogućava aplikaciji da neke svoje dijelove pohrani trajno u memoriji. Ovo može ograničiti veličinu raspoložive memorije za druge aplikacije i tako usporiti telefon."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"pokretanje usluge u prednjem planu"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Dopušta aplikaciji korištenje usluga u prednjem planu."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"mjerenje prostora kojeg aplikacije zauzimaju u pohrani"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Dozvoljava aplikaciji preuzimanje svog koda, podataka i veličine keš memorije"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"izmjena postavki sistema"</string>
@@ -805,6 +819,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Otključavanje uzorkom."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Otključavanje licem."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje pinom."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Otključavanje Pin-om za Sim."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Otključavanje Puk-om za Sim."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje lozinkom."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Uzorak oblasti."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblast za pomjeranje klizača."</string>
@@ -866,6 +882,12 @@
<string name="text_copied" msgid="4985729524670131385">"Tekst kopiran u međuspremnik."</string>
<string name="more_item_label" msgid="4650918923083320495">"Više"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Meni+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"razmak"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"potvrdi"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"izbriši"</string>
@@ -1096,31 +1118,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Provjerite ima li ažuriranja"</string>
<string name="smv_application" msgid="3307209192155442829">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) prekršila je vlastita StrictMode pravila."</string>
<string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> prekršio je vlastita StrictMode pravila."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Nadogradnja sistema Android u toku..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android se pokreće..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Ažuriranje telefona…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Ažuriranje tableta…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Ažuriranje uređaja…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Pokretanje telefona…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Pokretanje tableta…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Pokretanje uređaja…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimiziranje pohrane."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dovršava se ažuriranje Androida…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Neke aplikacije možda neće raditi ispravno dok traje nadogradnja"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Dovršavanje ažuriranja sistema…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> se nadograđuje…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiziranje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Pripremanje aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Pokretanje pri kraju."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Pokrenuta je aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Dodirnite za povratak u igru"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Odaberite igru"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Radi boljih performansi, moguće je otvoriti samo po jednu od ovih igara."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Vrati se nazad u aplikaciju <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Otvori aplikaciju <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"Aplikacija <xliff:g id="OLD_APP">%1$s</xliff:g> će se zatvoriti bez pohranjivanja"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> premašuje ograničenje memorije"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Snimak dinamičkog stanja memorije je napravljen; dodirnite da biste dijelili"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Želite li dijeliti snimak dinamičkog dijela memorije?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> je premašio ograničenje procesne memorije od <xliff:g id="SIZE">%2$s</xliff:g>. Snimak dinamičkog dijela memorije vam je dostupan i možete ga dijeliti sa njegovim programerom. Budite oprezni: ovaj snimak dinamičkog dijela memorije može sadržavati vaše lične podatke kojima aplikacija ima pristup."</string>
<string name="sendText" msgid="5209874571959469142">"Biranje akcije za tekst"</string>
@@ -1157,12 +1177,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Povežite se na otvorenu Wi‑Fi mrežu"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Povežite se na Wi‑Fi mrežu mobilnog operatera"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Povezivanje na otvorenu Wi‑Fi mrežu"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezani ste na Wi‑Fi mrežu"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nije se moguće povezati na Wi‑Fi mrežu"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da vidite sve mreže"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Povežite se"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Sve mreže"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi veza će se automatski uključiti"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kada ste u blizini sačuvane mreže visokog kvaliteta"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Nemoj ponovo uključiti"</string>
@@ -1228,6 +1249,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Ponovo pokreni"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivirajte uslugu mobilne mreže"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Preuzmite aplikaciju operatera da aktivirate novi SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Preuzmite aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> da aktivirate novi SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Preuzmite aplikaciju"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nova SIM kartica je umetnuta"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Dodirnite da biste postavili"</string>
@@ -1246,13 +1268,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Uključen je način rada PTP putem USB-a"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Uključen je način rada Povezivanje mobitela putem USB-a"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Uključen je način rada MIDI putem USB-a"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Uključen je način rada USB periferni uređaj"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Povezan je USB periferni uređaj"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Dodirnite za više opcija."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Punjenje povezanog uređaja. Dodirnite za više opcija."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Otkriven je analogni periferni uređaj"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da saznate više."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Otklanjanje grešaka putem uređaja spojenog na USB je uspostavljeno"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Dodirnite da onemogućite otklanjanje grešaka putem uređaja spojenog na USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Dodirnite da isključite otklanjanje grešaka putem USB-a"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Odaberite da onemogućite ispravljanje grešaka koristeći USB"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Prijem izvještaja o grešci..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Podijeliti izvještaj o grešci?"</string>
@@ -1271,7 +1293,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prekriva ostale aplikacije"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prekriva druge apl."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da otvorite postavke i isključite je."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Isključi"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Priprema se <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Provjera grešaka"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novi uređaj <xliff:g id="NAME">%s</xliff:g> je otkriven"</string>
@@ -1357,14 +1379,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezivanje na uvijek aktivni VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Povezan na uvijek aktivni VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Prekinuta je veza s uvijek uključenim VPN-om"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Greška u povezivanju na uvijek aktivni VPN"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Promijenite postavke mreže ili VPN-a"</string>
<string name="upload_file" msgid="2897957172366730416">"Odabir fajla"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nije izabran nijedan fajl"</string>
<string name="reset" msgid="2448168080964209908">"Vraćanje na zadano"</string>
<string name="submit" msgid="1602335572089911941">"Potvrdi"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Način rada u autu omogućen"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Dodirnite za izlaz iz načina rada u automobilu"</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Uređaj dijeli vezu ili djeluje kao pristupna tačka"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite za postavke"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Povezivanje putem mobitela je onemogućeno"</string>
@@ -1443,22 +1468,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB disk"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB pohrana"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Uredi"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Upozorenje o prijenosu podataka"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Dodirnite za prikaz potrošnje i postavki."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Dostignut limit za 2G-3G podatke"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Dostignut limit za 4G podatke"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Upozorenje o potrošnji podataka"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Potrošili ste <xliff:g id="APP">%s</xliff:g> podataka"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Dostignuto ograničenje za prijenos podataka"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Dostignut limit Wi-Fi podataka"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Prijenos podataka je pauziran za ostatak ciklusa"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Premašeni 2G-3G podaci"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Premašeni 4G podaci"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Prekoračeno je ograničenje za podatke na mobilnom uređaju"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Premašeno Wi-Fi ograničenje"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> preko navedenog ograničenja."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Prijenos podataka je pauziran do kraja ciklusa"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Pređen limit mobilnih podataka"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Prekoračen limit Wi-Fi podataka"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Prekoračili ste postavljeni limit od <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Pozadinski podaci su ograničeni"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Dodirnite da biste uklonili ograničenja."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Velik prijenos podataka"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Prijenos podataka tokom prethodnih nekoliko dana je bio veći nego inače. Dodirnite za prikaz potrošnje i postavki."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Velika potrošnja mobil. podataka"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Vaše aplikacije su potrošile više podataka nego obično"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Aplikacija <xliff:g id="APP">%s</xliff:g> je potrošila više podataka nego obično"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Sigurnosni certifikat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ovaj certifikat je važeći."</string>
<string name="issued_to" msgid="454239480274921032">"Primalac:"</string>
@@ -1696,7 +1718,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao je vaš administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao je vaš administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao je vaš administrator"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Za produženje trajanja baterije, Ušteda baterije svodi rad uređaja na najmanju moguću mjeru i ograničava vibriranje, usluge lokacije i većinu prijenosa podataka u pozadini. Aplikacije za e-poštu, razmjenu poruka i druge aplikacije koje se oslanjaju na sinhronizaciju ne mogu se ažurirati dok ih ne otvorite.\n\nUšteda baterije se automatski isključuje prilikom punjenja uređaja."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Da bi se produljilo trajanje baterije, Štednja baterije smanjuje rad uređaja i ograničava ili isključuje vibraciju, usluge lokacije i pozadinske podatke. Aplikacije za e-poštu, slanje poruka i druge aplikacije koje se oslanjaju na sinkronizaciju možda se neće ažurirati ako ih ne otvorite.\n\nŠtednja baterije isključuje se automatski dok se uređaj puni."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjio prijenos podataka, usluga Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali se to može desiti rjeđe. To može značiti, naprimjer, da se slike ne prikazuju sve dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
@@ -1710,10 +1732,10 @@
<item quantity="few">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">%1$d sat (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d sata (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d sati (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">Za %1$d sat (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="few">Za %1$d sata (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Za %1$d sati (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">%1$d sat (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1730,10 +1752,10 @@
<item quantity="few">%d min</item>
<item quantity="other">%d min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">%d sat</item>
- <item quantity="few">%d sata</item>
- <item quantity="other">%d sati</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">Za %d sat</item>
+ <item quantity="few">Za %d sata</item>
+ <item quantity="other">Za %d sati</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">%d sat</item>
@@ -1747,7 +1769,7 @@
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Skupi"</string>
<string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne ometaj"</string>
- <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Odmor"</string>
+ <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Prestanak rada"</string>
<string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"Radni dan uvečer"</string>
<string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"Vikend"</string>
<string name="zen_mode_default_events_name" msgid="8158334939013085363">"Događaj"</string>
@@ -1755,14 +1777,14 @@
<string name="muted_by" msgid="6147073845094180001">"Ton isključila aplikacija <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Postoji problem u vašem uređaju i može biti nestabilan dok ga ne vratite na fabričke postavke."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Postoji problem u vašem uređaju. Za više informacija obratite se proizvođaču."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD zahtjev je izmijenjen u DIAL zahtjev."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD zahtjev je izmijenjen u SS zahtjev."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD zahtjev je izmijenjen u novi USSD zahtjev."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD zahtjev je izmijenjen u Video DIAL zahtjev."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS zahtjev je izmijenjen u DIAL zahtjev."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS zahtjev je izmijenjen u Video DIAL zahtjev."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS zahtjev je izmijenjen u USSD zahtjev."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS zahtjev je izmijenjen u novi SS zahtjev."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD zahtjev promijenjen je u običan poziv"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD zahtjev promijenjen je u SS zahtjev"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Promijenjeno u novi USSD zahtjev"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD zahtjev promijenjen je u videopoziv"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS zahtjev promijenjen je u običan poziv"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS zahtjev promijenjen je u videopoziv"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS zahtjev promijenjen je u USSD zahtjev"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Promijenjeno u novi SS zahtjev"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil za posao"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Proširi"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skupi"</string>
@@ -1874,7 +1896,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Otkrivena je štetna aplikacija"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Uredi"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Pozivi i obavještenja će vibrirati"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Pozivi i obavještenja će se isključiti"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemske promjene"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne ometaj"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Način rada Ne ometaj sakriva obavještenja da se lakše fokusirate"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ovo je novo ponašanje. Dodirnite da promijenite."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Način rada Ne ometaj je promijenjen"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Dodirnite da provjerite ima li ometanja u postavkama ponašanja"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dodirnite da provjerite šta je blokirano."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index e5f208d4a91f..132cffda605e 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"El valor predeterminat de l\'identificador de trucada és no restringit. Trucada següent: no restringit"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"No s\'ha proveït el servei."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"No pots canviar la configuració de l\'identificador de trucada."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"No hi ha servei de dades"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"No es poden fer trucades d\'emergència"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"No hi ha servei de dades mòbils"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Les trucades d\'emergència no estan disponibles"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sense servei de veu"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sense servei de veu/emergència"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"La xarxa mòbil de la teva ubicació temporalment no ofereix aquest servei"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No es pot accedir a la xarxa"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Per millorar la recepció, prova de canviar el tipus de xarxa a Configuració &gt; Xarxa i Internet &gt; Xarxes mòbils &gt; Tipus de xarxa preferit."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"La funció Trucades per Wi Fi està activada"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Per poder fer trucades d\'emergència, cal tenir connexió a una xarxa mòbil."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hi ha servei de veu ni trucades d\'emergència"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"L\'operador de telefonia mòbil ho ha desactivat temporalment"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No es pot accedir a la xarxa mòbil"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prova de canviar de xarxa preferida. Toca per canviar-la."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Les trucades d\'emergència no estan disponibles"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"No es poden fer trucades d\'emergència per Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desviació de trucades"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de devolució de trucada d\'emergència"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Bàner d\'itinerància activat"</string>
<string name="roamingText12" msgid="1189071119992726320">"Bàner d\'itinerància desactivat"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"S\'està cercant el servei"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Trucades per Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Per fer trucades i enviar missatges per Wi-Fi, primer has de demanar a l\'operador de telefonia mòbil que configuri aquest servei. Després, torna a activar les trucades per Wi-Fi a Configuració. (Codi d\'error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registra\'t amb el teu operador de telefonia mòbil (codi d\'error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Trucada de Wi-Fi de: %s"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"S\'estan processant massa sol·licituds. Torneu-ho a provar més tard."</string>
<string name="notification_title" msgid="8967710025036163822">"Error d\'inici de sessió per a <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronització"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronització"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Massa supressions de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"L\'emmagatzematge de la tauleta és ple. Suprimeix uns quants fitxers per alliberar espai."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"L\'emmagatzematge del rellotge està ple. Suprimeix uns quants fitxers per alliberar espai."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"L\'emmagatzematge del televisor està ple. Suprimeix uns quants fitxers per alliberar espai."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Per l\'administrador del teu perfil professional"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Per <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"S\'ha suprimit el perfil professional"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"S\'ha suprimit el perfil professional perquè falta l\'aplicació d\'administració"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Falta l\'aplicació d\'administració del perfil professional o està malmesa. Com a conseqüència, s\'han suprimit el teu perfil professional i les dades relacionades. Contacta amb l\'administrador per obtenir ajuda."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"El teu perfil professional ja no està disponible en aquest dispositiu"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Has intentat introduir la contrasenya massa vegades"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"El dispositiu està gestionat"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"La teva organització gestiona aquest dispositiu i és possible que supervisi el trànsit de xarxa. Toca per obtenir més informació."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"El contingut del dispositiu s\'esborrarà"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"No es pot utilitzar l\'aplicació d\'administració. S\'esborraran les dades del dispositiu.\n\nSi tens cap dubte, contacta amb l\'administrador de la teva organització."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"No es pot utilitzar l\'aplicació d\'administració. S\'esborraran les dades del dispositiu.\n\nSi tens cap dubte, contacta amb l\'administrador de la teva organització."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> ha desactivat la impressió."</string>
<string name="me" msgid="6545696007631404292">"Mi"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opcions de la tauleta"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode d\'avió"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode d\'avió activat"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode d\'avió desactivat"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Estalvi de bateria"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"La funció Estalvi de bateria està desactivada"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"La funció Estalvi de bateria està activada"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Configuració"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistència"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. per veu"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Canvia al perfil professional"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactes"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accedir als contactes"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permet que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi als contactes"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicació"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accedir a la ubicació del dispositiu"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Permet que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a la ubicació del dispositiu"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendari"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accedir al calendari"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Permet que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi al calendari"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar i llegir missatges SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Permet que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; enviï i llegeixi missatges SMS"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Emmagatzematge"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accedir a fotos, contingut multimèdia i fitxers del dispositiu"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Permet que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a les fotos, al contingut multimèdia i als fitxers del dispositiu"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micròfon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"gravar àudio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Permet que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; enregistri àudio"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Càmera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fer fotos i vídeos"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Permet que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; faci fotos i vídeos"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telèfon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"fer i gestionar trucades telefòniques"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Permet que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; faci trucades i les gestioni"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensors corporals"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedir a les dades del sensor sobre els signes vitals"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Permet que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a les dades del sensor de constants vitals"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contingut de la finestra"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contingut d\'una finestra amb què estàs interaccionant."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar Exploració tàctil"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Utilitza gestos"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Permet tocar, lliscar, pinçar i fer altres gestos."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestos al sensor d\'empremtes digitals"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Captura gestos realitzats en el sensor d\'empremtes digitals del dispositiu."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Captura gestos realitzats en el sensor d\'empremtes digitals del dispositiu."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desactivar o modificar la barra d\'estat"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permet que l\'aplicació desactivi la barra d\'estat o afegeixi i elimini icones del sistema."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"aparèixer a la barra d\'estat"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permet que l\'aplicació faci que parts de la seva memòria siguin persistents. Aquesta acció pot limitar la memòria disponible per a altres aplicacions i alentir la tauleta."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permet que l\'aplicació faci que parts de la seva memòria siguin persistents. Aquesta acció pot limitar la memòria disponible per a altres aplicacions i alentir el televisor."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permet que l\'aplicació faci que parts de la seva memòria siguin persistents. Aquesta acció pot limitar la memòria disponible per a altres aplicacions i alentir el telèfon."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"executar serveis en primer pla"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Permet que l\'aplicació utilitzi serveis en primer pla."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"mesura l\'espai d\'emmagatzematge d\'aplicacions"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permet que l\'aplicació recuperi les mides del codi, de les dades i de la memòria cau"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modificar la configuració del sistema"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueig mitjançant patró"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueig facial"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueig mitjançant PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Desbloqueja la SIM amb el PIN."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Desbloqueja la SIM amb el PUK."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueig mitjançant contrasenya"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Àrea de patró"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Àrea per lliscar"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text copiat al Porta-retalls."</string>
<string name="more_item_label" msgid="4650918923083320495">"Més"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menú+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Maj+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funció+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espai"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"retorn"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"elimina"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Cerca actualitzacions"</string>
<string name="smv_application" msgid="3307209192155442829">"L\'aplicació <xliff:g id="APPLICATION">%1$s</xliff:g>(procés <xliff:g id="PROCESS">%2$s</xliff:g>) ha incomplert la seva política autoimposada de mode estricte."</string>
<string name="smv_process" msgid="5120397012047462446">"El procés <xliff:g id="PROCESS">%1$s</xliff:g> ha incomplert la seva política de mode estricte."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android s\'està actualitzant..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"S\'està iniciant Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"El telèfon s\'està actualitzant…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"La tauleta s\'està actualitzant…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"El dispositiu s\'està actualitzant…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"S\'està iniciant el telèfon…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"S\'està iniciant la tauleta…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"S\'està iniciant el dispositiu…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"S\'està optimitzant l\'emmagatzematge."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"S\'està acabant d\'actualitzar Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Pot ser que algunes aplicacions no funcionin correctament fins que no es completi l\'actualització"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Completant l\'actualització del sistema…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"S\'està actualitzant <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"S\'està optimitzant l\'aplicació <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"S\'està preparant <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"S\'estan iniciant les aplicacions."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"S\'està finalitzant l\'actualització."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> s\'està executant"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Toca per tornar al joc"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Tria el joc"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Per obtenir un millor rendiment, només hi pot haver un d\'aquests jocs obert."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Torna a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Obre <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> es tancarà sense desar els canvis"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superat el límit de memòria"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"S\'ha recopilat un procés \"heap dump\"; toca per compartir-lo"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Vols compartir el \"heap dump\"?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"El procés <xliff:g id="PROC">%1$s</xliff:g> ha superat el límit de <xliff:g id="SIZE">%2$s</xliff:g> de memòria del procés. Hi ha un procés \"heap dump\" disponible perquè el comparteixis amb el desenvolupador. Ves amb compte: aquest \"heap dump\" pot contenir les dades personals a les quals l\'aplicació tingui accés."</string>
<string name="sendText" msgid="5209874571959469142">"Tria una acció per al text"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connecta\'t a una xarxa Wi-Fi oberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connecta\'t a la xarxa Wi-Fi de l\'operador de telefonia mòbil"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"S\'està connectant a una xarxa Wi-Fi oberta"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"S\'ha connectat a la xarxa Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No s\'ha pogut connectar a una xarxa Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca per veure totes les xarxes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connecta"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Totes les xarxes"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Totes les xarxes"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"La Wi-Fi s\'activarà automàticament"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quan siguis a prop d\'una xarxa de qualitat desada"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"No tornis a activar"</string>
@@ -1204,6 +1225,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Reinicia"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activa el servei mòbil"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Baixa l\'aplicació de l\'operador de telefonia mòbil per activar la targeta SIM nova"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Baixa l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> per activar la targeta SIM nova"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Baixa l\'aplicació"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"S\'ha inserit una SIM nova"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Toca per configurar-la"</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"S\'ha activat el mode PTP per USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"S\'ha activat la compartició de xarxa per USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"S\'ha activat el mode MIDI per USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"S\'ha activat el mode d\'accessori USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"S\'ha connectat un accessori USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toca per veure més opcions."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"S\'està carregant el dispositiu connectat. Toca per veure més opcions."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"S\'ha detectat un accessori d\'àudio analògic"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"El dispositiu connectat no és compatible amb aquest telèfon. Toca per obtenir més informació."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuració USB activada"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Toca per desactivar la depuració USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Toca per desactivar la depuració per USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecciona per desactivar la depuració USB"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"S\'està creant l\'informe d\'errors…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vols compartir l\'informe d\'errors?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"S\'està superposant <xliff:g id="NAME">%s</xliff:g> a altres aplicacions"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> s\'està superposant a altres apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVA"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactiva"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"S\'està preparant <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"S\'està comprovant si hi ha errors"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"S\'ha detectat <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"T\'estàs connectant a la VPN sempre activada…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Estàs connectat a la VPN sempre activada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"S\'ha desconnectat de la VPN sempre activada"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Error de la VPN sempre activada"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Canvia la configuració de la xarxa o de la VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Tria un fitxer"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"No s\'ha escollit cap fitxer"</string>
<string name="reset" msgid="2448168080964209908">"Restableix"</string>
<string name="submit" msgid="1602335572089911941">"Envia"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mode de cotxe activat"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toca per sortir del mode de cotxe."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Compartició de xarxa o punt d\'accés Wi-Fi activat"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toca per configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"La compartició de xarxa està desactivada"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Unitat USB de: <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Emmagatzematge USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edita"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alerta d\'ús de dades"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Toca per veure l\'ús i la configuració."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Límit de dades 2G-3G assolit"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Límit de dades 4G assolit"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Advertiment de dades"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Has utilitzat <xliff:g id="APP">%s</xliff:g> de dades"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Límit de dades mòbils assolit"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Límit de dades Wi-Fi assolit"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Dades resta del cicle aturades"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"S\'ha superat el límit de dades 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"S\'ha superat el límit de dades 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"S\'ha superat el límit de dades mòbils"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"S\'ha superat el límit de dades Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> per sobre del límit especif."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Les dades s\'han posat en pausa per a la resta del cicle"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Límit de dades mòbils superat"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Límit de dades Wi-Fi superat"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"T\'has passat <xliff:g id="SIZE">%s</xliff:g> del límit establert"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Dades en segon pla restringides"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Toca per suprimir la restricció."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Ús de dades excessiu"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"L\'ús de dades dels últims dies és superior a l\'habitual. Toca per veure\'n l\'ús i la configuració."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Ús de dades mòbils elevat"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Les teves aplicacions han utilitzat més dades del que és habitual"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ha utilitzat més dades del que és habitual"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificat de seguretat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Aquest certificat és vàlid."</string>
<string name="issued_to" msgid="454239480274921032">"Emès per a:"</string>
@@ -1669,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instal·lat per l\'administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualitzat per l\'administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Suprimit per l\'administrador"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Per tal d\'augmentar la durada de la bateria, la funció Estalvi de bateria redueix el rendiment del dispositiu i en limita la vibració, els serveis d\'ubicació i la majoria de dades en segon pla. És possible que el correu electrònic, la missatgeria i la resta d\'aplicacions que se sincronitzen amb freqüència no s\'actualitzin llevat que les obris.\n\nLa funció Estalvi de bateria es desactiva automàticament mentre el dispositiu s\'està carregant."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a dades, però potser ho farà menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activar Economitzador de dades?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activa"</string>
@@ -1681,9 +1704,9 @@
<item quantity="other">Durant %1$d min (fins a: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Durant 1 min (fins a: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">Durant %1$d hores (fins a les <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durant 1 hora (fins a les <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">Durant %1$d hores (fins a les <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Durant 1 hora (fins a les <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Durant %1$d h (fins a: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1720,9 @@
<item quantity="other">Durant %d min</item>
<item quantity="one">Durant 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">Durant %d hores</item>
- <item quantity="one">Durant 1 hora</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">Durant %d hores</item>
+ <item quantity="one">Durant 1 hora</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Durant %d h</item>
@@ -1720,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"Silenciat per <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"S\'ha produït un error intern al dispositiu i és possible que funcioni de manera inestable fins que restableixis les dades de fàbrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"S\'ha produït un error intern al dispositiu. Contacta amb el fabricant del dispositiu per obtenir més informació."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"La sol·licitud USSD s\'ha transformat en una sol·licitud DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"La sol·licitud USSD s\'ha transformat en una sol·licitud SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"La sol·licitud USSD s\'ha transformat en una sol·licitud USSD nova."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"La sol·licitud USSD s\'ha transformat en una sol·licitud DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La sol·licitud SS s\'ha transformat en una sol·licitud DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"La sol·licitud SS s\'ha transformat en una sol·licitud DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La sol·licitud SS s\'ha transformat en una sol·licitud USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La sol·licitud SS s\'ha transformat en una sol·licitud SS nova."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil professional"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Desplega"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Replega"</string>
@@ -1837,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"S\'ha detectat una aplicació perjudicial"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vol mostrar porcions de l\'aplicació <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edita"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Les trucades i les notificacions vibraran"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Les trucades i les notificacions se silenciaran"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Canvis del sistema"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"No molestis"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"El mode No molestis amaga notificacions perquè no et desconcentris"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Aquest comportament és nou. Toca per canviar-lo."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"S\'ha canviat el mode No molestis"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toca per comprovar la configuració del comportament per a les interrupcions"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toca per consultar què s\'ha bloquejat."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index aab6858b7581..0a98f91edada 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Anrufer-ID ist standardmäßig nicht beschränkt. Nächster Anruf: Nicht beschränkt"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Dienst nicht eingerichtet."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Du kannst die Einstellung für die Anrufer-ID nicht ändern."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Kein Datendienst"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Keine Notrufe möglich"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Kein mobiler Datendienst"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Notrufe nicht möglich"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Keine Anrufe"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Keine Anrufe/Notrufe"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Derzeit nicht im Mobilfunknetz in deiner Region verfügbar"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Netzwerk nicht erreichbar"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Der Empfang lässt sich möglicherweise verbessern, indem du unter \"Einstellungen\" &gt; \"Netzwerk\"&amp; \"Internet\" &gt; \"Mobilfunknetze\" &gt; \"Bevorzugter Netzwerktyp\" einen anderen Typ auswählst."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"\"Anrufe über WLAN\" ist aktiv"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Für Notrufe ist ein Mobilfunknetz erforderlich."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Keine Anrufe oder Notrufe"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Vorübergehend von deinem Mobilfunkanbieter deaktiviert"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobilfunknetz nicht erreichbar"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Versuche, das bevorzugte Netzwerk zu ändern. Tippe, um ein anderes auszuwählen."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Notrufe nicht möglich"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Notrufe über WLAN nicht möglich"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Warnmeldungen"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Anrufweiterleitung"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Notfallrückrufmodus"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming-Banner ein"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming-Banner aus"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Suche nach Dienst"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Anrufe über WLAN"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Um über WLAN telefonieren und Nachrichten senden zu können, bitte zuerst deinen Mobilfunkanbieter, diesen Dienst einzurichten. Aktiviere die Option \"Anrufe über WLAN\" dann noch einmal über die Einstellungen. (Fehlercode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registriere dich bei deinem Mobilfunkanbieter (Fehlercode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Anrufe über WLAN"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Es werden zurzeit zu viele Anfragen verarbeitet. Versuche es später erneut."</string>
<string name="notification_title" msgid="8967710025036163822">"Fehler bei Anmeldung für <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchronisierung"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchronisierung"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Zu viele <xliff:g id="CONTENT_TYPE">%s</xliff:g> gelöscht."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Der Tablet-Speicher ist voll. Lösche Dateien, um Speicherplatz freizugeben."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Der Speicher deiner Uhr ist voll. Lösche Dateien, um Speicherplatz freizugeben."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Der TV-Speicher ist voll. Lösche Dateien, um Speicherplatz freizugeben."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Vom Administrator deines Arbeitsprofils"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Von <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Arbeitsprofil gelöscht"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Arbeitsprofil aufgrund fehlender Admin-App gelöscht"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Die Admin-App für das Arbeitsprofil fehlt oder ist beschädigt. Daher wurden dein Arbeitsprofil und alle zugehörigen Daten gelöscht. Bitte wende dich für weitere Hilfe an deinen Administrator."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Dein Arbeitsprofil ist auf diesem Gerät nicht mehr verfügbar"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Zu viele falsche Passworteingaben"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Dies ist ein verwaltetes Gerät"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Deine Organisation verwaltet dieses Gerät und überprüft unter Umständen den Netzwerkverkehr. Tippe hier, um weitere Informationen zu erhalten."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Die Daten auf deinem Gerät werden gelöscht."</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Die Admin-App kann nicht verwendet werden. Die Daten auf deinem Gerät werden nun gelöscht.\n\nBitte wende dich an den Administrator deiner Organisation."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Die Admin-App kann nicht verwendet werden. Die Daten auf deinem Gerät werden nun gelöscht.\n\nBitte wende dich bei Fragen an den Administrator deiner Organisation."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Drucken wurde von <xliff:g id="OWNER_APP">%s</xliff:g> deaktiviert."</string>
<string name="me" msgid="6545696007631404292">"Eigene"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tablet-Optionen"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flugmodus"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flugmodus ist AN."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flugmodus ist AUS."</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Energiesparmodus"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Energiesparmodus ist aus"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Energiesparmodus ist an"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Einstellungen"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistent"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Sprachassistent"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Zum Arbeitsprofil wechseln"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"auf deine Kontakte zugreifen"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; Zugriff auf deine Kontakte erlauben"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Standort"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"auf den Standort deines Geräts zugreifen"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, den Gerätestandort abzurufen"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"auf deinen Kalender zugreifen"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; Zugriff auf deinen Kalender erlauben"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS senden und abrufen"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, SMS zu senden und aufzurufen"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Speicher"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"auf Fotos, Medien und Dateien auf deinem Gerät zugreifen"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, auf Fotos, Medien und Dateien auf deinem Gerät zuzugreifen"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"Audio aufnehmen"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, Audioaufnahmen zu machen"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"Bilder und Videos aufnehmen"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, Bilder und Videos aufzunehmen"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"Telefonanrufe tätigen und verwalten"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, Anrufe zu machen und zu verwalten"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Körpersensoren"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"auf Sensordaten zu deinen Vitaldaten zugreifen"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, auf Sensordaten zu deinen Vitaldaten zuzugreifen"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Fensterinhalte abrufen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die Inhalte eines Fensters, mit dem du interagierst, werden abgerufen."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Tippen &amp; Entdecken\" aktivieren"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Bewegungen möglich"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Tippen, Wischen, Zusammenziehen und andere Bewegungen möglich."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Bewegungen auf dem Fingerabdrucksensor"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Erfasst Bewegungen auf dem Fingerabdrucksensor des Geräts."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Erfasst Bewegungen auf dem Fingerabdrucksensor des Geräts."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"Statusleiste deaktivieren oder ändern"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Ermöglicht der App, die Statusleiste zu deaktivieren oder Systemsymbole hinzuzufügen oder zu entfernen"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"Statusleiste darstellen"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ermöglicht der App, Teile der eigenen App dauerhaft im Speicher abzulegen. Dies kann dazu führen, dass anderen Apps weniger Arbeitsspeicher zur Verfügung steht und das Tablet langsamer wird."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Ermöglicht der App, Teile der eigenen App dauerhaft im Speicher abzulegen. Dies kann dazu führen, dass anderen Apps weniger Arbeitsspeicher zur Verfügung steht und der Fernseher langsamer wird."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Ermöglicht der App, Teile der eigenen App dauerhaft im Speicher abzulegen. Dies kann dazu führen, dass anderen Apps weniger Arbeitsspeicher zur Verfügung steht und das Telefon langsamer wird."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"Vordergrunddienst ausführen"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Ermöglicht der App, die Vordergrunddienste zu verwenden."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"Speicherplatz der App ermitteln"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Ermöglicht der App, ihre Code-, Daten- und Cache-Größe abzurufen"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"Systemeinstellungen ändern"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Entsperrung mit Muster"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face Unlock"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Entsperrung mit PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM durch PIN-Eingabe entsperren."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM durch PUK-Eingabe entsperren."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Entsperrung mit Passwort"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Bereich für Muster"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Bereich für Fingerbewegung"</string>
@@ -823,7 +839,7 @@
<string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Auf dieser Seite bleiben"</string>
<string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nMöchtest du diese Seite wirklich verlassen?"</string>
<string name="save_password_label" msgid="6860261758665825069">"Bestätigen"</string>
- <string name="double_tap_toast" msgid="4595046515400268881">"Tipp: Zum Vergrößern und Verkleinern zweimal tippen"</string>
+ <string name="double_tap_toast" msgid="4595046515400268881">"Tipp: Zum Vergrößern und Verkleinern doppeltippen"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"AutoFill"</string>
<string name="setup_autofill" msgid="7103495070180590814">"AutoFill konfig."</string>
<string name="autofill_window_title" msgid="921006636895825007">"AutoFill"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text in Zwischenablage kopiert."</string>
<string name="more_item_label" msgid="4650918923083320495">"Mehr"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menü+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta-Taste +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Strg +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Umschalttaste +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym-Taste +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funktionstaste +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"Leerzeichen"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"Enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"löschen"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Auf Updates überprüfen"</string>
<string name="smv_application" msgid="3307209192155442829">"Die App <xliff:g id="APPLICATION">%1$s</xliff:g> (Prozess <xliff:g id="PROCESS">%2$s</xliff:g>) hat gegen deine selbsterzwungene StrictMode-Richtlinie verstoßen."</string>
<string name="smv_process" msgid="5120397012047462446">"Der Prozess <xliff:g id="PROCESS">%1$s</xliff:g> hat gegen seine selbsterzwungene StrictMode-Richtlinie verstoßen."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android wird aktualisiert..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android wird gestartet…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Smartphone wird aktualisiert…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet wird aktualisiert…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Gerät wird aktualisiert…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Smartphone wird gestartet…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet wird gestartet…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Gerät wird gestartet…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Speicher wird optimiert"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-Update wird beendet…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Einige Apps funktionieren unter Umständen nicht richtig, bis das Upgrade abgeschlossen ist"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Systemupdate wird beendet…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Für <xliff:g id="APPLICATION">%1$s</xliff:g> wird gerade ein Upgrade ausgeführt…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> von <xliff:g id="NUMBER_1">%2$d</xliff:g> wird optimiert..."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> wird vorbereitet"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Apps werden gestartet..."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Start wird abgeschlossen..."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> läuft"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tippe, um zum Spiel zurückzukehren"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Spiel wählen"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Damit eine optimale Leistung erreicht wird, kann nur eines dieser Spiele auf einmal geöffnet sein."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Zurück zu <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> öffnen"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> wird ohne Speichern geschlossen"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Speicherlimit für \"<xliff:g id="PROC">%1$s</xliff:g>\" überschritten"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap-Dump wurde erfasst. Zum Teilen tippen"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Heap-Dump teilen?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Für den Prozess \"<xliff:g id="PROC">%1$s</xliff:g>\" wurde das Prozessspeicherlimit von <xliff:g id="SIZE">%2$s</xliff:g> überschritten. Es steht ein Heap-Dump zur Verfügung, den du mit dem Entwickler teilen kannst. Beachte jedoch unbedingt, dass der Heap-Dump personenbezogene Daten von dir enthalten kann, auf die die App zugreifen kann."</string>
<string name="sendText" msgid="5209874571959469142">"Aktion für Text auswählen"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Mit offenem WLAN verbinden"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Mit WLAN des Mobilfunkanbieters verbinden"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Verbindung mit offenem WLAN wird hergestellt"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Mit WLAN verbunden"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"WLAN-Verbindung konnte nicht hergestellt werden"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tippen, um alle Netzwerke zu sehen"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Verbinden"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alle Netzwerke"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle Netzwerke"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WLAN wird automatisch aktiviert"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Wenn du in der Nähe eines sicheren gespeicherten Netzwerks bist"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Nicht wieder aktivieren"</string>
@@ -1204,6 +1225,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Neu starten"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobilfunkdienst aktivieren"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Mobilfunkanbieter-App herunterladen, um meine neue SIM-Karte zu aktivieren"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"<xliff:g id="APP_NAME">%1$s</xliff:g> herunterladen, um deine neue SIM-Karte zu aktivieren"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"App herunterladen"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Neue SIM-Karte eingelegt"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Zum Einrichten tippen"</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP über USB aktiviert"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB-Tethering aktiviert"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI über USB aktiviert"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-Zubehörmodus aktiviert"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Mit USB-Zubehör verbunden"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Für weitere Optionen tippen."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Verbundenes Gerät wird aufgeladen. Für weitere Optionen tippen."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoges Audiozubehör erkannt"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Das angeschlossene Gerät ist nicht mit diesem Smartphone kompatibel. Für weitere Informationen tippen."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-Debugging aktiviert"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Zum Deaktivieren von USB-Debugging tippen"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Zum Deaktivieren von USB-Debugging tippen"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB-Debugging deaktivieren: auswählen"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Fehlerbericht wird abgerufen…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Fehlerbericht teilen?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps angezeigt"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps angezeigt"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEAKTIVIEREN"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Deaktivieren"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> wird vorbereitet"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Nach Fehlern wird gesucht"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Neue <xliff:g id="NAME">%s</xliff:g> entdeckt"</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Verbindung zu durchgehend aktivem VPN wird hergestellt…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Mit durchgehend aktivem VPN verbunden"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Verbindung mit dauerhaft aktivem VPN getrennt"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Durchgehend aktives VPN – Verbindungsfehler"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Netzwerk- oder VPN-Einstellungen ändern"</string>
<string name="upload_file" msgid="2897957172366730416">"Datei auswählen"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Keine ausgewählt"</string>
<string name="reset" msgid="2448168080964209908">"Zurücksetzen"</string>
<string name="submit" msgid="1602335572089911941">"Senden"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Automodus aktiviert"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Zum Beenden des Automodus tippen."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering oder Hotspot aktiv"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Zum Einrichten tippen."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering ist deaktiviert"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"USB-Speichergerät von <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-Speicher"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Bearbeiten"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Warnung zur Datennutzung"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Für Nutzung und Einstellungen tippen."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-/3G-Datenlimit erreicht"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G-Datenlimit erreicht"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Warnlimit für mobile Daten"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Du hast <xliff:g id="APP">%s</xliff:g> an Daten verbraucht"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Limit für mobile Daten erreicht"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"WLAN-Datenlimit erreicht"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Daten für restl. Zeitraum deakt."</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-/3G-Datenlimit überschritten"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G-Datenlimit überschritten"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobildatenlimit überschritten"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"WLAN-Datenlimit überschritten"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> über dem vorgegebenen Limit"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Datennutzung für den Rest des Zyklus pausiert"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Über deinem mobilen Datenlimit"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Über deinem WLAN-Datenlimit"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Du liegst <xliff:g id="SIZE">%s</xliff:g> über deinem festgelegten Limit"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Hintergrunddaten beschränkt"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Zum Entfernen der Beschränkung tippen."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Hohe Datennutzung"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Du hast in den letzten Tagen mehr Daten verbraucht als üblich. Tippe, um deine Datennutzung und deine Einstellungen anzuzeigen."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Hohe mobile Datennutzung"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Deine Apps haben mehr Daten als üblich verbraucht"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> hat mehr Daten als üblich verbraucht"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Sicherheitszertifikat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Dies ist ein gültiges Zertifikat."</string>
<string name="issued_to" msgid="454239480274921032">"Ausgestellt für:"</string>
@@ -1669,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Von deinem Administrator installiert"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Von deinem Administrator aktualisiert"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Von deinem Administrator gelöscht"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Der Energiesparmodus schont den Akku, indem er die Leistung des Geräts reduziert und die Vibrationsfunktion, Standortdienste sowie die meisten Hintergrunddatenaktivitäten einschränkt. E-Mail, Messaging und andere Apps, die auf deinem Gerät synchronisiert werden, werden möglicherweise nur aktualisiert, wenn du sie öffnest.\n\nDer Energiesparmodus wird automatisch deaktiviert, wenn dein Gerät aufgeladen wird."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Mit dem Datensparmodus wird die Datennutzung verringert, indem verhindert wird, dass im Hintergrund Daten von Apps gesendet oder empfangen werden. Datenzugriffe sind mit einer aktiven App zwar möglich, erfolgen aber seltener. Als Folge davon könnten Bilder beispielsweise erst dann sichtbar werden, wenn sie angetippt werden."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Datensparmodus aktivieren?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktivieren"</string>
@@ -1681,7 +1704,7 @@
<item quantity="other">Für %1$d min (bis <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Für 1 min (bis <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d Stunden (bis <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">1 Stunde (bis <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
@@ -1697,9 +1720,9 @@
<item quantity="other">Für %d min</item>
<item quantity="one">Für 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">Für %d Stunden</item>
- <item quantity="one">Für eine Stunde</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d Stunden</item>
+ <item quantity="one">1 Stunde</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Für %d h</item>
@@ -1720,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"Stummgeschaltet durch <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Es liegt ein internes Problem mit deinem Gerät vor. Möglicherweise verhält es sich instabil, bis du es auf die Werkseinstellungen zurücksetzt."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Es liegt ein internes Problem mit deinem Gerät vor. Bitte wende dich diesbezüglich an den Hersteller."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-Anfrage wird in DIAL-Anfrage geändert."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-Anfrage wird in SS-Anfrage geändert."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-Anfrage wird in neue USSD-Anfrage geändert."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-Anfrage wird in Video-DIAL-Anfrage geändert."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-Anfrage wird in DIAL-Anfrage geändert."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-Anfrage wird in Video-DIAL-Anfrage geändert."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-Anfrage wird in USSD-Anfrage geändert."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-Anfrage wird in neue SS-Anfrage geändert."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Arbeitsprofil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Maximieren"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Minimieren"</string>
@@ -1837,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Schädliche App erkannt"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> möchte Teile von <xliff:g id="APP_2">%2$s</xliff:g> anzeigen"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Bearbeiten"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Anrufe und Benachrichtigungen per Vibrationsalarm"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Anrufe und Benachrichtigungen stummgeschaltet"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemänderungen"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Bitte nicht stören"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Mit \"Bitte nicht stören\" werden Benachrichtigungen ausgeblendet, damit du dich besser konzentrieren kannst"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Das ist ein neues Verhalten. Tippe, um die Einstellung zu ändern."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Bitte nicht stören\" wurde geändert"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tippen, um Einstellungen für den Modus \"Bitte nicht stören\" zu überprüfen"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tippe, um zu überprüfen, welche Inhalte blockiert werden."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 0fddeac779f1..14bc01664639 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Caller ID defaults to not restricted. Next call: Not restricted"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Service not provisioned."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"You can\'t change the caller ID setting."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"No data service"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"No emergency calling"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"No mobile data service"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Emergency calling unavailable"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"No voice service"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"To improve reception, try changing the type selected at Settings &gt; Network &amp; Internet &gt; Mobile networks &gt; Preferred network type."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi calling is active"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Emergency calls require a mobile network."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No voice service or emergency calling"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Temporarily turned off by your operator"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Can’t reach mobile network"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Try changing preferred network. Tap to change."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Emergency calling unavailable"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Can’t make emergency calls over Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner On"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Calling"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Register with your operator (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Calling"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Too many requests are being processed. Try again later."</string>
<string name="notification_title" msgid="8967710025036163822">"Sign-in error for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sync"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sync"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Too many <xliff:g id="CONTENT_TYPE">%s</xliff:g> deletions."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Can\'t sync"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Attempted to delete too many <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet storage is full. Delete some files to free space."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Watch storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV storage is full. Delete some files to free space."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"By your work profile admin"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Work profile deleted"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Work profile deleted due to missing admin app"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"The work profile admin app is either missing or corrupted. As a result, your work profile and related data have been deleted. Contact your admin for assistance."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Your work profile is no longer available on this device"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Too many password attempts"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Device is managed"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Your organisation manages this device and may monitor network traffic. Tap for details."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Your device will be erased"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Printing disabled by <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Me"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tablet options"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Aeroplane mode"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver is OFF"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver is ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Switch to work profile"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"access your contacts"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your contacts"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your contacts?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"send and view SMS messages"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to send and view SMS messages"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to send and view SMS messages?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Storage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"access photos, media and files on your device"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access photos, media and files on your device"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access photos, media and files on your device?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"record audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to record audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to record audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"take pictures and record video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to take pictures and record video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to take pictures and record video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the phone."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"run foreground service"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Allows the app to make use of foreground services."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"measure app storage space"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Allows the app to retrieve its code, data and cache sizes"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modify system settings"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM PIN unlock."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM PUK unlock."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slide area."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text copied to clipboard."</string>
<string name="more_item_label" msgid="4650918923083320495">"More"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Check for update"</string>
<string name="smv_application" msgid="3307209192155442829">"The app <xliff:g id="APPLICATION">%1$s</xliff:g> (process <xliff:g id="PROCESS">%2$s</xliff:g>) has violated its self-enforced Strict Mode policy."</string>
<string name="smv_process" msgid="5120397012047462446">"The process <xliff:g id="PROCESS">%1$s</xliff:g> has violated its self-enforced StrictMode policy."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android is upgrading…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android is starting…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Phone is updating…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet is updating…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Device is updating…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Phone is starting…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet is starting…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Device is starting…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimising storage."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finishing Android update…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Some apps may not work properly until the upgrade finishes"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Finishing system update…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> is upgrading…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimising app <xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Preparing <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tap to return to game"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Choose game"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"For better performance, only one of these games can be open at a time."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Go back to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump collected. Tap to share."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"The process <xliff:g id="PROC">%1$s</xliff:g> has exceeded its process memory limit of <xliff:g id="SIZE">%2$s</xliff:g>. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to."</string>
<string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"All Networks"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"When you\'re near a high‑quality saved network"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Don\'t turn back on"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activate mobile service"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download the mobile app to activate your new SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Download the <xliff:g id="APP_NAME">%1$s</xliff:g> app to activate your new SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"New SIM inserted"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap to set it up"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB turned on"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering turned on"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB turned on"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB accessory mode turned on"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB accessory connected"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Charging connected device. Tap for more options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tap to disable USB debugging."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Taking bug report…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Share bug report?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Turn off"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN connecting…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN connected"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Disconnected from always-on VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Always-on VPN error"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Couldn\'t connect to always-on VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Change network or VPN settings"</string>
<string name="upload_file" msgid="2897957172366730416">"Choose file"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"No file chosen"</string>
<string name="reset" msgid="2448168080964209908">"Reset"</string>
<string name="submit" msgid="1602335572089911941">"Submit"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Car mode enabled"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tap to exit car mode."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Driving app is running"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tap to exit driving app."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Data usage alert"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Tap to view usage and settings."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G data limit reached"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G data limit reached"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Data warning"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"You\'ve used <xliff:g id="APP">%s</xliff:g> of data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobile data limit reached"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi data limit reached"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data paused for rest of cycle"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G data limit exceeded"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G data limit exceeded"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobile data limit exceeded"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi data limit exceeded"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> over specified limit."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data paused for the rest of your cycle"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Over your mobile data limit"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Over your Wi-Fi data limit"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"You\'ve gone <xliff:g id="SIZE">%s</xliff:g> over your set limit"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Background data restricted"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Tap to remove restriction."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Large data usage"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Your data usage over the last few days is larger than normal. Tap to view usage and settings."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"High mobile data usage"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Your apps have used more data than usual"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> has used more data than usual"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Security certificate"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"This certificate is valid."</string>
<string name="issued_to" msgid="454239480274921032">"Issued to:"</string>
@@ -1669,7 +1676,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"To help improve battery life, Battery Saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, Location Services and background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1681,9 +1688,9 @@
<item quantity="other">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">For 1 min (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For one hour (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">For 1 hour (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1704,9 @@
<item quantity="other">For %d min</item>
<item quantity="one">For 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">For %d hours</item>
- <item quantity="one">For one hour</item>
+ <item quantity="one">For 1 hour</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">For %d hr</item>
@@ -1720,14 +1727,14 @@
<string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD request is modified to DIAL request."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD request is modified to SS request."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD request is modified to new USSD request."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD request is modified to Video DIAL request."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS request is modified to DIAL request."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS request is modified to Video DIAL request."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS request is modified to USSD request."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS request is modified to new SS request."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD request changed to regular call"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD request changed to SS request"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Changed to new USSD request"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD request changed to video call"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS request changed to regular call"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS request changed to video call"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS request changed to USSD request"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Changed to new SS request"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profile"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expand"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Collapse"</string>
@@ -1837,7 +1844,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do Not Disturb"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Do Not Disturb is Hiding Notifications to help you Focus"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"This is new behaviour. Tap to change."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behaviour settings for interruptions"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap to check what\'s blocked."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Settings"</string>
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 0fddeac779f1..d04d10a53cdc 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Caller ID defaults to not restricted. Next call: Not restricted"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Service not provisioned."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"You can\'t change the caller ID setting."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"No data service"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"No emergency calling"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"No mobile data service"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Emergency calling unavailable"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"No voice service"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"To improve reception, try changing the type selected at Settings &gt; Network &amp; Internet &gt; Mobile networks &gt; Preferred network type."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi calling is active"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Emergency calls require a mobile network."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No voice service or emergency calling"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Temporarily turned off by your operator"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Can’t reach mobile network"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Try changing preferred network. Tap to change."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Emergency calling unavailable"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Can’t make emergency calls over Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner On"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Calling"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Register with your operator (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Calling"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Too many requests are being processed. Try again later."</string>
<string name="notification_title" msgid="8967710025036163822">"Sign-in error for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sync"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sync"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Too many <xliff:g id="CONTENT_TYPE">%s</xliff:g> deletions."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Can\'t sync"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Attempted to delete too many <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet storage is full. Delete some files to free space."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Watch storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV storage is full. Delete some files to free space."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"By your work profile admin"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Work profile deleted"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Work profile deleted due to missing admin app"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"The work profile admin app is either missing or corrupted. As a result, your work profile and related data have been deleted. Contact your admin for assistance."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Your work profile is no longer available on this device"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Too many password attempts"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Device is managed"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Your organisation manages this device and may monitor network traffic. Tap for details."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Your device will be erased"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Printing disabled by <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Me"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tablet options"</string>
@@ -233,9 +231,12 @@
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Silent mode"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sound is OFF"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sound is ON"</string>
- <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Aeroplane mode"</string>
- <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Airplane mode"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Airplane mode is ON"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Airplane mode is OFF"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver is OFF"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver is ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Switch to work profile"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"access your contacts"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your contacts"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your contacts?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"send and view SMS messages"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to send and view SMS messages"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to send and view SMS messages?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Storage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"access photos, media and files on your device"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access photos, media and files on your device"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access photos, media and files on your device?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"record audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to record audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to record audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"take pictures and record video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to take pictures and record video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to take pictures and record video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the phone."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"run foreground service"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Allows the app to make use of foreground services."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"measure app storage space"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Allows the app to retrieve its code, data and cache sizes"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modify system settings"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM PIN unlock."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM PUK unlock."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slide area."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text copied to clipboard."</string>
<string name="more_item_label" msgid="4650918923083320495">"More"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Check for update"</string>
<string name="smv_application" msgid="3307209192155442829">"The app <xliff:g id="APPLICATION">%1$s</xliff:g> (process <xliff:g id="PROCESS">%2$s</xliff:g>) has violated its self-enforced Strict Mode policy."</string>
<string name="smv_process" msgid="5120397012047462446">"The process <xliff:g id="PROCESS">%1$s</xliff:g> has violated its self-enforced StrictMode policy."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android is upgrading…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android is starting…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Phone is updating…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet is updating…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Device is updating…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Phone is starting…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet is starting…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Device is starting…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimising storage."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finishing Android update…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Some apps may not work properly until the upgrade finishes"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Finishing system update…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> is upgrading…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimising app <xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Preparing <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tap to return to game"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Choose game"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"For better performance, only one of these games can be open at a time."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Go back to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump collected. Tap to share."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"The process <xliff:g id="PROC">%1$s</xliff:g> has exceeded its process memory limit of <xliff:g id="SIZE">%2$s</xliff:g>. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to."</string>
<string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"All Networks"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"When you\'re near a high‑quality saved network"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Don\'t turn back on"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activate mobile service"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download the mobile app to activate your new SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Download the <xliff:g id="APP_NAME">%1$s</xliff:g> app to activate your new SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"New SIM inserted"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap to set it up"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB turned on"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering turned on"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB turned on"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB accessory mode turned on"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB accessory connected"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Charging connected device. Tap for more options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tap to disable USB debugging."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Taking bug report…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Share bug report?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Turn off"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN connecting…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN connected"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Disconnected from always-on VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Always-on VPN error"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Couldn\'t connect to always-on VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Change network or VPN settings"</string>
<string name="upload_file" msgid="2897957172366730416">"Choose file"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"No file chosen"</string>
<string name="reset" msgid="2448168080964209908">"Reset"</string>
<string name="submit" msgid="1602335572089911941">"Submit"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Car mode enabled"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tap to exit car mode."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Driving app is running"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tap to exit driving app."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Data usage alert"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Tap to view usage and settings."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G data limit reached"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G data limit reached"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Data warning"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"You\'ve used <xliff:g id="APP">%s</xliff:g> of data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobile data limit reached"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi data limit reached"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data paused for rest of cycle"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G data limit exceeded"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G data limit exceeded"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobile data limit exceeded"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi data limit exceeded"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> over specified limit."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data paused for the rest of your cycle"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Over your mobile data limit"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Over your Wi-Fi data limit"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"You\'ve gone <xliff:g id="SIZE">%s</xliff:g> over your set limit"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Background data restricted"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Tap to remove restriction."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Large data usage"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Your data usage over the last few days is larger than normal. Tap to view usage and settings."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"High mobile data usage"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Your apps have used more data than usual"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> has used more data than usual"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Security certificate"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"This certificate is valid."</string>
<string name="issued_to" msgid="454239480274921032">"Issued to:"</string>
@@ -1669,7 +1676,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"To help improve battery life, Battery Saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, Location Services and background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1681,9 +1688,9 @@
<item quantity="other">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">For 1 min (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For one hour (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">For 1 hour (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1704,9 @@
<item quantity="other">For %d min</item>
<item quantity="one">For 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">For %d hours</item>
- <item quantity="one">For one hour</item>
+ <item quantity="one">For 1 hour</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">For %d hr</item>
@@ -1720,14 +1727,14 @@
<string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD request is modified to DIAL request."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD request is modified to SS request."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD request is modified to new USSD request."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD request is modified to Video DIAL request."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS request is modified to DIAL request."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS request is modified to Video DIAL request."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS request is modified to USSD request."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS request is modified to new SS request."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD request changed to regular call"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD request changed to SS request"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Changed to new USSD request"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD request changed to video call"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS request changed to regular call"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS request changed to video call"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS request changed to USSD request"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Changed to new SS request"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profile"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expand"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Collapse"</string>
@@ -1837,7 +1844,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do Not Disturb"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Do Not Disturb is Hiding Notifications to help you Focus"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"This is new behaviour. Tap to change."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behaviour settings for interruptions"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap to check what\'s blocked."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Settings"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 0fddeac779f1..14bc01664639 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Caller ID defaults to not restricted. Next call: Not restricted"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Service not provisioned."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"You can\'t change the caller ID setting."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"No data service"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"No emergency calling"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"No mobile data service"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Emergency calling unavailable"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"No voice service"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"To improve reception, try changing the type selected at Settings &gt; Network &amp; Internet &gt; Mobile networks &gt; Preferred network type."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi calling is active"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Emergency calls require a mobile network."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No voice service or emergency calling"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Temporarily turned off by your operator"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Can’t reach mobile network"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Try changing preferred network. Tap to change."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Emergency calling unavailable"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Can’t make emergency calls over Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner On"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Calling"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Register with your operator (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Calling"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Too many requests are being processed. Try again later."</string>
<string name="notification_title" msgid="8967710025036163822">"Sign-in error for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sync"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sync"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Too many <xliff:g id="CONTENT_TYPE">%s</xliff:g> deletions."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Can\'t sync"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Attempted to delete too many <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet storage is full. Delete some files to free space."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Watch storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV storage is full. Delete some files to free space."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"By your work profile admin"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Work profile deleted"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Work profile deleted due to missing admin app"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"The work profile admin app is either missing or corrupted. As a result, your work profile and related data have been deleted. Contact your admin for assistance."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Your work profile is no longer available on this device"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Too many password attempts"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Device is managed"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Your organisation manages this device and may monitor network traffic. Tap for details."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Your device will be erased"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Printing disabled by <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Me"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tablet options"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Aeroplane mode"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver is OFF"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver is ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Switch to work profile"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"access your contacts"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your contacts"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your contacts?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"send and view SMS messages"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to send and view SMS messages"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to send and view SMS messages?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Storage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"access photos, media and files on your device"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access photos, media and files on your device"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access photos, media and files on your device?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"record audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to record audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to record audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"take pictures and record video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to take pictures and record video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to take pictures and record video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the phone."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"run foreground service"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Allows the app to make use of foreground services."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"measure app storage space"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Allows the app to retrieve its code, data and cache sizes"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modify system settings"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM PIN unlock."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM PUK unlock."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slide area."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text copied to clipboard."</string>
<string name="more_item_label" msgid="4650918923083320495">"More"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Check for update"</string>
<string name="smv_application" msgid="3307209192155442829">"The app <xliff:g id="APPLICATION">%1$s</xliff:g> (process <xliff:g id="PROCESS">%2$s</xliff:g>) has violated its self-enforced Strict Mode policy."</string>
<string name="smv_process" msgid="5120397012047462446">"The process <xliff:g id="PROCESS">%1$s</xliff:g> has violated its self-enforced StrictMode policy."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android is upgrading…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android is starting…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Phone is updating…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet is updating…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Device is updating…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Phone is starting…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet is starting…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Device is starting…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimising storage."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finishing Android update…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Some apps may not work properly until the upgrade finishes"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Finishing system update…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> is upgrading…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimising app <xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Preparing <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tap to return to game"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Choose game"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"For better performance, only one of these games can be open at a time."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Go back to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump collected. Tap to share."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"The process <xliff:g id="PROC">%1$s</xliff:g> has exceeded its process memory limit of <xliff:g id="SIZE">%2$s</xliff:g>. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to."</string>
<string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"All Networks"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"When you\'re near a high‑quality saved network"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Don\'t turn back on"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activate mobile service"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download the mobile app to activate your new SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Download the <xliff:g id="APP_NAME">%1$s</xliff:g> app to activate your new SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"New SIM inserted"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap to set it up"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB turned on"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering turned on"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB turned on"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB accessory mode turned on"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB accessory connected"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Charging connected device. Tap for more options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tap to disable USB debugging."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Taking bug report…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Share bug report?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Turn off"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN connecting…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN connected"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Disconnected from always-on VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Always-on VPN error"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Couldn\'t connect to always-on VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Change network or VPN settings"</string>
<string name="upload_file" msgid="2897957172366730416">"Choose file"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"No file chosen"</string>
<string name="reset" msgid="2448168080964209908">"Reset"</string>
<string name="submit" msgid="1602335572089911941">"Submit"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Car mode enabled"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tap to exit car mode."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Driving app is running"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tap to exit driving app."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Data usage alert"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Tap to view usage and settings."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G data limit reached"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G data limit reached"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Data warning"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"You\'ve used <xliff:g id="APP">%s</xliff:g> of data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobile data limit reached"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi data limit reached"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data paused for rest of cycle"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G data limit exceeded"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G data limit exceeded"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobile data limit exceeded"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi data limit exceeded"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> over specified limit."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data paused for the rest of your cycle"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Over your mobile data limit"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Over your Wi-Fi data limit"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"You\'ve gone <xliff:g id="SIZE">%s</xliff:g> over your set limit"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Background data restricted"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Tap to remove restriction."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Large data usage"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Your data usage over the last few days is larger than normal. Tap to view usage and settings."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"High mobile data usage"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Your apps have used more data than usual"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> has used more data than usual"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Security certificate"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"This certificate is valid."</string>
<string name="issued_to" msgid="454239480274921032">"Issued to:"</string>
@@ -1669,7 +1676,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"To help improve battery life, Battery Saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, Location Services and background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1681,9 +1688,9 @@
<item quantity="other">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">For 1 min (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For one hour (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">For 1 hour (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1704,9 @@
<item quantity="other">For %d min</item>
<item quantity="one">For 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">For %d hours</item>
- <item quantity="one">For one hour</item>
+ <item quantity="one">For 1 hour</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">For %d hr</item>
@@ -1720,14 +1727,14 @@
<string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD request is modified to DIAL request."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD request is modified to SS request."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD request is modified to new USSD request."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD request is modified to Video DIAL request."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS request is modified to DIAL request."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS request is modified to Video DIAL request."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS request is modified to USSD request."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS request is modified to new SS request."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD request changed to regular call"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD request changed to SS request"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Changed to new USSD request"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD request changed to video call"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS request changed to regular call"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS request changed to video call"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS request changed to USSD request"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Changed to new SS request"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profile"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expand"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Collapse"</string>
@@ -1837,7 +1844,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do Not Disturb"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Do Not Disturb is Hiding Notifications to help you Focus"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"This is new behaviour. Tap to change."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behaviour settings for interruptions"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap to check what\'s blocked."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Settings"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 0fddeac779f1..14bc01664639 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Caller ID defaults to not restricted. Next call: Not restricted"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Service not provisioned."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"You can\'t change the caller ID setting."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"No data service"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"No emergency calling"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"No mobile data service"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Emergency calling unavailable"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"No voice service"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"To improve reception, try changing the type selected at Settings &gt; Network &amp; Internet &gt; Mobile networks &gt; Preferred network type."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi calling is active"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Emergency calls require a mobile network."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No voice service or emergency calling"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Temporarily turned off by your operator"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Can’t reach mobile network"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Try changing preferred network. Tap to change."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Emergency calling unavailable"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Can’t make emergency calls over Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner On"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming Banner Off"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Calling"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Register with your operator (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Calling"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Too many requests are being processed. Try again later."</string>
<string name="notification_title" msgid="8967710025036163822">"Sign-in error for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sync"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sync"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Too many <xliff:g id="CONTENT_TYPE">%s</xliff:g> deletions."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Can\'t sync"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Attempted to delete too many <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet storage is full. Delete some files to free space."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Watch storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV storage is full. Delete some files to free space."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"By your work profile admin"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Work profile deleted"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Work profile deleted due to missing admin app"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"The work profile admin app is either missing or corrupted. As a result, your work profile and related data have been deleted. Contact your admin for assistance."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Your work profile is no longer available on this device"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Too many password attempts"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Device is managed"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Your organisation manages this device and may monitor network traffic. Tap for details."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Your device will be erased"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Printing disabled by <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Me"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tablet options"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Aeroplane mode"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver is OFF"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver is ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Switch to work profile"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"access your contacts"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your contacts"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your contacts?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"send and view SMS messages"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to send and view SMS messages"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to send and view SMS messages?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Storage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"access photos, media and files on your device"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access photos, media and files on your device"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access photos, media and files on your device?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"record audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to record audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to record audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"take pictures and record video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to take pictures and record video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to take pictures and record video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Allows the app to make parts of itself persistent in memory. This can limit the memory available to other apps, slowing down the phone."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"run foreground service"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Allows the app to make use of foreground services."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"measure app storage space"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Allows the app to retrieve its code, data and cache sizes"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modify system settings"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM PIN unlock."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM PUK unlock."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slide area."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text copied to clipboard."</string>
<string name="more_item_label" msgid="4650918923083320495">"More"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Check for update"</string>
<string name="smv_application" msgid="3307209192155442829">"The app <xliff:g id="APPLICATION">%1$s</xliff:g> (process <xliff:g id="PROCESS">%2$s</xliff:g>) has violated its self-enforced Strict Mode policy."</string>
<string name="smv_process" msgid="5120397012047462446">"The process <xliff:g id="PROCESS">%1$s</xliff:g> has violated its self-enforced StrictMode policy."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android is upgrading…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android is starting…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Phone is updating…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet is updating…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Device is updating…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Phone is starting…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet is starting…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Device is starting…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimising storage."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finishing Android update…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Some apps may not work properly until the upgrade finishes"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Finishing system update…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> is upgrading…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimising app <xliff:g id="NUMBER_0">%1$d</xliff:g> of <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Preparing <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tap to return to game"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Choose game"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"For better performance, only one of these games can be open at a time."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Go back to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Heap dump collected. Tap to share."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"The process <xliff:g id="PROC">%1$s</xliff:g> has exceeded its process memory limit of <xliff:g id="SIZE">%2$s</xliff:g>. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to."</string>
<string name="sendText" msgid="5209874571959469142">"Choose an action for text"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"All Networks"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"All networks"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi will turn on automatically"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"When you\'re near a high‑quality saved network"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Don\'t turn back on"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activate mobile service"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download the mobile app to activate your new SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Download the <xliff:g id="APP_NAME">%1$s</xliff:g> app to activate your new SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"New SIM inserted"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap to set it up"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB turned on"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering turned on"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB turned on"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB accessory mode turned on"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB accessory connected"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Charging connected device. Tap for more options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tap to disable USB debugging."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap to turn off USB debugging"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Select to disable USB debugging."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Taking bug report…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Share bug report?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Turn off"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN connecting…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN connected"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Disconnected from always-on VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Always-on VPN error"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Couldn\'t connect to always-on VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Change network or VPN settings"</string>
<string name="upload_file" msgid="2897957172366730416">"Choose file"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"No file chosen"</string>
<string name="reset" msgid="2448168080964209908">"Reset"</string>
<string name="submit" msgid="1602335572089911941">"Submit"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Car mode enabled"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tap to exit car mode."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Driving app is running"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tap to exit driving app."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering or hotspot active"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tap to set up."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is disabled"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB storage"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Data usage alert"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Tap to view usage and settings."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G data limit reached"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G data limit reached"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Data warning"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"You\'ve used <xliff:g id="APP">%s</xliff:g> of data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobile data limit reached"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi data limit reached"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data paused for rest of cycle"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G data limit exceeded"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G data limit exceeded"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobile data limit exceeded"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi data limit exceeded"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> over specified limit."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data paused for the rest of your cycle"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Over your mobile data limit"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Over your Wi-Fi data limit"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"You\'ve gone <xliff:g id="SIZE">%s</xliff:g> over your set limit"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Background data restricted"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Tap to remove restriction."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Large data usage"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Your data usage over the last few days is larger than normal. Tap to view usage and settings."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"High mobile data usage"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Your apps have used more data than usual"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> has used more data than usual"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Security certificate"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"This certificate is valid."</string>
<string name="issued_to" msgid="454239480274921032">"Issued to:"</string>
@@ -1669,7 +1676,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installed by your admin"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Updated by your admin"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Deleted by your admin"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"To help improve battery life, Battery Saver reduces your device’s performance and limits vibration, location services and most background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, Location Services and background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging."</string>
<string name="data_saver_description" msgid="6015391409098303235">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Turn on"</string>
@@ -1681,9 +1688,9 @@
<item quantity="other">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">For 1 min (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For one hour (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">For 1 hour (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1704,9 @@
<item quantity="other">For %d min</item>
<item quantity="one">For 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">For %d hours</item>
- <item quantity="one">For one hour</item>
+ <item quantity="one">For 1 hour</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">For %d hr</item>
@@ -1720,14 +1727,14 @@
<string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD request is modified to DIAL request."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD request is modified to SS request."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD request is modified to new USSD request."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD request is modified to Video DIAL request."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS request is modified to DIAL request."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS request is modified to Video DIAL request."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS request is modified to USSD request."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS request is modified to new SS request."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD request changed to regular call"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD request changed to SS request"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Changed to new USSD request"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD request changed to video call"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS request changed to regular call"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS request changed to video call"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS request changed to USSD request"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Changed to new SS request"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profile"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expand"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Collapse"</string>
@@ -1837,7 +1844,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Calls and notifications will vibrate"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Do Not Disturb"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Do Not Disturb is Hiding Notifications to help you Focus"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"This is new behaviour. Tap to change."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behaviour settings for interruptions"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap to check what\'s blocked."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"System"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Settings"</string>
</resources>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 04e776d86e36..06129e046cdd 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‏‎‎‎‎Caller ID defaults to not restricted. Next call: Not restricted‎‏‎‎‏‎"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎Service not provisioned.‎‏‎‎‏‎"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎You can\'t change the caller ID setting.‎‏‎‎‏‎"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‎‎‎No data service‎‏‎‎‏‎"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎No emergency calling‎‏‎‎‏‎"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎No mobile data service‎‏‎‎‏‎"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‏‏‏‏‎‎Emergency calling unavailable‎‏‎‎‏‎"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‎‎‎‎No voice service‎‏‎‎‏‎"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‏‎‏‏‎‎‏‎No voice/emergency service‎‏‎‎‏‎"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‎‎‎‎‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎Temporarily not offered by the mobile network at your location‎‏‎‎‏‎"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‏‏‎‎‎‏‎‎‎Can’t reach network‎‏‎‎‏‎"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎To improve reception, try changing the type selected at Settings &gt; Network &amp; internet &gt; Mobile networks &gt; Preferred network type.‎‏‎‎‏‎"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‎‎‎Wi‑Fi calling is active‎‏‎‎‏‎"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‎‏‎Emergency calls require a mobile network.‎‏‎‎‏‎"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎No voice service or emergency calling‎‏‎‎‏‎"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‏‏‏‎‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‎‎‎‎‎Temporarily turned off by your carrier‎‏‎‎‏‎"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‎‎Can’t reach mobile network‎‏‎‎‏‎"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‏‎‏‏‎‏‏‎‏‎Try changing preferred network. Tap to change.‎‏‎‎‏‎"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‎‎‎Emergency calling unavailable‎‏‎‎‏‎"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‎Can’t make emergency calls over Wi‑Fi‎‏‎‎‏‎"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‏‏‏‎Alerts‎‏‎‎‏‎"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‎Call forwarding‎‏‎‎‏‎"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‎‎‎‎‏‎Emergency callback mode‎‏‎‎‏‎"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‎‎Roaming Banner On‎‏‎‎‏‎"</string>
<string name="roamingText12" msgid="1189071119992726320">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‎‏‏‎‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‎‎‎‎‎Roaming Banner Off‎‏‎‎‏‎"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‏‎Searching for Service‎‏‎‎‏‎"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎Wi-Fi Calling‎‏‎‎‏‎"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: ‎‏‎‎‏‏‎<xliff:g id="CODE">%1$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎Register with your carrier (Error code: ‎‏‎‎‏‏‎<xliff:g id="CODE">%1$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎%s‎‏‎‎‏‎"</item>
<item msgid="4397097370387921767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎%s Wi-Fi Calling‎‏‎‎‏‎"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎Too many requests are being processed. Try again later.‎‏‎‎‏‎"</string>
<string name="notification_title" msgid="8967710025036163822">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‏‏‎‎‎‎‎‏‎‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‎Signin error for ‎‏‎‎‏‏‎<xliff:g id="ACCOUNT">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎Sync‎‏‎‎‏‎"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‎‎Sync‎‏‎‎‏‎"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‏‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‎‎‏‏‎‏‏‏‏‎Too many ‎‏‎‎‏‏‎<xliff:g id="CONTENT_TYPE">%s</xliff:g>‎‏‎‎‏‏‏‎ deletes.‎‏‎‎‏‎"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎Can\'t sync‎‏‎‎‏‎"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎Attempted to delete too many ‎‏‎‎‏‏‎<xliff:g id="CONTENT_TYPE">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎‎‎Tablet storage is full. Delete some files to free space.‎‏‎‎‏‎"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎Watch storage is full. Delete some files to free space.‎‏‎‎‏‎"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎TV storage is full. Delete some files to free space.‎‏‎‎‏‎"</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‏‎‏‎‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‏‎By your work profile admin‎‏‎‎‏‎"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎By ‎‏‎‎‏‏‎<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎Work profile deleted‎‏‎‎‏‎"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎Work profile deleted due to missing admin app‎‏‎‎‏‎"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎‎‎‎‎‎‏‎‎‎‎The work profile admin app is either missing or corrupted. As a result, your work profile and related data have been deleted. Contact your admin for assistance.‎‏‎‎‏‎"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎Your work profile is no longer available on this device‎‏‎‎‏‎"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎Too many password attempts‎‏‎‎‏‎"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‎‏‎Device is managed‎‏‎‎‏‎"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‎‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‎‎Your organization manages this device and may monitor network traffic. Tap for details.‎‏‎‎‏‎"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‏‎Your device will be erased‎‏‎‎‏‎"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‎The admin app can\'t be used. Your device will now be erased.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎If you have questions, contact your organizations admin.‎‏‎‎‏‎"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‎‎The admin app can\'t be used. Your device will now be erased.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎If you have questions, contact your organization\'s admin.‎‏‎‎‏‎"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎Printing disabled by ‎‏‎‎‏‏‎<xliff:g id="OWNER_APP">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
<string name="me" msgid="6545696007631404292">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎Me‎‏‎‎‏‎"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‎‏‎‏‎‎‏‎‏‎Tablet options‎‏‎‎‏‎"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎Airplane mode‎‏‎‎‏‎"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‏‏‎‎Airplane mode is ON‎‏‎‎‏‎"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎Airplane mode is OFF‎‏‎‎‏‎"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‎Battery saver‎‏‎‎‏‎"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‏‏‎‏‏‎Battery saver is OFF‎‏‎‎‏‎"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‎Battery saver is ON‎‏‎‎‏‎"</string>
<string name="global_action_settings" msgid="1756531602592545966">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎Settings‎‏‎‎‏‎"</string>
<string name="global_action_assist" msgid="3892832961594295030">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎Assist‎‏‎‎‏‎"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‎Voice Assist‎‏‎‎‏‎"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎‎Switch to work profile‎‏‎‎‏‎"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎Contacts‎‏‎‎‏‎"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‎‎access your contacts‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access your contacts‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access your contacts?‎‏‎‎‏‎"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎Location‎‏‎‎‏‎"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‎‎‏‏‎‎‎‏‏‏‎‏‏‏‎‎‏‎access this device\'s location‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access this device\'s location‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‏‏‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access this device\'s location?‎‏‎‎‏‎"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎Calendar‎‏‎‎‏‎"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‏‎‎access your calendar‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‎‎‏‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access your calendar‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access your calendar?‎‏‎‎‏‎"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎SMS‎‏‎‎‏‎"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‎‏‏‏‏‏‎‎send and view SMS messages‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎‎‏‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to send and view SMS messages‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to send and view SMS messages?‎‏‎‎‏‎"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‎Storage‎‏‎‎‏‎"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‏‎access photos, media, and files on your device‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access photos, media, and files on your device‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‎‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access photos, media, and files on your device?‎‏‎‎‏‎"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎Microphone‎‏‎‎‏‎"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‎‎‎record audio‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‏‏‏‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to record audio‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‎‏‏‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to record audio?‎‏‎‎‏‎"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‏‎‏‏‏‎Camera‎‏‎‎‏‎"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎‎take pictures and record video‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‎‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‏‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to take pictures and record video‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to take pictures and record video?‎‏‎‎‏‎"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎Phone‎‏‎‎‏‎"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‏‏‎make and manage phone calls‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to make and manage phone calls‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‏‎‏‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to make and manage phone calls?‎‏‎‎‏‎"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎Body Sensors‎‏‎‎‏‎"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‎access sensor data about your vital signs‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access sensor data about your vital signs‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access sensor data about your vital signs?‎‏‎‎‏‎"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‎‎Retrieve window content‎‏‎‎‏‎"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‎‎Inspect the content of a window you\'re interacting with.‎‏‎‎‏‎"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎Turn on Explore by Touch‎‏‎‎‏‎"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎Perform gestures‎‏‎‎‏‎"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‎Can tap, swipe, pinch, and perform other gestures.‎‏‎‎‏‎"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎Fingerprint gestures‎‏‎‎‏‎"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎‎Can capture gestures performed on the devices fingerprint sensor.‎‏‎‎‏‎"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎‎Can capture gestures performed on the device\'s fingerprint sensor.‎‏‎‎‏‎"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‏‏‏‎disable or modify status bar‎‏‎‎‏‎"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‏‏‏‎Allows the app to disable the status bar or add and remove system icons.‎‏‎‎‏‎"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎be the status bar‎‏‎‎‏‎"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the tablet.‎‏‎‎‏‎"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‏‎‏‏‎‎‎‏‏‎Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the TV.‎‏‎‎‏‎"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the phone.‎‏‎‎‏‎"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎run foreground service‎‏‎‎‏‎"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎Allows the app to make use of foreground services.‎‏‎‎‏‎"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‎‎measure app storage space‎‏‎‎‏‎"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‎‎‎‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎‎‎Allows the app to retrieve its code, data, and cache sizes‎‏‎‎‏‎"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎modify system settings‎‏‎‎‏‎"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‎‎‎Pattern unlock.‎‏‎‎‏‎"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‎‎‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‎Face unlock.‎‏‎‎‏‎"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‎‏‏‎‎Pin unlock.‎‏‎‎‏‎"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎Sim Pin unlock.‎‏‎‎‏‎"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎Sim Puk unlock.‎‏‎‎‏‎"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‏‎Password unlock.‎‏‎‎‏‎"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎Pattern area.‎‏‎‎‏‎"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎Slide area.‎‏‎‎‏‎"</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‏‎Text copied to clipboard.‎‏‎‎‏‎"</string>
<string name="more_item_label" msgid="4650918923083320495">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‎‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‎More‎‏‎‎‏‎"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‎‎‎‏‏‎‏‎‎Menu+‎‏‎‎‏‎"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎‎‎‏‎‎Meta+‎‏‎‎‏‎"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‎Ctrl+‎‏‎‎‏‎"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‎‎‎‎‎Alt+‎‏‎‎‏‎"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‏‎‎‎Shift+‎‏‎‎‏‎"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‏‏‎‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎Sym+‎‏‎‎‏‎"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‎Function+‎‏‎‎‏‎"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‎‏‎‎‏‎space‎‏‎‎‏‎"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎enter‎‏‎‎‏‎"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‎‎delete‎‏‎‎‏‎"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‏‎‎‏‎‏‎‏‎‏‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‏‎Check for update‎‏‎‎‏‎"</string>
<string name="smv_application" msgid="3307209192155442829">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‏‎The app ‎‏‎‎‏‏‎<xliff:g id="APPLICATION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ (process ‎‏‎‎‏‏‎<xliff:g id="PROCESS">%2$s</xliff:g>‎‏‎‎‏‏‏‎) has violated its self-enforced StrictMode policy.‎‏‎‎‏‎"</string>
<string name="smv_process" msgid="5120397012047462446">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎The process ‎‏‎‎‏‏‎<xliff:g id="PROCESS">%1$s</xliff:g>‎‏‎‎‏‏‏‎ has has violated its self-enforced StrictMode policy.‎‏‎‎‏‎"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎Android is upgrading…‎‏‎‎‏‎"</string>
- <string name="android_start_title" msgid="8418054686415318207">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎Android is starting…‎‏‎‎‏‎"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎Phone is updating…‎‏‎‎‏‎"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‎‎Tablet is updating…‎‏‎‎‏‎"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‎‏‎‎‏‎‏‎Device is updating…‎‏‎‎‏‎"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎Phone is starting…‎‏‎‎‏‎"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎Tablet is starting…‎‏‎‎‏‎"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎Device is starting…‎‏‎‎‏‎"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‏‏‎‏‏‏‎‎‎‏‎‏‎‎Optimizing storage.‎‏‎‎‏‎"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‏‎Finishing Android update…‎‏‎‎‏‎"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‎‎‎‎‏‎‏‏‎‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‎Some apps may not work properly until the upgrade finishes‎‏‎‎‏‎"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‎‎‏‏‎‎Finishing system update…‎‏‎‎‏‎"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="APPLICATION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is upgrading…‎‏‎‎‏‎"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎Optimizing app ‎‏‎‎‏‏‎<xliff:g id="NUMBER_0">%1$d</xliff:g>‎‏‎‎‏‏‏‎ of ‎‏‎‎‏‏‎<xliff:g id="NUMBER_1">%2$d</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‏‎‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎Preparing ‎‏‎‎‏‏‎<xliff:g id="APPNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎Starting apps.‎‏‎‎‏‎"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‏‎‎‏‏‏‏‎‏‎Finishing boot.‎‏‎‎‏‎"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="APP">%1$s</xliff:g>‎‏‎‎‏‏‏‎ running‎‏‎‎‏‎"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‎‏‎Tap to return to game‎‏‎‎‏‎"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎Choose game‎‏‎‎‏‎"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎For better performance, only one of these games can be open at a time.‎‏‎‎‏‎"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‎‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‎‏‏‎Go back to ‎‏‎‎‏‏‎<xliff:g id="OLD_APP">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎Open ‎‏‎‎‏‏‎<xliff:g id="NEW_APP">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="OLD_APP">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will close without saving‎‏‎‎‏‎"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="PROC">%1$s</xliff:g>‎‏‎‎‏‏‏‎ exceeded memory limit‎‏‎‎‏‎"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎Heap dump has been collected; tap to share‎‏‎‎‏‎"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‏‏‎‏‎Heap dump collected. Tap to share.‎‏‎‎‏‎"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎Share heap dump?‎‏‎‎‏‎"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‎‎‏‎‏‏‏‎‏‎The process ‎‏‎‎‏‏‎<xliff:g id="PROC">%1$s</xliff:g>‎‏‎‎‏‏‏‎ has exceeded its process memory limit of ‎‏‎‎‏‏‎<xliff:g id="SIZE">%2$s</xliff:g>‎‏‎‎‏‏‏‎. A heap dump is available for you to share with its developer. Be careful: this heap dump can contain any of your personal information that the application has access to.‎‏‎‎‏‎"</string>
<string name="sendText" msgid="5209874571959469142">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‏‎‎Choose an action for text‎‏‎‎‏‎"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎Connect to open Wi‑Fi network‎‏‎‎‏‎"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‎Connect to carrier Wi‑Fi network‎‏‎‎‏‎"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‎Connecting to open Wi‑Fi network‎‏‎‎‏‎"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‎Connected to Wi‑Fi network‎‏‎‎‏‎"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎Could not connect to Wi‑Fi network‎‏‎‎‏‎"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎Tap to see all networks‎‏‎‎‏‎"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎Connect‎‏‎‎‏‎"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‏‏‎‎‎‏‏‎‎‏‎‎‏‎All Networks‎‏‎‎‏‎"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎All networks‎‏‎‎‏‎"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎Wi‑Fi will turn on automatically‎‏‎‎‏‎"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎When you\'re near a high quality saved network‎‏‎‎‏‎"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‎‎‏‎‎‏‎‏‏‏‎‏‏‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎Don\'t turn back on‎‏‎‎‏‎"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‏‎Restart‎‏‎‎‏‎"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‎‎‎‎Activate mobile service‎‏‎‎‏‎"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎Download the carrier app to activate your new SIM‎‏‎‎‏‎"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎Download the ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ app to activate your new SIM‎‏‎‎‏‎"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‎‏‎Download app‎‏‎‎‏‎"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‏‏‏‎‏‎New SIM inserted‎‏‎‎‏‎"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‎‏‎Tap to set it up‎‏‎‎‏‎"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‎‎PTP via USB turned on‎‏‎‎‏‎"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎USB tethering turned on‎‏‎‎‏‎"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎MIDI via USB turned on‎‏‎‎‏‎"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎USB accessory mode turned on‎‏‎‎‏‎"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎USB accessory connected‎‏‎‎‏‎"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‎Tap for more options.‎‏‎‎‏‎"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎Charging connected device. Tap for more options.‎‏‎‎‏‎"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎Analog audio accessory detected‎‏‎‎‏‎"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‏‎The attached device is not compatible with this phone. Tap to learn more.‎‏‎‎‏‎"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎USB debugging connected‎‏‎‎‏‎"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‎Tap to disable USB debugging.‎‏‎‎‏‎"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‎Tap to turn off USB debugging‎‏‎‎‏‎"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎Select to disable USB debugging.‎‏‎‎‏‎"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎Taking bug report…‎‏‎‎‏‎"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎Share bug report?‎‏‎‎‏‎"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‎‎‎‎‎‏‏‎‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ displaying over other apps‎‏‎‎‏‎"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ is displaying over other apps‎‏‎‎‏‎"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎If you don’t want ‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ to use this feature, tap to open settings and turn it off.‎‏‎‎‏‎"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‎‏‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‎‎TURN OFF‎‏‎‎‏‎"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎Turn off‎‏‎‎‏‎"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‏‏‎‏‏‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‎‏‏‏‎‎Preparing ‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‏‎‎‎‎Checking for errors‎‏‎‎‏‎"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‎New ‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ detected‎‏‎‎‏‎"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎Always-on VPN connecting…‎‏‎‎‏‎"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‏‏‎‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‎Always-on VPN connected‎‏‎‎‏‎"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎Disconnected from always-on VPN‎‏‎‎‏‎"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎Always-on VPN error‎‏‎‎‏‎"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‏‎‎‏‎‎‎‏‏‎‎‎‎‎‏‎Couldn\'t connect to always-on VPN‎‏‎‎‏‎"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎Change network or VPN settings‎‏‎‎‏‎"</string>
<string name="upload_file" msgid="2897957172366730416">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎Choose file‎‏‎‎‏‎"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‎No file chosen‎‏‎‎‏‎"</string>
<string name="reset" msgid="2448168080964209908">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎‎Reset‎‏‎‎‏‎"</string>
<string name="submit" msgid="1602335572089911941">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‏‎Submit‎‏‎‎‏‎"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎Car mode enabled‎‏‎‎‏‎"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎Tap to exit car mode.‎‏‎‎‏‎"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎Driving app is running‎‏‎‎‏‎"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎Tap to exit driving app.‎‏‎‎‏‎"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎Tethering or hotspot active‎‏‎‎‏‎"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎Tap to set up.‎‏‎‎‏‎"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‎Tethering is disabled‎‏‎‎‏‎"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="MANUFACTURER">%s</xliff:g>‎‏‎‎‏‏‏‎ USB drive‎‏‎‎‏‎"</string>
<string name="storage_usb" msgid="3017954059538517278">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎USB storage‎‏‎‎‏‎"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎Edit‎‏‎‎‏‎"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎Data usage alert‎‏‎‎‏‎"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‏‎Tap to view usage and settings.‎‏‎‎‏‎"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎2G-3G data limit reached‎‏‎‎‏‎"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‏‎‎‏‎‎‎‎4G data limit reached‎‏‎‎‏‎"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‏‎Data warning‎‏‎‎‏‎"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‎‎‎You\'ve used ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ of data‎‏‎‎‏‎"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎Mobile data limit reached‎‏‎‎‏‎"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎Wi-Fi data limit reached‎‏‎‎‏‎"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‏‏‎‎‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎Data paused for rest of cycle‎‏‎‎‏‎"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎2G-3G data limit exceeded‎‏‎‎‏‎"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎4G data limit exceeded‎‏‎‎‏‎"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎Mobile data limit exceeded‎‏‎‎‏‎"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‏‎‎Wi-Fi data limit exceeded‎‏‎‎‏‎"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="SIZE">%s</xliff:g>‎‏‎‎‏‏‏‎ over specified limit.‎‏‎‎‏‎"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎Data paused for the rest of your cycle‎‏‎‎‏‎"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‎‎‎Over your mobile data limit‎‏‎‎‏‎"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎Over your Wi-Fi data limit‎‏‎‎‏‎"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‏‎You\'ve gone ‎‏‎‎‏‏‎<xliff:g id="SIZE">%s</xliff:g>‎‏‎‎‏‏‏‎ over your set limit‎‏‎‎‏‎"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‎‎Background data restricted‎‏‎‎‏‎"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎Tap to remove restriction.‎‏‎‎‏‎"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎Large data usage‎‏‎‎‏‎"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‏‎‏‏‏‎‏‏‏‎‏‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‏‏‏‏‎Your data usage over the last few days is larger than normal. Tap to view usage and settings.‎‏‎‎‏‎"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎High mobile data usage‎‏‎‎‏‎"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎Your apps have used more data than usual‎‏‎‎‏‎"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ has used more data than usual‎‏‎‎‏‎"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎Security certificate‎‏‎‎‏‎"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎This certificate is valid.‎‏‎‎‏‎"</string>
<string name="issued_to" msgid="454239480274921032">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‎Issued to:‎‏‎‎‏‎"</string>
@@ -1669,7 +1676,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎‏‎‎‎‎Installed by your admin‎‏‎‎‏‎"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‎‎‏‎‎‏‎Updated by your admin‎‏‎‎‏‎"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‏‏‎‎Deleted by your admin‎‏‎‎‏‎"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎To help improve battery life, Battery Saver reduces your device’s performance and limits vibration, location services, and most background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Battery Saver turns off automatically when your device is charging.‎‏‎‎‏‎"</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‏‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‎‏‎‎To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, location services, and background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Battery Saver turns off automatically when your device is charging.‎‏‎‎‏‎"</string>
<string name="data_saver_description" msgid="6015391409098303235">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‎‎‏‏‎To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them.‎‏‎‎‏‎"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎‏‎Turn on Data Saver?‎‏‎‎‏‎"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‎‏‎‎Turn on‎‏‎‎‏‎"</string>
@@ -1681,9 +1688,9 @@
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎For %1$d min (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
<item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎For 1 min (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎For %1$d hours (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎For one hour (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎For %1$d hours (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
+ <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎For 1 hour (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎For %1$d hr (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
@@ -1697,9 +1704,9 @@
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‎For %d min‎‏‎‎‏‎</item>
<item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‎For 1 min‎‏‎‎‏‎</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎For %d hours‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎For one hour‎‏‎‎‏‎</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎For %d hours‎‏‎‎‏‎</item>
+ <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎For 1 hour‎‏‎‎‏‎</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎For %d hr‎‏‎‎‏‎</item>
@@ -1720,14 +1727,14 @@
<string name="muted_by" msgid="6147073845094180001">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‏‎Muted by ‎‏‎‎‏‏‎<xliff:g id="THIRD_PARTY">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎There\'s an internal problem with your device, and it may be unstable until you factory data reset.‎‏‎‎‏‎"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‎‎‎There\'s an internal problem with your device. Contact your manufacturer for details.‎‏‎‎‏‎"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‎‎USSD request is modified to DIAL request.‎‏‎‎‏‎"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎USSD request is modified to SS request.‎‏‎‎‏‎"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‎‎‏‏‎‎‏‎‏‎USSD request is modified to new USSD request.‎‏‎‎‏‎"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎USSD request is modified to Video DIAL request.‎‏‎‎‏‎"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‎‎SS request is modified to DIAL request.‎‏‎‎‏‎"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‏‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎SS request is modified to Video DIAL request.‎‏‎‎‏‎"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‎SS request is modified to USSD request.‎‏‎‎‏‎"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‎SS request is modified to new SS request.‎‏‎‎‏‎"</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‎‏‎‎‎‏‏‏‎‎‏‎‏‎USSD request changed to regular call‎‏‎‎‏‎"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‎USSD request changed to SS request‎‏‎‎‏‎"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎Changed to new USSD request‎‏‎‎‏‎"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‎‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‏‏‎USSD request changed to video call‎‏‎‎‏‎"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‎SS request changed to regular call‎‏‎‎‏‎"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‏‏‎‏‎‏‏‎‏‏‎‏‏‏‏‎‎‎‎‏‏‎SS request changed to video call‎‏‎‎‏‎"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎SS request changed to USSD request‎‏‎‎‏‎"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‏‏‏‏‏‏‏‏‎‎Changed to new SS request‎‏‎‎‏‎"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‎‏‎‏‎‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‎Work profile‎‏‎‎‏‎"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‎‎‏‎‎‎‎‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‎Expand‎‏‎‎‏‎"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎Collapse‎‏‎‎‏‎"</string>
@@ -1837,7 +1844,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎Harmful app detected‎‏‎‎‏‎"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ wants to show ‎‏‎‎‏‏‎<xliff:g id="APP_2">%2$s</xliff:g>‎‏‎‎‏‏‏‎ slices‎‏‎‎‏‎"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎Edit‎‏‎‎‏‎"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎Calls and notifications will vibrate‎‏‎‎‏‎"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎Calls and notifications will be muted‎‏‎‎‏‎"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‎‎‏‏‎‎System changes‎‏‎‎‏‎"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎Do Not Disturb‎‏‎‎‏‎"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‏‏‏‎‎Do Not Disturb is hiding notifications to help you focus‎‏‎‎‏‎"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‎‎This is new behavior. Tap to change.‎‏‎‎‏‎"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‏‎‎Do Not Disturb has changed‎‏‎‎‏‎"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‎Tap to check your behavior settings for interruptions‎‏‎‎‏‎"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎Tap to check what\'s blocked.‎‏‎‎‏‎"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‎System‎‏‎‎‏‎"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‎Settings‎‏‎‎‏‎"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 950b977176e8..f81f4f8adae6 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"El Identificador de llamadas está predeterminado en no restringido. Llamada siguiente: no restringido"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Servicio no suministrado."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"No puedes cambiar la configuración del identificador de llamadas."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Sin servicio de datos"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"No se pueden hacer llamadas de emergencia"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"No hay ningún servicio de datos móviles"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Servicio de llamadas de emergencia no disponible"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sin servicio de voz"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sin servicio de voz/emergencia"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"La red móvil de tu ubicación no ofrece este servicio de forma temporal"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Para mejorar la recepción, cambia el tipo de red. Selecciona Configuración &gt; Internet y red &gt; Redes móviles &gt; Tipo de red preferido."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Las llamadas con Wi-Fi están activadas"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Las llamadas de emergencia requieren una red móvil."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hay ningún servicio de voz ni de llamadas de emergencia"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Desactivado temporalmente por tu proveedor"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No se puede acceder a la red móvil"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Presiona para cambiar la red preferida."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Servicio de llamadas de emergencia no disponible"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"No se pueden hacer llamadas de emergencia mediante Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de roaming activado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de roaming desactivado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Buscando servicio"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Llamada por Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para hacer llamadas y enviar mensajes mediante Wi-Fi, solicítale a tu proveedor que configure este servicio. Luego, vuelve a activar la Llamada con Wi-Fi en Configuración. (código de error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Regístrate con tu proveedor (código de error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Llamada por Wi-Fi de %s"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Error de acceso de <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronización"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronización"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Demasiadas eliminaciones de <xliff:g id="CONTENT_TYPE">%s</xliff:g>"</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Se ha agotado el espacio de almacenamiento de la tablet. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"El almacenamiento del reloj está completo. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"El almacenamiento de la TV está completo. Elimina algunos archivos para liberar espacio."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Por parte de tu administrador del perfil de trabajo"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Perfil de trabajo eliminado"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Se borró el perfil de trabajo debido a la falta de una app de administración"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"La app de administración de perfil de trabajo no se encuentra o está dañada. Por lo tanto, se borraron tu perfil de trabajo y los datos relacionados. Para obtener asistencia, comunícate con el administrador."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Tu perfil de trabajo ya no está disponible en este dispositivo"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Demasiados intentos para ingresar la contraseña"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Dispositivo administrado"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Tu organización administra este dispositivo y es posible que controle el tráfico de red. Presiona para obtener más información."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Se borrarán los datos del dispositivo"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"No se puede usar la app de administración. Ahora se borrará tu dispositivo.\n\nSi tienes preguntas, comunícate con el administrador de tu organización."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"No se puede usar la app de administrador. Ahora se borrará tu dispositivo.\n\nSi tienes preguntas, comunícate con el administrador de tu organización."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> inhabilitó la impresión."</string>
<string name="me" msgid="6545696007631404292">"Yo"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opciones de tablet"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"El modo avión está Activado"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"El modo avión está Desactivado"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Ahorro de batería"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Ahorro de batería DESACTIVADO"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Ahorro de batería ACTIVADO"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Cambiar al perfil de trabajo"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder a los contactos"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tus contactos"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicación"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder a la ubicación de este dispositivo"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a la ubicación de este dispositivo"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder al calendario"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tu calendario"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar y ver mensajes SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envíe y vea los mensajes SMS"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Espacio de almacenamiento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acceder a las fotos, el contenido multimedia y los archivos"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a las fotos, el contenido multimedia y los archivos de tu dispositivo"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"grabar audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; grabe audio"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Cámara"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tomar fotografías y grabar videos"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tome fotos y grabe videos"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"realizar y administrar llamadas telefónicas"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; haga y administre las llamadas telefónicas"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporales"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder a los datos del sensor acerca de tus signos vitales"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a los datos del sensor acerca de tus signos vitales"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contenido de las ventanas"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de la ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la Exploración táctil"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Usar gestos"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Permite presionar, deslizar, pellizcar y usar otros gestos."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestos del sensor de huellas digitales"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Captura los gestos que se hacen en el sensor de huellas digitales de los dispositivos."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Captura los gestos que se hacen en el sensor de huellas digitales del dispositivo."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desactivar o modificar la barra de estado"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite que la aplicación inhabilite la barra de estado o que agregue y elimine íconos del sistema."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"aparecer en la barra de estado"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que la aplicación haga que algunas de sus partes se mantengan persistentes en la memoria. Esto puede limitar la memoria disponible para otras aplicaciones y ralentizar la tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite que la aplicación cree partes de sí misma que queden en la memoria. Esta opción puede limitar la memoria disponible para otras aplicaciones y reducir la velocidad de la TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permite que la aplicación haga que algunas de sus partes se mantengan persistentes en la memoria. Esto puede limitar la memoria disponible para otras aplicaciones y ralentizar el dispositivo."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ejecutar servicio en primer plano"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Permite que la app use servicios en primer plano."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"medir el espacio de almacenamiento de la aplicación"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permite que la aplicación recupere su código, sus datos y los tamaños de la memoria caché."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modificar la configuración del sistema"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"PIN de desbloqueo de SIM"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"PUK de desbloqueo de SIM"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo por contraseña"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área de patrón"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslizamiento"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Texto copiado en el portapapeles."</string>
<string name="more_item_label" msgid="4650918923083320495">"Más"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menú+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Mayúscula+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Función+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espacio"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ingresar"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"borrar"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Buscar actualización"</string>
<string name="smv_application" msgid="3307209192155442829">"La aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> (proceso <xliff:g id="PROCESS">%2$s</xliff:g>) ha infringido su política StrictMode de aplicación automática."</string>
<string name="smv_process" msgid="5120397012047462446">"El proceso <xliff:g id="PROCESS">%1$s</xliff:g> ha violado su política StrictMode autoimpuesta."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android se está actualizando..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Iniciando Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Actualizando teléfono…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Actualizando tablet…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Actualizando dispositivo…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Iniciando teléfono…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Iniciando tablet…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Iniciando dispositivo…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizando almacenamiento"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finalizando actualización de Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Es posible que algunas apps no funcionen correctamente hasta que termine la actualización"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Finalizando actualización del sistema…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Se está actualizando <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizando la aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicaciones"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando el inicio"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Presiona para volver al juego"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Elige un juego"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Para tener un mejor rendimiento, debes abrir solo uno de estos juegos a la vez."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Volver a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Abrir <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> se cerrará sin guardar"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> superó el límite de memoria."</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Se recopiló el volcado de pila. Presiona para compartir."</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"¿Compartir volcado de pila?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"El proceso <xliff:g id="PROC">%1$s</xliff:g> superó el límite de memoria de proceso de <xliff:g id="SIZE">%2$s</xliff:g>. Hay un volcado de pila disponible para que puedas compartirlo con el programador. Ten cuidado, este volcado de pila puede contener información personal a la que la aplicación tiene acceso."</string>
<string name="sendText" msgid="5209874571959469142">"Seleccionar una acción para el texto"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectarse a una red Wi-Fi abierta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectarse a la red Wi-Fi del proveedor"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectándose a una red Wi-Fi abierta"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Se conectó a la red Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No fue posible conectarse a la red Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Presiona para ver todas las redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas las redes"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas las redes"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Se activará la conexión Wi-Fi automáticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Cuando estés cerca de una red guardada de alta calidad"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"No volver a activar"</string>
@@ -1204,6 +1225,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activa servicio de datos móviles"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descarga la app del proveedor para activar tu nueva SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Descarga la app de <xliff:g id="APP_NAME">%1$s</xliff:g> para activar tu nueva SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descargar app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nueva SIM insertada"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Presiona para configurar"</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Se activó el modo PTP mediante USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Se activó la conexión mediante dispositivo portátil por USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Se activó el modo MIDI mediante USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Se activó el modo de accesorio USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Accesorio USB conectado"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Presiona para ver más opciones."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Cargando el dispositivo conectado. Presiona para ver más opciones."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Se detectó un accesorio de audio analógico"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"El dispositivo adjunto no es compatible con este teléfono. Presiona para obtener más información."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Presiona para inhabilitar la depuración por USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Presiona para desactivar la depuración USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Seleccionar para desactivar la depuración por USB"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Realizando un informe de errores…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"¿Compartir informe de errores?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> use esta función, presiona para abrir la configuración y desactivarla."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactivar"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando el medio <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Verificando errores"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Se detectó un nuevo medio (<xliff:g id="NAME">%s</xliff:g>)."</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Estableciendo conexión con la VPN siempre activada..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Se estableció conexión con la VPN siempre activada."</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectado de la VPN siempre activa"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Se produjo un error al establecer conexión con la VPN siempre activada."</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Cambiar configuración de red o VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Elegir archivo"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"No se seleccionó un archivo."</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo Auto habilitado"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Presiona para salir del modo auto."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red o zona activa conectados"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Presiona para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Se inhabilitó la conexión mediante dispositivo portátil"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Unidad USB de <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Almacenamiento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alerta por el uso de datos"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Presiona para uso y opciones."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Límite de datos 2G-3G alcanzado"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Límite de datos 4G alcanzado"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Advertencia de datos"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Usaste <xliff:g id="APP">%s</xliff:g> de datos"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Se alcanzó el límite de datos"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Límite de datos Wi-Fi alcanzado"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Datos pausados resto del ciclo"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Supera límite de datos de 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Límite de datos de 4G superado"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Límite de datos móviles superado"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Límite de datos Wi-Fi superado"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Límite superado en <xliff:g id="SIZE">%s</xliff:g>"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Se pausaron los datos para el resto del ciclo"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Excediste el límite de datos"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Excediste tu límite de Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Te excediste <xliff:g id="SIZE">%s</xliff:g> de tu límite"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Datos de referencia restringidos"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Presiona y quita la restricción."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Uso de datos elevado"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Tu uso de datos fue más elevado de lo normal en los últimos días. Presiona para ver detalles sobre el uso y la configuración."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Uso excesivo de datos móviles"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Tus apps usaron más datos de lo normal"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> usó más datos de lo normal"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificado de seguridad"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Este certificado es válido."</string>
<string name="issued_to" msgid="454239480274921032">"Emitido a:"</string>
@@ -1669,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Tu administrador instaló este paquete"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Tu administrador actualizó este paquete"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Tu administrador borró este paquete"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Para mejorar la duración de la batería, el Ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayoría de los datos en segundo plano. Es posible que no se puedan actualizar el correo electrónico, los mensajes y otras apps que se basan en la sincronización, a menos que los abras.\n\nEl Ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Para reducir el uso de datos, \"Reducir datos\" evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar Ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
@@ -1681,9 +1704,9 @@
<item quantity="other">Durante %1$d minutos hasta la(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
<item quantity="one">Durante 1 minuto hasta la(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g></item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">Durante %1$d horas, hasta la(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
- <item quantity="one">Durante 1 hora; hasta la(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g></item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">Durante %1$d horas (hasta <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Durante 1 hora (hasta <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Durante %1$d horas hasta la(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g></item>
@@ -1697,7 +1720,7 @@
<item quantity="other">Durante %d minutos</item>
<item quantity="one">Durante 1 minuto</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Durante %d horas</item>
<item quantity="one">Durante 1 hora</item>
</plurals>
@@ -1720,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"Silenciados por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Existe un problema interno con el dispositivo, de modo que el dispositivo puede estar inestable hasta que restablezcas la configuración de fábrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Existe un problema interno con el dispositivo. Comunícate con el fabricante para obtener más información."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"La solicitud USSD cambió por una solicitud DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"La solicitud USSD cambió por una solicitud SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"La solicitud USSD cambió por una nueva solicitud USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Se cambió la solicitud USSD por una solicitud DIAL de video."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La solicitud SS cambió por una solicitud DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Se cambió la solicitud SS por una solicitud DIAL de video."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La solicitud SS cambió por una solicitud USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La solicitud SS cambió por una nueva solicitud SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabajo"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Contraer"</string>
@@ -1837,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Se detectó una app dañina"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quiere mostrar fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Vibrarán las llamadas y notificaciones"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Se silenciarán las llamadas y notificaciones"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Cambios del sistema"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"No interrumpir"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"El modo No interrumpir oculta las notificaciones para que no pierdas la concentración"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este comportamiento es nuevo. Presiona para cambiarlo."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Se modificó la opción No interrumpir"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Presiona para consultar la configuración de comportamiento de las interrupciones"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Presiona para consultar lo que está bloqueado."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 089320115206..049a7739120d 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"El ID de emisor presenta el valor predeterminado de no restringido. Siguiente llamada: No restringido"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"El servicio no se suministra."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"No puedes modificar el ID de emisor."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Sin servicio de datos"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"No se pueden hacer llamadas de emergencia"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"No hay ningún servicio de datos móviles"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Servicio de llamadas de emergencia no disponible"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sin servicio de voz"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sin servicio de emergencia ni de voz"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"La red móvil disponible en tu ubicación no ofrece esta opción de forma temporal"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Para mejorar la recepción, prueba a cambiar el tipo seleccionado en Ajustes &gt; Red e Internet &gt; Redes móviles &gt; Tipo de red preferido."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"La llamada por Wi‑Fi está activada"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Necesitas conectarte a una red móvil para hacer llamadas de emergencia."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hay ningún servicio de voz ni de llamadas de emergencia"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Desactivado temporalmente por tu operador"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No se puede establecer conexión con la red móvil"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Toca para cambiar la red preferida."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Servicio de llamadas de emergencia no disponible"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"No se pueden hacer llamadas de emergencia por Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de itinerancia activado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de itinerancia desactivado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Buscando servicio"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Llamadas Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para hacer llamadas y enviar mensajes por Wi-Fi, pide antes a tu operador que configure este servicio. Una vez hecho esto, vuelva a activar la llamada por Wi-Fi en Ajustes. (Código de error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Regístrate con tu operador (código de error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Llamada Wi-Fi de %s"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Error de inicio de sesión de <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronización"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronización"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Demasiadas eliminaciones de <xliff:g id="CONTENT_TYPE">%s</xliff:g>"</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Se ha agotado el espacio de almacenamiento del tablet. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"El almacenamiento del reloj está lleno. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"No queda espacio de almacenamiento en la TV. Elimina algunos archivos para liberar espacio."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Por el administrador de tu perfil de trabajo"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Perfil de trabajo eliminado"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Se ha eliminado el perfil de trabajo porque falta la aplicación de administración"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Falta la aplicación de administración del perfil de trabajo o está dañada. Por ello, se han eliminado tu perfil de trabajo y los datos relacionados. Ponte en contacto con el administrador para obtener ayuda."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Tu perfil de trabajo ya no está disponible en este dispositivo"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Has fallado demasiadas veces al introducir la contraseña"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"El dispositivo está administrado"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Tu organización administra este dispositivo y puede supervisar el tráfico de red. Toca la notificación para obtener más información."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Tu dispositivo se borrará"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"No se puede utilizar la aplicación de administración. Se borrarán los datos del dispositivo. \n\nSi tienes alguna pregunta, ponte en contacto con el administrador de tu organización."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"No se puede utilizar la aplicación de administración. Se borrarán todos los datos del dispositivo.\n\nSi tienes alguna pregunta, ponte en contacto con el administrador de tu organización."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> ha inhabilitado la impresión."</string>
<string name="me" msgid="6545696007631404292">"Yo"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opciones del tablet"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avión activado. Desactivar"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avión desactivado. Activar"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Ahorro de batería"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Ahorro de batería desactivado"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Ahorro de batería activado"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ajustes"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
@@ -269,32 +272,41 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Cambiar al perfil de trabajo"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder a tus contactos"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tus contactos"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicación"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder a la ubicación de este dispositivo"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a la ubicación de este dispositivo"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder a tu calendario"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda al calendario"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar y ver mensajes SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envíe y lea mensajes SMS"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Almacenamiento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acceder a fotos, contenido multimedia y archivos de tu dispositivo"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a los archivos, fotos y contenido multimedia de tu dispositivo"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"grabar audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; grabe audio"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Cámara"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"hacer fotos y grabar vídeos"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; haga fotos y grabe vídeos"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"hacer y administrar llamadas telefónicas"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; haga y administre llamadas de teléfono"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporales"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder a datos de sensores de tus constantes vitales"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Permite que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a los datos del sensor sobre tus constantes vitales"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contenido de la ventana"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Comprobar el contenido de la ventana"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de una ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la exploración táctil"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Los elementos que tocas se dicen en voz alta y se puede explorar la pantalla mediante gestos."</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Realizar gestos"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Puedes tocar y pellizcar la pantalla, deslizar el dedo y hacer otros gestos."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestos de huellas digitales"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Puede capturar los gestos realizados en el sensor de huellas digitales del dispositivo."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Puede capturar los gestos realizados en el sensor de huellas digitales del dispositivo."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"inhabilitar o modificar la barra de estado"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite que la aplicación inhabilite la barra de estado o añada y elimine iconos del sistema."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"aparecer en la barra de estado"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que la aplicación haga que algunas de sus partes se mantengan en la memoria. Esto puede limitar la cantidad de memoria disponible para otras aplicaciones y ralentizar el tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite que la aplicación haga que algunas partes de sí misma queden persistentes en la memoria. Esto puede limitar la memoria disponible para otras aplicaciones, lo que podría ralentizar la TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permite que la aplicación haga que algunas de sus partes se mantengan en la memoria. Esto puede limitar la cantidad de memoria disponible para otras aplicaciones y ralentizar el teléfono."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ejecutar servicio en primer plano"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Permite que la aplicación use servicios en primer plano."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"medir el espacio de almacenamiento de la aplicación"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permite que la aplicación recupere su código, sus datos y los tamaños de caché."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modificar los ajustes del sistema"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Desbloqueo con PIN de la SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Desbloqueo con PUK de la SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo por contraseña"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área de patrón"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área para deslizar"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Texto copiado al portapapeles."</string>
<string name="more_item_label" msgid="4650918923083320495">"Más"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"MENU+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Mayús +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Función +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espacio"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"intro"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"eliminar"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Comprobar actualizaciones"</string>
<string name="smv_application" msgid="3307209192155442829">"La aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> (proceso <xliff:g id="PROCESS">%2$s</xliff:g>) ha infringido su política StrictMode autoaplicable."</string>
<string name="smv_process" msgid="5120397012047462446">"El proceso <xliff:g id="PROCESS">%1$s</xliff:g> ha infringido su política StrictMode autoaplicable."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Actualizando Android"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android se está iniciando…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"El teléfono se está actualizando…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"El tablet se está actualizando…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"El dispositivo se está actualizando…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"El teléfono se está iniciando…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"El tablet se está iniciando…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"El dispositivo se está iniciando…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizando almacenamiento."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Terminando de actualizar Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Es posible que algunas aplicaciones no funcionen correctamente hasta que finalice la actualización"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Finalizando actualización del sistema…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> se está actualizando…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizando aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>..."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicaciones"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando inicio..."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Toca para volver al juego"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Elegir juego"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Para disfrutar de un mejor rendimiento, solo puede estar abierto uno de estos juegos."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Volver a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Abrir <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> se cerrará sin guardar"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superado el límite de memoria"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Se ha recopilado un volcado de pila. Toca para compartirlo"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"¿Compartir volcado de pila?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"El proceso <xliff:g id="PROC">%1$s</xliff:g> ha superado su límite de memoria de <xliff:g id="SIZE">%2$s</xliff:g>. Hay un volcado de pila disponible que puedes compartir con su desarrollador (ten cuidado, ya que puede incluir información personal a la que tenga acceso la aplicación)."</string>
<string name="sendText" msgid="5209874571959469142">"Selecciona una acción para el texto"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectarse a una red Wi-Fi abierta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectarse a la red Wi‑Fi de un operador"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectándose a una red Wi-Fi abierta"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a la red Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No se ha podido conectar a la red Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas las redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectarse"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas las redes"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas las redes"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"La conexión Wi‑Fi se activará automáticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Cuando estés cerca de una red de alta calidad guardada"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"No volver a activar"</string>
@@ -1204,6 +1225,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activar servicio móvil"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descarga la aplicación del operador para activar tu nueva tarjeta SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Descarga la aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> para activar tu nueva SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descargar aplicación"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nueva SIM insertada"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Toca para configurar"</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Modo PTP por USB activado"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Modo de conexión compartida por USB activado"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Modo MIDI por USB activado"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modo de accesorio USB activado"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Accesorio USB conectado"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toca para ver más opciones."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Cargando el dispositivo conectado. Toca para ver más opciones."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Se ha detectado un accesorio de audio analógico"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"El dispositivo adjunto no es compatible con este teléfono. Toca para obtener más información."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB habilitada"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Toca para inhabilitar la depuración USB"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Toca para desactivar la depuración USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Seleccionar para inhabilitar la depuración USB"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Creando informe de errores…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"¿Compartir informe de errores?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras aplicaciones"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca la notificación para abrir los ajustes y desactivarla."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactivar"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando errores"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nueva <xliff:g id="NAME">%s</xliff:g> detectada"</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Conectando VPN siempre activada…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN siempre activada conectada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectado de VPN siempre activada"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Error de VPN siempre activada"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Cambiar ajustes de red o VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Seleccionar archivo"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Archivo no seleccionado"</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Se ha habilitado el modo coche"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toca para salir del modo coche."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Compartir conexión/Zona Wi-Fi activada"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toca para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"La conexión compartida está inhabilitada"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Unidad USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Almacenamiento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alerta sobre el uso de datos"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Toca para ver uso y ajustes."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Límite de datos 2G-3G alcanzado"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Límite de datos 4G alcanzado"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Advertencia de datos"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Has usado <xliff:g id="APP">%s</xliff:g> de datos"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Límite de datos móviles alcanzado"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Límite de datos Wi-Fi alcanzado"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Datos pausados resto del ciclo"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Límite de datos 2G-3G superado"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Límite de datos 4G superado"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Límite de datos móviles superado"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Límite de datos Wi-Fi superado"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Límite superado en <xliff:g id="SIZE">%s</xliff:g>"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Se han pausado los datos para el resto del ciclo"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Límite de datos móviles superado"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Límite de datos Wi-Fi superado"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Has superado en <xliff:g id="SIZE">%s</xliff:g> el límite establecido"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Datos en segundo plano restringidos"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Toca para quitar la restricción."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Uso de datos elevado"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Tu uso de datos ha sido más elevado de lo normal en los últimos días. Toca para ver detalles sobre el uso y ajustes."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Uso elevado de datos móviles"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Tus aplicaciones han usado más datos de lo habitual"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ha usado más datos de lo habitual"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificado de seguridad"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Este certificado es válido."</string>
<string name="issued_to" msgid="454239480274921032">"Emitido para:"</string>
@@ -1669,7 +1691,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado por el administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado por el administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado por el administrador"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Para mejorar la duración de la batería, la función Ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de los datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función Ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Para aumentar la duración de la batería, la función Ahorro de batería reduce el rendimiento del dispositivo y limita o desactiva la vibración, los servicios de ubicación y los datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función Ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
<string name="data_saver_description" msgid="6015391409098303235">"El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
@@ -1681,9 +1703,9 @@
<item quantity="other">Durante %1$d minuto (hasta las <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Durante 1 minuto (hasta las <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">Durante %1$d horas (hasta las <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante una hora (hasta las <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">Durante %1$d horas (hasta las <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Durante 1 hora (hasta las <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Durante %1$d horas (hasta las <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1719,9 @@
<item quantity="other">Durante %d minutos</item>
<item quantity="one">Durante 1 minuto</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">Durante %d horas</item>
- <item quantity="one">Durante una hora</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">Durante %d horas</item>
+ <item quantity="one">Durante 1 hora</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Durante %d horas</item>
@@ -1720,14 +1742,14 @@
<string name="muted_by" msgid="6147073845094180001">"Silenciado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Se ha producido un problema interno en el dispositivo y es posible que este no sea estable hasta que restablezcas el estado de fábrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Se ha producido un problema interno en el dispositivo. Ponte en contacto con el fabricante para obtener más información."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"La solicitud USSD se ha modificado para la solicitud DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"La solicitud USSD se ha modificado para la solicitud SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"La solicitud USSD se ha modificado para la nueva solicitud USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"La solicitud USSD se ha modificado para la solicitud DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La solicitud SS se ha modificado para la solicitud DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"La solicitud SS se ha modificado para la solicitud DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La solicitud SS se ha modificado para la solicitud USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La solicitud SS se ha modificado para la nueva solicitud SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Se ha cambiado la solicitud de USSD a una llamada normal"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Se ha cambiado la solicitud de USSD a una solicitud de SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Se ha cambiado a una nueva solicitud de USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Se ha cambiado la solicitud de USSD a una videollamada"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Se ha cambiado la solicitud de SS a una llamada normal"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Se ha cambiado la solicitud de SS a una videollamada"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Se ha cambiado la solicitud de SS a una solicitud de USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Se ha cambiado a una nueva solicitud de SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabajo"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Mostrar"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Ocultar"</string>
@@ -1837,7 +1859,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Se ha detectado una aplicación dañina"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quiere mostrar fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Las llamadas y las notificaciones vibrarán"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Las llamadas y las notificaciones se silenciarán"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Cambios del sistema"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"No molestar"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"El modo No molestar oculta las notificaciones para no distraerte"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este comportamiento es nuevo. Toca para cambiarlo."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ha cambiado el modo No molestar"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toca para consultar los ajustes de comportamiento de las interrupciones"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toca para consultar lo que se está bloqueando."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 3f99415489d3..a307784f26b1 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Helistaja ID pole vaikimisi piiratud. Järgmine kõne: pole piiratud"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Teenus pole ette valmistatud."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Helistaja ID seadet ei saa muuta."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Andmesideteenus puudub"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Hädaabikõned on blokeeritud"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Mobiilne andmesideteenus puudub"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Hädaabikõned pole saadaval"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Häälkõned pole saadaval"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Häälkõned/hädaabiteenus pole saadaval"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Teie asukoha mobiilsidevõrk seda teenust ajutiselt ei paku"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Võrguga ei saa ühendust"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Vastuvõtu parandamiseks muutke valitud tüüpi jaotises Seaded &gt; Võrk ja Internet &gt; Mobiilsidevõrgud &gt; Eelistatud võrgutüüp."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"WiFi-kõned on aktiivsed"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Hädaabikõnede jaoks on vajalik mobiilsidevõrk."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Häälteenused ja hädaabikõned puuduvad"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Operaator on ajutiselt välja lülitanud"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobiilsidevõrguga ei saa ühendust"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Proovige eelistatud võrku vahetada. Puudutage muutmiseks."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hädaabikõned pole saadaval"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"WiFi kaudu ei saa hädaabikõnesid teha"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Teatised"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Kõnede suunamine"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hädaolukorra tagasihelistusrežiim"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Rändluse bänner sees"</string>
<string name="roamingText12" msgid="1189071119992726320">"Rändlusbänner väljas"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Teenuse otsimine"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"WiFi-kõned"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"WiFi-võrgu kaudu helistamiseks ja sõnumite saatmiseks paluge operaatoril esmalt see teenus seadistada. Seejärel lülitage WiFi-kõned menüüs Seaded uuesti sisse. (Veakood: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registreerige operaatori juures (veakood: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s WiFi kaudu helistamine"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Töötlemisel on liiga palju taotlusi. Proovige hiljem uuesti."</string>
<string name="notification_title" msgid="8967710025036163822">"Viga kontole <xliff:g id="ACCOUNT">%1$s</xliff:g> sisselogimisel"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sünkroonimine"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sünkroonimine"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Liiga palju üksuse <xliff:g id="CONTENT_TYPE">%s</xliff:g> kustutusi."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Ei saa sünkroonida"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Üritati kustutada liiga palju üksusi <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tahvelarvuti mäluruum on täis. Ruumi vabastamiseks kustutage mõned failid."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Kella talletusruum on täis. Ruumi vabastamiseks kustutage mõned failid."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Teleri salvestusruum on täis. Kustutage mõni fail ruumi vabastamiseks."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Teie tööprofiili administraator"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Domeen: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Tööprofiil on kustutatud"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Tööprofiil on kustutatud puuduva administraatori rakenduse tõttu"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Tööprofiili administraatori rakendus puudub või on rikutud. Seetõttu on teie tööprofiil ja seotud andmed kustutatud. Abi saamiseks võtke ühendust administraatoriga."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Teie tööprofiil pole selles seadmes enam saadaval"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Liiga palju paroolikatseid"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Seade on hallatud"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Teie organisatsioon haldab seda seadet ja võib jälgida võrguliiklust. Puudutage üksikasjade vaatamiseks."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Seade kustutatakse"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Administraatori rakendust ei saa kasutada. Teie seade kustutatakse.\n\nKüsimuste korral pöörduge organisatsiooni administraatori poole."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Administraatori rakendust ei saa kasutada. Teie seade tühjendatakse nüüd.\n\nKui teil on küsimusi, võtke ühendust organisatsiooni administraatoriga."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Rakendus <xliff:g id="OWNER_APP">%s</xliff:g> on printimise keelanud."</string>
<string name="me" msgid="6545696007631404292">"Mina"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tahvelarvuti valikud"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lennurežiim"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lennurežiim on SEES"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lennurežiim on VÄLJAS"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Akusäästja"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Akusäästja on VÄLJA lülitatud"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Akusäästja on SISSE lülitatud"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Seaded"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Abi"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Häälabi"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Lülitu tööprofiilile"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktid"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"juurdepääs kontaktidele"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Lubage rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs kontaktidele"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs teie kontaktidele?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Asukoht"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pääseda juurde selle seadme asukohale"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Lubage rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs selle seadme asukohale"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs selle seadme asukohale?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"juurdepääs kalendrile"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Lubage rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs kalendrile"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs teie kalendrile?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"saata ja vaadata SMS-sõnumeid"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Lubage rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; saata ja vaadata SMS-sõnumeid"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Kas lubada rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; saata ja vaadata SMS-sõnumeid?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Mäluruum"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"juurdepääs seadmesse salvestatud fotodele, meediasisule ja failidele"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Lubage rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs seadmes olevatele fotodele, meediale ja failidele"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs seadmes olevatele fotodele, meediale ja failidele?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"heli salvestamine"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Lubage rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; salvestada heli"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Kas lubada rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; salvestada heli?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kaamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"pildistamine ja video salvestamine"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Lubage rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; jäädvustada pilte ja salvestada videoid"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Kas lubada rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; jäädvustada pilte ja salvestada videoid?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"helistamine ja telefonikõnede haldamine"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Lubage rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; teha ja hallata telefonikõnesid"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Kas lubada rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; teha ja hallata telefonikõnesid?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kehaandurid"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"juurdepääs anduri andmetele teie eluliste näitajate kohta"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Lubage rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs anduri andmetele teie eluliste näitajate kohta"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs anduri andmetele teie eluliste näitajate kohta?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Akna sisu toomine"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kasutatava akna sisu kontrollimine."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Puudutusega sirvimise sisselülitamine"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Liigutuste tegemine"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Saate puudutada, pühkida, sõrmi kokku-lahku liigutada ja teisi liigutusi teha."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Sõrmejälje liigutused"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Teil on võimalik jäädvustada liigutused, mis on tehtud seadmete sõrmejäljeanduri abil."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Teil on võimalik jäädvustada seadme sõrmejäljeanduril tehtud liigutused."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"keela või muuda olekuriba"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Võimaldab rakendusel keelata olekuriba või lisada ja eemaldada süsteemiikoone."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"olekuribana kuvamine"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Võimaldab rakendusel muuta oma osi mälus püsivaks. See võib piirata teistele (tahvelarvutit aeglasemaks muutvatele) rakendustele saadaolevat mälu."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Lubab rakendusel muuta enda osasid mälus püsiüksusteks. See võib piirata teistele rakendustele saadaolevat mälumahtu ja muuta teleri aeglasemaks."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Võimaldab rakendusel muuta oma osi mälus püsivaks. See võib piirata teistele (telefoni aeglasemaks muutvatele) rakendustele saadaolevat mälu."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"käita esiplaanil olevat teenust"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Lubab rakendusel kasutada esiplaanil olevaid teenuseid."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"Rakenduse mäluruumi mõõtmine"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Võimaldab rakendusel tuua oma koodi, andmed ja vahemälu suurused"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"muutke süsteemi seadeid"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mustriga avamine."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Näoga avamine."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-koodiga avamine."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM-kaardi PIN-koodiga avamine."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM-kaardi PUK-koodiga avamine."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Parooliga avamine."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mustri ala."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Lohistamisala."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Lõikelauale kopeeritud tekst."</string>
<string name="more_item_label" msgid="4650918923083320495">"Rohkem"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menüü+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Tõstuklahv +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funktsiooniklahv +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"tühik"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"sisestusklahv"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"kustuta"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Otsi värskendust"</string>
<string name="smv_application" msgid="3307209192155442829">"Rakendus <xliff:g id="APPLICATION">%1$s</xliff:g> (protsess <xliff:g id="PROCESS">%2$s</xliff:g>) on rikkunud isekehtestatud StrictMode\'i eeskirju."</string>
<string name="smv_process" msgid="5120397012047462446">"Protsess <xliff:g id="PROCESS">%1$s</xliff:g> on rikkunud isejõustatud StrictMode\'i eeskirju."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android viiakse üle uuemale versioonile ..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android käivitub ..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefoni värskendatakse …"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tahvelarvutit värskendatakse …"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Seadet värskendatakse …"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon käivitub …"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tahvelarvuti käivitub …"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Seade käivitub …"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Salvestusruumi optimeerimine."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Androidi värskenduse lõpetamine …"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Mõned rakendused ei pruugi enne uuemale versioonile ülemineku lõpetamist korralikult töötada"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Süsteemivärskenduse lõpuleviimine …"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Rakenduse <xliff:g id="APPLICATION">%1$s</xliff:g> versiooni uuendatakse …"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g>. rakenduse <xliff:g id="NUMBER_1">%2$d</xliff:g>-st optimeerimine."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Rakenduse <xliff:g id="APPNAME">%1$s</xliff:g> ettevalmistamine."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Rakenduste käivitamine."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Käivitamise lõpuleviimine."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> töötab"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Puudutage mängu naasmiseks"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Valige mäng"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Toimivuse parandamiseks saab korraga olla avatud vaid üks neist mängudest."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Mine tagasi rakendusse <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Ava rakendus <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"Rakendus <xliff:g id="OLD_APP">%1$s</xliff:g> suletakse salvestamata"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Protsess <xliff:g id="PROC">%1$s</xliff:g> ületas mälupiirangu"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Mälutõmmis salvestati; puudutage jagamiseks"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Mälutõmmis salvestati. Puudutage jagamiseks."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Kas jagada mälutõmmist?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Protsess <xliff:g id="PROC">%1$s</xliff:g> ületas protsessi mälupiirangu <xliff:g id="SIZE">%2$s</xliff:g>. Saate mälutõmmist jagada selle arendajaga. Olge ettevaatlik: see mälutõmmis võib sisaldada teie isiklikke andmeid, millele rakendusel on juurdepääs."</string>
<string name="sendText" msgid="5209874571959469142">"Valige teksti jaoks toiming"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Looge ühendus avatud WiFi-võrguga"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Ühendatud operaatori WiFi-võrguga"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ühenduse loomine avatud WiFi-võrguga"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ühendatud WiFi-võrguga"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"WiFi-võrguga ei õnnestunud ühendust luua"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Puudutage kõikide võrkude nägemiseks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Ühenda"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Kõik võrgud"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Kõik võrgud"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WiFi lülitub sisse automaatselt"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kui olete kvaliteetse salvestatud võrgu läheduses"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ära lülita tagasi sisse"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Taaskäivita"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobiilsideteenuse aktiveerimine"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Laadige alla operaatori rakendus, et aktiveerida oma uus SIM-kaart"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Uue SIM-kaardi aktiveerimiseks laadige alla rakendus <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Laadi alla rakendus"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Uus SIM-kaart on sisestatud"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Puudutage seadistamiseks"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP USB kaudu on sisse lülitatud"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB kaudu jagamine on sisse lülitatud"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI USB kaudu on sisse lülitatud"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-lisaseadme režiim on sisse lülitatud"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB lisatarvik on ühendatud"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Puudutage lisavalikute nägemiseks."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Ühendatud seadet laetakse. Puudutage lisavalikute nägemiseks."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Tuvastati analoogne helitarvik"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Ühendatud seade ei ühildu selle telefoniga. Puudutage lisateabe saamiseks."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-silumine ühendatud"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Puudutage USB-silumise keelamiseks."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Puudutage USB silumise väljalülitamiseks"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Valige USB silumise keelamiseks"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Veaaruande võtmine …"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Kas jagada veaaruannet?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Rakendus <xliff:g id="NAME">%s</xliff:g> kuvatakse teiste rakenduste peal"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> kuvat. teiste rakenduste peal"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Kui te ei soovi, et rakendus <xliff:g id="NAME">%s</xliff:g> seda funktsiooni kasutaks, puudutage seadete avamiseks ja lülitage see välja."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"LÜLITA VÄLJA"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Lülita välja"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Üksuse <xliff:g id="NAME">%s</xliff:g> ettevalmistamine"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Vigade kontrollimine"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Tuvastati uus üksus <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Ühendamine alati sees VPN-iga …"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Ühendatud alati sees VPN-iga"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Ühendus alati sisselülitatud VPN-iga katkestati"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Alati sees VPN-i viga"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Alati sisselülitatud VPN-iga ei saanud ühendada"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Vahetage võrku või muutke VPN-i seadeid"</string>
<string name="upload_file" msgid="2897957172366730416">"Valige fail"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ühtegi faili pole valitud"</string>
<string name="reset" msgid="2448168080964209908">"Lähtesta"</string>
<string name="submit" msgid="1602335572089911941">"Saada"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Autorežiim lubatud"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Puudutage autorežiimist väljumiseks."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Sõidurakendus töötab"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Puudutage sõidurakendusest väljumiseks."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Jagamine või kuumkoht on aktiivne"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Puudutage seadistamiseks."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Jagamine on keelatud"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Tootja <xliff:g id="MANUFACTURER">%s</xliff:g> USB-ketas"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-mäluseade"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Muuda"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Andmekasutuse hoiatus"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Puudutage kasutuse/seadete vaat."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-, 3G-andmeside limiit on täis"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G-andmeside limiit on täis"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Andmekasutuse hoiatus"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Olete kasutanud <xliff:g id="APP">%s</xliff:g> andmemahtu"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Jõuds. mob. andmemahupiiranguni"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"WiFi-andmeside limiit on täis"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Andmed on ülej. tsükliks peatat."</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G andmemahupiirang ületatud"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G andmemahupiirang ületatud"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobiilne andmemahupiirang ületatud"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"WiFi-andmete piir on ületatud"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> üle määratud piirmäära."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Andmekasutus on ülejäänud tsükliks peatatud"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Üle mobiilse andmeside limiidi"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Üle teie WiFi andmekas. limiidi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Olete oma määratud limiidi ületanud <xliff:g id="SIZE">%s</xliff:g> võrra"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Taustandmed on piiratud"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Puudut. piirangu eemaldamiseks."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Suur andmekasutus"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Teie andmekasutus on viimastel päevadel tavapärasest suurem. Puudutage kasutuse ja seadete vaatamiseks."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Kõrge mobiilse andmeside kasutus"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Teie rakendused on kasutanud tavapärasest rohkem andmemahtu"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Rakendus <xliff:g id="APP">%s</xliff:g> on kasutanud tavapärasest rohkem andmemahtu"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Turvasertifikaat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"See sertifikaat on kehtiv."</string>
<string name="issued_to" msgid="454239480274921032">"Väljastatud subjektile:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administraator on selle installinud"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administraator on seda värskendanud"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administraator on selle kustutanud"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Aku tööea parandamiseks vähendab akusäästja teie seadme toimivust ning piirab vibratsiooni, asukohateenuseid ja suuremat osa taustaandmetest. E-posti, sõnumsidet ja muid sünkroonimisele tuginevaid rakendusi võidakse värskendada ainult siis, kui need avate.\n\nSeadme laadimise ajal lülitatakse akusäästja automaatselt välja."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Andmekasutuse vähendamiseks keelab andmeside mahu säästja mõne rakenduse puhul andmete taustal saatmise ja vastuvõtmise. Rakendus, mida praegu kasutate, pääseb andmesidele juurde, kuid võib seda teha väiksema sagedusega. Seetõttu võidakse näiteks kujutised kuvada alles siis, kui neid puudutate."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Lül. andmemahu säästja sisse?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Lülita sisse"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d min (kuni <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">1 min (kuni <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d tunniks (kuni <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Üheks tunniks (kuni <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">1 tunniks (kuni <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d h (kuni <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">%d min</item>
<item quantity="one">1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d tunniks</item>
- <item quantity="one">Üheks tunniks</item>
+ <item quantity="one">1 tunniks</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d h</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vaigistas"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Seadmes ilmnes sisemine probleem ja seade võib olla ebastabiilne seni, kuni lähtestate seadme tehase andmetele."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Seadmes ilmnes sisemine probleem. Üksikasjaliku teabe saamiseks võtke ühendust tootjaga."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-päring muudeti DIAL-päringuks."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-päring muudeti SS-päringuks."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-päring muudeti uueks USSD-päringuks."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-taotlus muudeti video DIAL-taotluseks."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-päring muudeti DIAL-päringuks."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-taotlus muudeti video DIAL-taotluseks."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-päring muudeti USSD-päringuks."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-päring muudeti uueks SS-päringuks."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Tööprofiil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Laienda"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Ahenda"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Tuvastati kahjulik rakendus"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Rakendus <xliff:g id="APP_0">%1$s</xliff:g> soovib näidata rakenduse <xliff:g id="APP_2">%2$s</xliff:g> lõike"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Muutmine"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Kõnede ja märguannete puhul seade vibreerib"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Kõned ja märguanded on vaigistatud"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Süsteemi muudatused"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Mitte segada"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Režiim Mitte segada peidab märguanded, et saaksite keskenduda"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"See on uus käitumine. Puudutage muutmiseks."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režiimi Mitte segada muudeti"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Puudutage katkestuste käitumise seadete kontrollimiseks"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Puudutage, et kontrollida, mis on blokeeritud."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Süsteem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Seaded"</string>
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 0bf480296b88..783d05b1e9d7 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -77,19 +77,19 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Deien identifikazio-zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenik gabe"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Zerbitzua ez da hornitu."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Ezin duzu deien identifikazio-zerbitzuaren ezarpena aldatu."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Ez dago datu-zerbitzurik"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Ezin da egin larrialdi-deirik"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Ez dago mugikorreko datu-zerbitzurik"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Ezin da egin larrialdi-deirik"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ez dago ahots-deien zerbitzurik"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ez dago ahots- edo larrialdi-deien zerbitzurik"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Zauden tokiko sare mugikorrak ez du eskaintzen aukera hori une honetan"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ezin da konektatu sarera"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Seinalea hobea izan dadin, aldatu sare mota Ezarpenak &gt; Sareak eta Internet &gt; Sare mugikorrak &gt; Sare mota hobetsia atalean."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi bidezko deiak aktibo daude"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Sare mugikorrera konektatuta egon behar da larrialdi-deiak egin ahal izateko."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ez dago ahozko zerbitzurik eta ezin da egin larrialdi-deirik"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Operadoreak desaktibatu egin du aldi baterako"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Ezin da konektatu sare mugikorrera"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Aldatu sare hobetsia. Sakatu aldatzeko."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Ezin da egin larrialdi-deirik"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Ezin duzu egin larrialdi-deirik Wi-Fi bidez"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertak"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Dei-desbideratzea"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Larrialdi-deiak soilik jasotzeko modua"</string>
- <string name="notification_channel_mobile_data_status" msgid="4575131690860945836">"Datu mugikorren egoera"</string>
+ <string name="notification_channel_mobile_data_status" msgid="4575131690860945836">"Datu-konexioaren egoera"</string>
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS mezuak"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Erantzungailuko mezuak"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi bidezko deiak"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Ibiltaritzari buruzko jakinarazpena aktibatuta"</string>
<string name="roamingText12" msgid="1189071119992726320">"Ibiltaritzari buruzko jakinarazpena desaktibatuta"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Zerbitzu bila"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi bidezko deiak"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wi-Fi bidezko deiak Ezarpenak atalean. (Errore-kodea: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Erregistratu operadorearekin (Errore-kodea: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi bidezko deiak"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Eskaera gehiegi prozesatzen ari dira. Saiatu berriro geroago."</string>
<string name="notification_title" msgid="8967710025036163822">"Errore bat gertatu da <xliff:g id="ACCOUNT">%1$s</xliff:g> kontuan saioa hastean"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinkronizatu"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkronizazioa"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> gehiegi ezabatu dira."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Ezin da sinkronizatu"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> gehiegi ezabatzen saiatu zara."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tabletaren memoria beteta dago. Tokia egiteko, ezabatu fitxategi batzuk."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Erlojuaren memoria beteta dago. Tokia egiteko, ezabatu fitxategi batzuk."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Telebistaren memoria beteta dago. Tokia egiteko, ezabatu fitxategi batzuk."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Laneko profilen administratzaileak"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> da arduraduna"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Laneko profila ezabatu egin da"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Laneko profila ezabatu egin da hura administratzeko aplikazioa falta delako"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Laneko profila administratzeko aplikazioa falta da edo hondatuta dago. Ondorioz, ezabatu egin dira laneko profila bera eta harekin erlazionatutako datuak. Laguntza lortzeko, jarri administratzailearekin harremanetan."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Laneko profila ez dago erabilgarri gailu honetan"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Gehiegitan saiatu zara pasahitza idazten"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Jabeak kudeatzen du gailua"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Erakundeak kudeatzen du gailua eta baliteke sareko trafikoa gainbegiratzea. Sakatu hau xehetasunak ikusteko."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Gailuko datuak ezabatu egingo dira"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Ezin da erabili administratzeko aplikazioa. Ezabatu egingo da gailuko eduki guztia.\n\nZalantzarik baduzu, jarri erakundeko administratzailearekin harremanetan."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Ezin da erabili administratzeko aplikazioa. Ezabatu egingo da gailuko eduki guztia.\n\nZalantzarik baduzu, jarri erakundeko administratzailearekin harremanetan."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> aplikazioak desgaitu egin du inprimatzeko aukera."</string>
<string name="me" msgid="6545696007631404292">"Ni"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tabletaren aukerak"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Hegaldi modua"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hegaldi modua AKTIBATUTA dago"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Hegaldi modua DESAKTIBATUTA dago"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Bateria-aurrezlea"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"DESAKTIBATUTA dago bateria-aurrezlea"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"AKTIBATUTA dago bateria-aurrezlea"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ezarpenak"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Lagundu"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ahots-laguntza"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Aldatu laneko profilera"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktuak"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"atzitu kontaktuak"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Baimendu kontaktuak atzitzea &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari kontaktuak atzitzea baimendu nahi diozu?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Kokapena"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"atzitu gailuaren kokapena"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Baimendu gailuaren kokapena atzitzea &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari gailuaren kokapena atzitzea baimendu nahi diozu?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Egutegia"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"atzitu egutegia"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Baimendu egutegia atzitzea &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari egutegia atzitzea baimendu nahi diozu?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS mezuak"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"bidali eta ikusi SMS mezuak"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Baimendu SMS mezuak bidaltzea eta ikustea &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari SMS mezuak bidaltzea eta ikustea baimendu nahi diozu?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Memoria"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"atzitu gailuko argazkiak, multimedia-edukia eta fitxategiak"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Baimendu gailuko argazkiak, multimedia-edukia eta fitxategiak atzitzea &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari gailuko argazkiak, multimedia-edukia eta fitxategiak atzitzea baimendu nahi diozu?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofonoa"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"grabatu audioa"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Baimendu audioa grabatzea &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari audioa grabatzea baimendu nahi diozu?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"atera argazkiak eta grabatu bideoak"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Baimendu argazkiak ateratzea eta bideoak grabatzea &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari argazkiak ateratzea eta bideoak grabatzea baimendu nahi diozu?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefonoa"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"egin eta kudeatu telefono-deiak"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Baimendu telefono-deiak egitea eta kudeatzea &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari telefono-deiak egitea eta kudeatzea baimendu nahi diozu?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Gorputz-sentsoreak"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"atzitu bizi-konstanteei buruzko sentsore-datuak"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Baimendu bizi-konstanteei buruzko sentsore-datuak atzitzea &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari bizi-konstanteei buruzko sentsore-datuak atzitzea baimendu nahi diozu?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Eskuratu leihoko edukia"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Arakatu irekita daukazun leihoko edukia."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktibatu \"Arakatu ukituta\""</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Keinuak egin"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Sakatu, lerratu, atximurkatu eta beste hainbat keinu egin ditzake."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Hatz-marken keinuak"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Gailuaren hatz-marken sentsorean egindako keinuak antzeman ditzake."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Gailuaren hatz-marken sentsorean egindako keinuak antzeman ditzake."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desgaitu edo aldatu egoera-barra"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Egoera-barra desgaitzea edo sistema-ikonoak gehitzea edo kentzea baimentzen die aplikazioei."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"bihurtu egoera-barra"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta tableta motel daiteke."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Beren zati batzuk memorian modu iraunkorrean aktibo uztea baimentzen die aplikazioei. Horrela, beste aplikazioek memoria gutxiago izan lezakete erabilgarri eta telebistak motelago funtziona lezake."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta telefonoa motel daiteke."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"Exekutatu zerbitzuak aurreko planoan"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Aurreko planoko zerbitzuak erabiltzea baimentzen dio aplikazioari."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"neurtu aplikazioen biltegiratze-tokia"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Bere kodea, datuak eta cache-tamainak eskuratzea baimentzen die aplikazioei."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"aldatu sistemaren ezarpenak"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ereduaren bidez desblokeatzea."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Aurpegiaren bidez desblokeatzea."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN kodearen bidez desblokeatzea."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM txartela desblokeatzeko PIN kodea."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM txartela desblokeatzeko PUK kodea."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Pasahitzaren bidez desblokeatzea."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Eredua marrazteko eremua."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Hatza lerratzeko eremua."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Testua arbelean kopiatu da."</string>
<string name="more_item_label" msgid="4650918923083320495">"Gehiago"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menua+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ktrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Maius +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funtzioa +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"zuriunea tekla"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"sartu tekla"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ezabatu"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Bilatu eguneratzea"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> aplikazioak (<xliff:g id="PROCESS">%2$s</xliff:g> prozesua) berak aplikatutako StrictMode gidalerroa urratu du."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> prozesuak bere kabuz ezarritako StrictMode gidalerroak urratu ditu."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android bertsio-berritzen ari da…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android abiarazten ari da…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefonoa eguneratzen ari da…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tableta eguneratzen ari da…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Gailua eguneratzen ari da…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefonoa abiarazten ari da…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tableta abiarazten ari da…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Gailua abiarazten ari da…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Memoria optimizatzen."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android eguneratzen amaitzen…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Aplikazio batzuek agian ez dute behar bezala funtzionatuko bertsioa berritzen amaitu arte"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Sistema eguneratzen amaitzen…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> bertsio-berritzen ari da…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g> aplikazio optimizatzen."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> prestatzen."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Aplikazioak abiarazten."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Bertsio-berritzea amaitzen."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> exekutatzen"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Sakatu jokora itzultzeko"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Aukeratu joko bat"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Funtzionamendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Itzuli <xliff:g id="OLD_APP">%1$s</xliff:g> aplikaziora"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Ireki <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"Gorde gabe itxiko da <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> prozesuak memoria-muga gainditu du"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Uneko memoria-prozesuaren txostena sortu da; sakatu partekatzeko"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Sortu da uneko memoria-prozesuaren txostena. Sakatu partekatzeko."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Uneko memoria-prozesuaren txostena partekatu nahi duzu?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> prozesuak memoria-prozesuaren muga (<xliff:g id="SIZE">%2$s</xliff:g>) gainditu du. Uneko memoria-prozesuaren txostena sortu da, garatzailearekin parteka dezazun. Kontuz ibili: txosten horrek aplikazioak atzi dezakeen informazio pertsonala izan dezake."</string>
<string name="sendText" msgid="5209874571959469142">"Aukeratu testurako ekintza"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Konektatu Wi‑Fi sare irekira"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Konektatu operadorearen Wi‑Fi sarera"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Wi‑Fi sare irekira konektatzen"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi sare irekira konektatuta"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Ezin izan da konektatu Wi‑Fi sare irekira"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Sakatu hau sare guztiak ikusteko"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Konektatu"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Sare guztiak"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sare guztiak"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi konexioa automatikoki aktibatuko da"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Gordeta daukazun kalitate handiko sare batetik gertu zaudenean"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ez aktibatu berriro"</string>
@@ -1154,7 +1163,7 @@
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> Internetera konektatzeko gauza ez denean, <xliff:g id="NEW_NETWORK">%1$s</xliff:g> erabiltzen du gailuak. Agian kostuak ordaindu beharko dituzu."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> erabiltzen ari zinen, baina <xliff:g id="NEW_NETWORK">%2$s</xliff:g> erabiltzen ari zara orain"</string>
<string-array name="network_switch_type_name">
- <item msgid="3979506840912951943">"datu mugikorrak"</item>
+ <item msgid="3979506840912951943">"datu-konexioa"</item>
<item msgid="75483255295529161">"Wi-Fi"</item>
<item msgid="6862614801537202646">"Bluetooth"</item>
<item msgid="5447331121797802871">"Ethernet"</item>
@@ -1203,8 +1212,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM txartela gehitu da"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Berrabiarazi gailua sare mugikorra atzitzeko."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Berrabiarazi"</string>
- <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktibatu zerbitzu mugikorra"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktibatu mugikorreko zerbitzua"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Deskargatu operadorearen aplikazioa SIM berria aktibatzeko"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Deskargatu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioa SIM berria aktibatzeko"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Deskargatu aplikazioa"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM berria sartu da"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Sakatu konfiguratzeko"</string>
@@ -1223,13 +1233,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Aktibatuta dago USB bidezko PTP modua"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Aktibatuta dago USB bidez konexioa partekatzeko aukera"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Aktibatuta dago USB bidezko MIDI modua"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Aktibatuta dago USB osagarriaren modua"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB osagarri bat konektatu da"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Sakatu aukera gehiago ikusteko."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Konektatutako gailua kargatzen ari da. Sakatu aukera gehiago ikusteko."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Audio-osagarri analogiko bat hauteman da"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Erantsitako gailua ez da telefono honekin bateragarria. Sakatu informazio gehiago lortzeko."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB arazketa konektatuta"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Sakatu USB arazketa desgaitzeko."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Sakatu USB arazketa desaktibatzeko"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Hautatu USB arazketa desgaitzeko."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Akatsen txostena sortzen…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Akatsen txostena partekatu nahi duzu?"</string>
@@ -1248,7 +1258,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> aplikazioen gainean agertzea"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Besteen gainean agertzen da <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESAKTIBATU"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desaktibatu"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> prestatzen"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Errorerik dagoen egiaztatzen"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> berria hauteman da"</string>
@@ -1334,14 +1344,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Beti aktibatuta dagoen VPNa konektatzen…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Beti aktibatuta dagoen VPNa konektatu da"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Beti aktibatuta dagoen VPN sarea deskonektatuta dago"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Beti aktibatuta dagoen VPN errorea"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Ezin izan da konektatu beti aktibatuta dagoen VPN sarera"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Aldatu sarearen edo VPN sarearen ezarpenak"</string>
<string name="upload_file" msgid="2897957172366730416">"Aukeratu fitxategia"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ez da fitxategirik aukeratu"</string>
<string name="reset" msgid="2448168080964209908">"Berrezarri"</string>
<string name="submit" msgid="1602335572089911941">"Bidali"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Auto modua gaituta"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Sakatu auto modutik irteteko."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Abian da gidatzeko aplikazioa"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Sakatu gidatzeko aplikaziotik irteteko."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Konexioa partekatzea edo sare publikoa aktibo"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Sakatu konfiguratzeko."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Desgaituta dago konexioa partekatzeko aukera"</string>
@@ -1419,22 +1429,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB unitatea"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB memoria"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editatu"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Datuen erabilerari buruzko alerta"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Sakatu erabilera eta ezarpenak ikusteko."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2-3 GB-ko mugara iritsi zara"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4 GB-ko mugara iritsi zara"</string>
- <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Datu mugikorren mugara iritsi zara"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Datuen erabileraren abisua"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> erabili dituzu"</string>
+ <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Datu-konexioaren mugara iritsi zara"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi datuen mugara iritsi zara"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Datuen erab. etenda zikloa amaitu arte"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G datu-muga gainditu da"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G datu-muga gainditu da"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Datu mugikorren muga gainditu da"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi datuen muga gainditu da"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Zehaztutako muga baino <xliff:g id="SIZE">%s</xliff:g> gehiago."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Datuak pausatu egin dira zikloaren gainerako aldirako"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Datu-konexioaren muga gainditu duzu"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi datuen muga gainditu duzu"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Ezarritako muga baino <xliff:g id="SIZE">%s</xliff:g> gehiago erabili dituzu"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Atzeko planoko datuak murriztuta"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Sakatu murriztapena kentzeko."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Datu asko erabili dira"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Ohikoa baino datu kopuru handiagoa erabili duzu azken egunetan. Sakatu erabilera eta ezarpenak ikusteko."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Datu-konexioaren erabilera handia"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Aplikazioek ohikoa baino datu gehiago erabili dituzte"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> aplikazioak ohikoa baino datu gehiago erabili ditu"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Segurtasun-ziurtagiria"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ziurtagiria baliozkoa da."</string>
<string name="issued_to" msgid="454239480274921032">"Honi jaulkia:"</string>
@@ -1670,7 +1677,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administratzaileak instalatu du"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administratzaileak eguneratu du"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administratzaileak ezabatu du"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Bateriak gehiago iraun dezan, bateria-aurrezleak murriztu egiten du gailuaren errendimendua, eta mugatu egiten ditu dardara, kokapen-zerbitzuak eta atzeko planoko datu-erabilera gehienak. Ireki ezean, ez dira eguneratuko posta elektronikoa, mezuak eta sinkronizatzen diren gainerako zerbitzuak.\n\nGailua kargatzen hasten denean, automatikoki desaktibatzen da bateria-aurrezlea."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Unean erabiltzen ari zaren aplikazioak atzi ditzake datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Datu-aurrezlea aktibatu?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktibatu"</string>
@@ -1682,9 +1690,9 @@
<item quantity="other">%1$d minutuz (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> arte)</item>
<item quantity="one">Minutu batez (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> arte)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d orduz (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> arte)</item>
- <item quantity="one">Ordubetez (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> arte)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d ordu (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> arte)</item>
+ <item quantity="one">Ordubete (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> arte)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d orduz (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> arte)</item>
@@ -1698,9 +1706,9 @@
<item quantity="other">%d minutuz</item>
<item quantity="one">Minutu batez</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">%d orduz</item>
- <item quantity="one">Ordubetez</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d ordu</item>
+ <item quantity="one">Ordubete</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d orduz</item>
@@ -1721,14 +1729,22 @@
<string name="muted_by" msgid="6147073845094180001">"Audioa desaktibatu da (<xliff:g id="THIRD_PARTY">%1$s</xliff:g>)"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Barneko arazo bat dago zure gailuan eta agian ezegonkor egongo da jatorrizko datuak berrezartzen dituzun arte."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Barneko arazo bat dago zure gailuan. Xehetasunak jakiteko, jarri fabrikatzailearekin harremanetan."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD eskaera DIAL eskaerara aldatu da."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD eskaera SS eskaerara aldatu da."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD eskaera USSD eskaera berrira aldatu da."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD eskaera Video DIAL eskaerara aldatu da."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS eskaera DIAL eskaerara aldatu da."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS eskaera Video DIAL eskaerara aldatu da."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS eskaera USSD eskaerara aldatu da."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS eskaera SS eskaera berrira aldatu da."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profila"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Zabaldu"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Tolestu"</string>
@@ -1838,7 +1854,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplikazio kaltegarri bat hauteman da"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> aplikazioak <xliff:g id="APP_2">%2$s</xliff:g> aplikazioaren zatiak erakutsi nahi ditu"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editatu"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Dar-dar egingo du deiak eta jakinarazpenak jasotzean"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Ez da joko tonurik deiak eta jakinarazpenak jasotzean"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistema-aldaketak"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ez molestatu"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"\"Ez molestatu\" modua jakinarazpenak ezkutatzen ari da arreta gal ez dezazun"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Berria da portaera hau. Sakatu aldatzeko."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Ez molestatu\" modua aldatu da"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Sakatu etenaldietarako ezarri den jokabidea ikusteko"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Sakatu zer dagoen blokeatuta ikusteko."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Ezarpenak"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 9dc6e95d3dea..a22e74132033 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Soittajan tunnukseksi muutetaan rajoittamaton. Seuraava puhelu: ei rajoitettu"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Palvelua ei tarjota."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Et voi muuttaa soittajan tunnuksen asetusta."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Ei datayhteyttä"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Ei hätäpuheluita"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Ei mobiilidatapalvelua"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Hätäpuhelut eivät ole käytettävissä"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ei äänipuheluja"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ei ääni- tai hätäpuheluja"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Sijaintisi mobiiliverkko ei tarjoa tätä tilapäisesti."</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ei yhteyttä verkkoon"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Voit yrittää parantaa kuuluvuutta vaihtamalla tyypin asetusta. Valitse Asetukset &gt; Verkko &gt; Internet &gt; Mobiiliverkot &gt; Ensisijainen verkko."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi-puhelut käytössä"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Hätäpuheluihin vaaditaan mobiiliverkko."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ei äänipalvelua tai hätäpuheluita"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Operaattorin tilapäisesti käytöstä poistama"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobiiliverkkoon ei saada yhteyttä"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Kokeile vaihtaa ensisijaista verkkoa. Vaihda se napauttamalla."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hätäpuhelut eivät ole käytettävissä"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Hätäpuhelujen soittaminen Wi-Fi-yhteyden kautta ei onnistu."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ilmoitukset"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Soitonsiirto"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hätäpuhelujen takaisinsoittotila"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming-banneri käytössä"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming-banneri pois käytöstä"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Etsitään signaalia"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-puhelut"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Jos haluat soittaa puheluita ja lähettää viestejä Wi-Fin kautta, pyydä ensin operaattoriasi ottamaan tämä palvelu käyttöön. Ota sitten Wi-Fi-puhelut käyttöön asetuksissa. (Virhekoodi: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Rekisteröidy operaattorin asiakkaaksi (virhekoodi: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Wi-Fi-puhelut: %s"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Liikaa käsiteltäviä pyyntöjä. Yritä myöhemmin uudelleen."</string>
<string name="notification_title" msgid="8967710025036163822">"Kirjautumisvirhe tilille <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synkronointi"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synkronointi"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Liikaa <xliff:g id="CONTENT_TYPE">%s</xliff:g>-poistoja."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Synkronointi epäonnistui"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Poistopyyntö sisälsi liian paljon sisältöä (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tablet-laitteen tallennustila on täynnä. Vapauta tilaa poistamalla tiedostoja."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Kellon tallennustila on täynnä. Vapauta tilaa poistamalla tiedostoja."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Television tallennustila on täynnä. Vapauta tilaa poistamalla tiedostoja."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Valvoja: työprofiilin järjestelmänvalvoja"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Valvoja on <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>."</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Työprofiili poistettiin"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Työprofiili poistettiin, koska laitteesta puuttuu hallintasovellus."</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Työprofiilin hallintasovellus puuttuu tai se on vioittunut. Tästä syystä työprofiilisi ja siihen liittyvät tiedot on poistettu. Pyydä ohjeita järjestelmänvalvojaltasi."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Työprofiilisi ei ole enää käytettävissä tällä laitteella."</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Liikaa salasanayrityksiä"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Hallinnoitu laite"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Organisaatiosi hallinnoi tätä laitetta ja voi tarkkailla verkkoliikennettä. Katso lisätietoja napauttamalla."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Laitteen tiedot poistetaan"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Hallintasovellusta ei voi käyttää. Laitteen tiedot poistetaan.\n\nPyydä ohjeita järjestelmänvalvojaltasi."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Hallintasovellusta ei voi käyttää. Laitteen tiedot pyyhitään.\n\nPyydä ohjeita järjestelmänvalvojaltasi."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> on poistanut tulostuksen käytöstä."</string>
<string name="me" msgid="6545696007631404292">"Minä"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tablet-laitteen asetukset"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lentokonetila"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lentokonetila on KÄYTÖSSÄ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lentokonetila on POIS KÄYTÖSTÄ"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Virransäästö"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Virransäästö on POISSA KÄYTÖSTÄ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Virransäästö on KÄYTÖSSÄ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Asetukset"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Auta"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ääniapuri"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Vaihda työprofiiliin"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktit"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"käyttää yhteystietoja"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Anna sovellukselle &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; yhteystietojesi käyttöoikeus."</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; yhteystietojesi käyttöoikeuden?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Sijainti"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"käyttää laitteen sijaintia"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Anna sovellukselle &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tämän laitteen sijainnin käyttöoikeus."</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tämän laitteen sijainnin käyttöoikeuden?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalenteri"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"käyttää kalenteria"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Anna sovellukselle &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; kalenterisi käyttöoikeus."</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; kalenterisi käyttöoikeuden?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"Tekstiviestit"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"lähettää ja tarkastella tekstiviestejä"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Anna sovellukselle &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; lupa lähettää ja katsella tekstiviestejä."</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; lähettää ja lukea tekstiviestejä?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Tallennustila"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"käyttää laitteellesi tallennettuja valokuvia, mediatiedostoja ja muita tiedostoja"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tarvitsee sinulta luvan käyttää laitteellasi olevia kuvia, mediaa ja tiedostoja"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; käyttää laitteellasi olevia kuvia, mediaa ja tiedostoja?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofoni"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"tallentaa ääntä"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Anna sovellukselle &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; lupa nauhoittaa ääntä."</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; nauhoittaa ääntä?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ottaa kuvia ja videoita"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Anna sovellukselle &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; lupa ottaa kuvia ja nauhoittaa videoita."</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ottaa kuvia ja nauhoittaa videoita?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Puhelin"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"soittaa ja hallinnoida puheluita"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Anna sovellukselle &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; lupa soittaa ja hallinnoida puheluita."</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; soittaa ja hallinnoida puheluita?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kehon anturit"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"käyttää anturitietoja elintoiminnoistasi"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Anna sovellukselle &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; lupa käyttää anturitietoja elintoiminnoistasi."</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; käyttää anturitietoja elintoiminnoistasi?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Noutaa ikkunan sisältöä"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tarkistaa käyttämäsi ikkunan sisältö."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ottaa kosketuksella tutkimisen käyttöön"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Eleiden käyttäminen"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Lupa napauttaa, pyyhkäistä, nipistää ja käyttää muita eleitä."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Sormenjälkieleet"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Voi tallentaa laitteen sormenjälkitunnistimella tehtyjä eleitä."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Voi tallentaa laitteen sormenjälkitunnistimelle tehtyjä eleitä."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"poista tilapalkki käytöstä tai muokkaa tilapalkkia"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Antaa sovelluksen poistaa tilapalkin käytöstä ja lisätä tai poistaa järjestelmäkuvakkeita."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"sijaita tilapalkissa"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Antaa sovelluksen lisätä omia osiaan muistiin pysyvästi. Tämä voi rajoittaa muiden sovellusten käytettävissä olevaa muistia ja hidastaa tablet-laitteen toimintaa."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Antaa sovelluksen lisätä omia osiaan pysyvästi muistiin. Tämä voi rajoittaa muiden sovellusten käytettävissä olevaa muistia ja hidastaa television toimintaa."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Antaa sovelluksen lisätä omia osiaan muistiin pysyvästi. Tämä voi rajoittaa muiden sovellusten käytettävissä olevaa muistia ja hidastaa puhelimen toimintaa."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"suorita etualan palvelu"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Sallii sovelluksen käyttää etualan palveluja"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"sovellusten tallennustilan mittaaminen"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Antaa sovelluksen noutaa sen koodin, tietojen ja välimuistin koot."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"muokkaa järjestelmän asetuksia"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lukituksen poisto salasanalla."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face Unlock"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lukituksen poisto PIN-koodilla."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM-kortin PIN-koodin lukituksen avaus"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM-kortin PUK-koodin lukituksen avaus"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lukituksen poisto salasanalla."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kuvioalue."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Liu\'utusalue."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Teksti kopioitu leikepöydälle."</string>
<string name="more_item_label" msgid="4650918923083320495">"Lisää"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Valikko+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Vaihto+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"välilyönti"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"poista"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Tarkista päivitykset"</string>
<string name="smv_application" msgid="3307209192155442829">"Sovellus <xliff:g id="APPLICATION">%1$s</xliff:g> (prosessi <xliff:g id="PROCESS">%2$s</xliff:g>) on rikkonut itse käyttöön ottamaansa StrictMode-käytäntöä."</string>
<string name="smv_process" msgid="5120397012047462446">"Prosessi <xliff:g id="PROCESS">%1$s</xliff:g> on rikkonut itse käyttöön ottamaansa StrictMode-käytäntöä."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Androidia päivitetään…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android käynnistyy…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Puhelinta päivitetään…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablettia päivitetään…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Laitetta päivitetään…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Puhelin käynnistyy…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tabletti käynnistyy…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Laite käynnistyy…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimoidaan tallennustilaa."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Viimeistellään Android-päivitystä…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Kaikki sovellukset eivät ehkä toimi oikein, ennen kuin päivitys on valmis."</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Viimeistellään järjestelmäpäivitystä…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> päivittyy…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimoidaan sovellusta <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Valmistellaan: <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Käynnistetään sovelluksia."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Viimeistellään päivitystä."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> käynnissä"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Palaa peliin napauttamalla"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Valitse peli"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Suorituskyvyn parantamiseksi vain yksi näistä peleistä voi olla kerrallaan avoinna."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Avaa <xliff:g id="OLD_APP">%1$s</xliff:g> uudelleen"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Avaa <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> suljetaan tallentamatta tietoja"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ylitti muistirajan."</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Keon vedos on kerätty, jaa se napauttamalla."</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Keon vedos on kerätty, jaa se napauttamalla."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Jaetaanko keon vedos?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Prosessi <xliff:g id="PROC">%1$s</xliff:g> on ylittänyt muistirajan (<xliff:g id="SIZE">%2$s</xliff:g>). Keon vedos on jaettavissa kehittäjän kanssa. Ole varovainen: tämä keon vedos voi sisältää sellaisia henkilötietojasi, joihin sovelluksella on käyttöoikeus."</string>
<string name="sendText" msgid="5209874571959469142">"Valitse tekstille toiminto"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Yhdistä avoimeen Wi‑Fi-verkkoon"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Yhdistä operaattorin Wi-Fi-verkkoon"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Yhdistetään avoimeen Wi‑Fi-verkkoon"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Yhdistetty Wi-Fi-verkkoon"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi-verkkoon yhdistäminen epäonnistui"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Napauta, niin näet kaikki verkot."</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Yhdistä"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Kaikki verkot"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Kaikki verkot"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi käynnistyy automaattisesti"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kun olet lähellä laadukasta tallennettua verkkoa"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Älä käynnistä uudelleen"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Käynnistä uudelleen"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivoi mobiilipalvelu"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Lataa operaattorin sovellus, niin voit aktivoida SIM-korttisi."</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Lataa sovellus <xliff:g id="APP_NAME">%1$s</xliff:g>, niin voit aktivoida SIM-korttisi."</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Lataa sovellus"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Uusi SIM-kortti asetettu"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Määritä se napauttamalla"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP USB:n kautta on käytössä"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Internetin jakaminen USB:n kautta on käytössä"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI USB:n kautta on käytössä"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-lisävarustetila on käytössä"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-lisälaite yhdistetty"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Näet lisää vaihtoehtoja napauttamalla."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Ladataan yhdistettyä laitetta. Napauta nähdäksesi lisää vaihtoehtoja."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoginen äänilaite havaittu"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Liitetty laite ei ole yhteensopiva puhelimen kanssa. Napauta, niin näet lisätietoja."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-vianetsintä yhdistetty"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Poista USB-vianetsintä käytöstä napauttamalla."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Poista USB-virheenkorjaus käytöstä napauttamalla."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Poista USB-vianetsintä käytöstä valitsemalla tämä."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Luodaan virheraporttia…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Jaetaanko virheraportti?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> näkyy muiden sovellusten päällä"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> näkyy sovellusten päällä"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jos et halua, että <xliff:g id="NAME">%s</xliff:g> voi käyttää tätä ominaisuutta, avaa asetukset napauttamalla ja poista se käytöstä."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"POISTA KÄYTÖSTÄ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Poista käytöstä"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Valmistellaan kohdetta <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tarkistetaan virheiden varalta."</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Uusi <xliff:g id="NAME">%s</xliff:g> on havaittu."</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Yhdistetään aina käytössä olevaan VPN-verkkoon..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Yhdistetty aina käytössä olevaan VPN-verkkoon"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Yhteys aina päällä olevaan VPN:ään katkennut"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Aina käytössä oleva VPN: virhe"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Ei yhteyttä aina päällä olevaan VPN:ään"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Muuta verkko- tai VPN-asetuksia"</string>
<string name="upload_file" msgid="2897957172366730416">"Valitse tiedosto"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ei valittua tiedostoa"</string>
<string name="reset" msgid="2448168080964209908">"Palauta"</string>
<string name="submit" msgid="1602335572089911941">"Lähetä"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Autotila käytössä"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Poistu autotilasta napauttamalla."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Ajosovellus on käynnissä"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Poistu ajosovelluksesta napauttamalla."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Internetin jakaminen tai yhteyspiste käytössä"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Määritä napauttamalla."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Yhteyden jakaminen poistettu käytöstä"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"USB-asema: <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-tallennustila"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Muokkaa"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Datankäyttövaroitus"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Käyttö &amp; asetukset napauttamalla"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G-tietojen raja saavutettu"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G-tietojen raja saavutettu"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Datavaroitus"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Olet käyttänyt <xliff:g id="APP">%s</xliff:g> dataa"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobiilidataraja saavutettu"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi-tietojen raja saavutettu"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Tiedonsiirto keskeytetty jakson loppuun asti"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G-tiedonsiirtoraja ylitetty"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G-tiedonsiirtoraja ylitetty"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobiilitiedonsiirtoraja ylitetty"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi-tiedonsiirtoraja ylitetty"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> yli asetetun rajan"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data keskeytetty kierroksen loppuajaksi"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Mobiilidataraja ylitetty"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi-dataraja ylitetty"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Olet käyttänyt <xliff:g id="SIZE">%s</xliff:g> asettamasi rajan yli."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Rajoitettu taustadatan käyttö"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Poista rajoitus napauttamalla."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Suuri datan käyttö"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Olet käyttänyt normaalia enemmän dataa viime päivinä. Napauta nähdäksesi käyttö ja asetukset."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Paljon mobiilidatan käyttöä"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Sovelluksesi ovat käyttäneet normaalia enemmän dataa"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> on käyttänyt normaalia enemmän dataa"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Suojausvarmenne"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Varmenne on voimassa."</string>
<string name="issued_to" msgid="454239480274921032">"Varmenteen saaja:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Järjestelmänvalvoja asensi tämän."</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Järjestelmänvalvoja päivitti tämän."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Järjestelmänvalvoja poisti tämän."</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Parantaakseen akun kestoa virransäästö vähentää laitteesi suorituskykyä ja rajoittaa värinää, sijaintipalveluita ja useimpia taustatietoja. Sähköposti, viestit ja muut synkronointiin perustuvat sovellukset eivät välttämättä päivity, ellet avaa niitä.\n\nVirransäästö poistuu käytöstä automaattisesti, kun laitteesi latautuu."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Data Saver estää joitakin sovelluksia lähettämästä tai vastaanottamasta tietoja taustalla, jotta datan käyttöä voidaan vähentää. Käytössäsi oleva sovellus voi yhä käyttää dataa, mutta se saattaa tehdä niin tavallista harvemmin. Tämä voi tarkoittaa esimerkiksi sitä, että kuva ladataan vasta, kun kosketat sitä."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Otetaanko Data Saver käyttöön?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ota käyttöön"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d minuutin ajan (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> asti)</item>
<item quantity="one">1 minuutin ajan (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> asti)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d tunniksi (kunnes kello on <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Yhdeksi tunniksi (kunnes kello on <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">1 tunniksi (kunnes kello on <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d tunnin ajan (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> asti)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">%d minuutin ajan</item>
<item quantity="one">1 minuutin ajan</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d tunniksi</item>
- <item quantity="one">Tunniksi</item>
+ <item quantity="one">1 tunniksi</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d tunnin ajan</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"Mykistänyt <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Laitteellasi on sisäinen ongelma, joka aiheuttaa epävakautta. Voit korjata tilanteen palauttamalla tehdasasetukset."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Laitteesi yhdistäminen ei onnistu sisäisen virheen takia. Saat lisätietoja valmistajalta."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-pyyntö muutettiin DIAL-pyynnöksi."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-pyyntö muutettiin SS-pyynnöksi."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-pyyntö muutettiin uudeksi USSD-pyynnöksi."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-pyyntö muutettiin Video DIAL ‑pyynnöksi."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-pyyntö muutettiin DIAL-pyynnöksi."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-pyyntö muutettiin Video DIAL ‑pyynnöksi."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-pyyntö muutettiin USSD-pyynnöksi."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-pyyntö muutettiin uudeksi SS-pyynnöksi."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Työprofiili"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Laajenna"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Tiivistä"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Haitallinen sovellus havaittu"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> haluaa näyttää osia sovelluksesta <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Muokkaa"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Puhelut ja ilmoitukset värisevät"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Puhelut ja ilmoitukset mykistetään"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Järjestelmän muutokset"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Älä häiritse"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Älä häiritse ‑tila piilottaa ilmoitukset, jotta voit keskittyä paremmin"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Tämä toiminto on muuttunut. Muuta napauttamalla."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Älä häiritse ‑tila muuttui"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tarkasta keskeytyksiä koskevat toiminta-asetukset napauttamalla."</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Napauta niin näet, mitä on estetty."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Järjestelmä"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Asetukset"</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index faa8598e74d0..1ed7b8f213a4 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : non restreint"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Ce service n\'est pas pris en charge."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Impossible de modifier le paramètre relatif au numéro de l\'appelant."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Aucun service de données"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Aucun appel d\'urgence"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Aucun service de données cellulaires"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Le service d\'appel d\'urgence n\'est pas accessible"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Aucun service vocal"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Aucun service vocal ou d\'urgence"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Ce service est temporairement non offert par le réseau cellulaire à l\'endroit où vous êtes"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible de joindre le réseau"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Pour améliorer la réception, essayez de changer le type de réseau sélectionné, sous Paramètres &gt; Réseaux et Internet &gt; Réseaux cellulaires &gt; Type de réseau préféré."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Les appels Wi-Fi sont actifs"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Les appels d\'urgence nécessitent un réseau cellulaire."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Aucun de service vocal ni d\'appel d\'urgence"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Temporairement désactivé par votre fournisseur de services"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossible de joindre le réseau cellulaire"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Essayez de changer de réseau préféré. Touchez l\'écran pour changer."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Le service d\'appel d\'urgence n\'est pas accessible"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Impossible d\'effectuer des appels d\'urgence par Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Bannière d\'itinérance activée"</string>
<string name="roamingText12" msgid="1189071119992726320">"Bannière d\'itinérance désactivée"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Recherche des services disponibles"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Appels Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Pour effectuer des appels et envoyer des messages par Wi-Fi, demandez tout d\'abord à votre fournisseur de services de configurer ce service. Réactivez ensuite les appels Wi-Fi dans les paramètres. (Code d\'erreur : <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Inscrivez-vous auprès de votre fournisseur de services (code d\'erreur : <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Appels Wi-Fi %s"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Trop de requêtes sont en cours de traitement. Veuillez réessayer plus tard."</string>
<string name="notification_title" msgid="8967710025036163822">"Erreur de connexion au compte <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchroniser"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchroniser"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Trop de contenus supprimés (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"La mémoire de la tablette est pleine. Supprimez des fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"La mémoire de la montre est pleine. Supprimez des fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"L\'espace de stockage du téléviseur est plein. Supprimez des fichiers pour libérer de l\'espace."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Par l\'administrateur de votre profil professionnel"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Par <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profil professionnel supprimé"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profil professionnel supprimé en raison de l\'application d\'administration manquante"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Le profil professionnel de l\'application d\'administration est manquant ou corrompu. Votre profil professionnel et ses données connexes ont donc été supprimés. Communiquez avec votre administrateur pour obtenir de l\'assistance."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Votre profil professionnel n\'est plus accessible sur cet appareil"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Trop de tentatives d\'entrée du mot de passe"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"L\'appareil est géré"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Votre organisation gère cet appareil et peut surveiller le trafic réseau. Touchez ici pour obtenir plus d\'information."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Le contenu de votre appareil sera effacé"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Impossible d\'utiliser l\'application d\'administration. Les données de votre appareil vont maintenant être effacées.\n\nSi vous avez des questions, communiquez avec l\'administrateur de votre organisation."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Impossible d\'utiliser l\'application d\'administration. Les données de votre appareil vont maintenant être effacées.\n\nSi vous avez des questions, communiquez avec l\'administrateur de votre organisation."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Impression désactivée par <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Moi"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Options de la tablette"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode Avion"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Le mode Avion est activé."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Le mode Avion est désactivé."</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Économie d\'énergie"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"La fonction Économie d\'énergie est désactivée"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"La fonction Économie d\'énergie est activée"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. vocale"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil professionnel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à vos contacts"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Localisation"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accéder à la position de cet appareil"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à la position de cet appareil"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accéder à votre agenda"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à votre agenda"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"Messagerie texte"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"envoyer et afficher des messages texte"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à envoyer et à afficher des messages texte"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Stockage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accéder aux photos, aux contenus multimédias et aux fichiers sur votre appareil"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux photos, aux médias et aux fichiers de votre appareils"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"enregistrer des fichiers audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à enregistrer de l\'audio"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"prendre des photos et filmer des vidéos"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à prendre des photos et à filmer des vidéos"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faire et gérer des appels téléphoniques"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à faire et à gérer les appels téléphoniques"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Capteurs corporels"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs sur vos signes vitaux"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux données des capteurs pour vos signes vitaux"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Effectuer des gestes"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Peut toucher, balayer, pincer et effectuer d\'autres gestes."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestes sur le capteur d\'empreintes digitales"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Peut capturer des gestes effectués sur le capteur d\'empreintes digitales des appareils."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Peut capturer des gestes effectués sur le capteur d\'empreintes digitales de l\'appareil."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"désactiver ou modifier la barre d\'état"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permet à l\'application de désactiver la barre d\'état, ou d\'ajouter et de supprimer des icônes système."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"servir de barre d\'état"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir la tablette."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permet à l\'application de placer certaines de ses parties en permanence dans la mémoire. Cela peut limiter la mémoire disponible pour les autres applications et ralentir le téléviseur."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir le téléphone."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"exécuter le service en premier plan"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Permet à l\'application d\'utiliser les services en premier plan."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"évaluer l\'espace de stockage de l\'application"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permet à l\'application de récupérer la taille de son code, de ses données et de sa mémoire cache."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modifier les paramètres du système"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Déverrouillage par reconnaissance faciale"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par NIP"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Déverrouillage du NIP de la carte SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Déverrouillage du code PUK de la carte SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Déverrouillage par mot de passe"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zone du schéma"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zone où faire glisser votre doigt sur l\'écran"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Le texte a été copié dans le presse-papiers."</string>
<string name="more_item_label" msgid="4650918923083320495">"Plus"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Méta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Maj+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fonction+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espace"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"entrée"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"suppr"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Vérifier la présence de mises à jour"</string>
<string name="smv_application" msgid="3307209192155442829">"L\'application <xliff:g id="APPLICATION">%1$s</xliff:g> (du processus <xliff:g id="PROCESS">%2$s</xliff:g>) a enfreint ses propres règles du mode strict."</string>
<string name="smv_process" msgid="5120397012047462446">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> a enfreint ses propres règles du mode strict."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Mise à jour d\'Android…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android en cours de démarrage..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Mise à jour du téléphone en cours…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Mise à jour de la tablette en cours…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Mise à jour de l\'appareil en cours…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Démarrage du téléphone en cours…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Démarrage de la tablette en cours…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Démarrage de l\'appareil en cours…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimisation du stockage."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finalisation de la mise à jour d\'Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Il se peut que certaines applications ne fonctionnent pas correctement jusqu\'à ce que la mise à niveau soit terminée"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Finalisation de la m. à j. syst. en cours…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Mise à niveau de <xliff:g id="APPLICATION">%1$s</xliff:g> en cours…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimisation de l\'application <xliff:g id="NUMBER_0">%1$d</xliff:g> sur <xliff:g id="NUMBER_1">%2$d</xliff:g>…"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Préparation de <xliff:g id="APPNAME">%1$s</xliff:g> en cours…"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Lancement des applications…"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finalisation de la mise à jour."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Touchez pour revenir au jeu"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Choisissez un jeu"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Pour que vous obteniez de meilleures performances, un seul de ces jeux peut être ouvert à la fois."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Revenir à <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Ouvrir <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> va fermer sans enregistrement"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a dépassé la limite de mémoire"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"L\'empreinte de mémoire a été recueillie. Touchez pour la partager."</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Partager l\'empreinte de mémoire?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Le processus <xliff:g id="PROC">%1$s</xliff:g> a dépassé sa limite de mémoire de <xliff:g id="SIZE">%2$s</xliff:g>. Vous pouvez partager son empreinte de mémoire avec son développeur. Attention : cette empreinte peut contenir certains de vos renseignements personnels auxquels l\'application a accès."</string>
<string name="sendText" msgid="5209874571959469142">"Sélectionner une action pour le texte"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Connectez-vous pour ouvrir un réseau Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Se connecter au réseau Wi-Fi du fournisseur de services"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connexion en cours au réseau Wi-Fi ouvert…"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connecté au réseau Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossible de se connecter au réseau Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Touchez pour afficher tous les réseaux"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connexion"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Tous les réseaux"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tous les réseaux"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Le Wi-Fi s\'activera automatiquement"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Lorsque vous êtes près d\'un réseau enregistré de haute qualité"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne pas réactiver"</string>
@@ -1204,6 +1225,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Redémarrer"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activer le service cellulaire"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Téléchargez l\'application du fournisseur de services pour activer votre nouvelle carte SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Téléchargez l\'application de <xliff:g id="APP_NAME">%1$s</xliff:g> pour activer votre nouvelle carte SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Télécharger l\'application"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nouvelle carte SIM insérée"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Touchez ici pour effectuer la configuration"</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Mode PTP par USB activé"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Partage de connexion USB activé"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Mode MIDI par USB activé"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Mode accessoire USB activé"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Accessoire USB connecté"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Touchez pour afficher plus d\'options."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Chargement de l\'appareil connecté. Touchez l\'écran pour afficher plus d\'options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Un accessoire audio analogique a été détecté"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"L\'appareil connecté n\'est pas compatible avec ce téléphone. Touchez ici en savoir plus."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Touchez pour désactiver le débogage USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Touchez l\'écran pour désactiver le débogage USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Sélectionnez cette option pour désactiver le débogage USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Création d\'un rapport de bogue en cours..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Partager le rapport de bogue?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> affiche du contenu par-dessus d\'autres applications"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> aff. contenu par-dessus applis"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si vous ne voulez pas que <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalités, touchez l\'écran pour ouvrir les paramètres, puis désactivez-la."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DÉSACTIVER"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Désactiver"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation de « <xliff:g id="NAME">%s</xliff:g> » en cours"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs en cours..."</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Une nouvelle mémoire « <xliff:g id="NAME">%s</xliff:g> » a été détectée"</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"RPV permanent en cours de connexion…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"RPV permanent connecté"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Déconnecté du RPV permanent"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erreur du RPV permanent"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Modifier les paramètres réseau ou RPV"</string>
<string name="upload_file" msgid="2897957172366730416">"Choisir un fichier"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Aucun fichier sélectionné"</string>
<string name="reset" msgid="2448168080964209908">"Réinitialiser"</string>
<string name="submit" msgid="1602335572089911941">"Envoyer"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mode Voiture activé"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Touchez pour quitter le mode Voiture."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Touchez pour configurer."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Le partage de connexion est désactivé"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Clé USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Mémoire de stockage USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Modifier"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alerte d\'utilisation des données"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Touch. pour aff. util. et param."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Limite de données 2G-3G atteinte"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Limite de données 4G atteinte"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Avertissement d\'utilisation de données"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Vous avez utilisé <xliff:g id="APP">%s</xliff:g> de données"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Limite données cellul. atteinte"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Limite données Wi-Fi atteinte"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Données suspend. pour reste cycle"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Quota de données 2G-3G dépassé"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Quota de données 4G dépassé"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Quota utilisation données dépassé"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Quota de données Wi-Fi dépassé"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> au-delà de la limite spécifiée."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Le transfert de données a été interrompu pour le reste de votre cycle de facturation"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Limite de données cell. dépassée"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Limite de données Wi-Fi dépassée"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Vous avez dépassé votre limite de <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Données en arrière-plan limitées"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Touchez pour suppr. restriction."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Consomm. importante de données"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Votre consommation récente de données est plus importante que d\'habitude. Touchez l\'écran pour afficher l\'usage et les paramètres."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Utilis. élevée des données cell."</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Vos applications ont utilisé plus de données que d\'habitude"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> a utilisé plus de données que d\'habitude"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificat de sécurité"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ce certificat est valide."</string>
<string name="issued_to" msgid="454239480274921032">"Émis à :"</string>
@@ -1669,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installé par votre administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Mise à jour par votre administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Supprimé par votre administrateur"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Pour améliorer l\'autonomie de la pile, la fonction Économie d\'énergie réduit les performances de votre appareil et limite la vibration, les services de localisation ainsi que la plupart des données en arrière-plan. Les applications Courriel, Messages et d\'autres qui reposent sur la synchronisation ne peuvent pas se mettre à jour, sauf si vous les ouvrez. \n\nLa fonction Économie d\'énergie se désactive automatiquement lorsque votre appareil est en charge."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Pour aider à diminuer l\'utilisation des données, la fonction Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activer l\'Économiseur de données?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activer"</string>
@@ -1681,9 +1704,9 @@
<item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1720,9 @@
<item quantity="one">Pendant %d min</item>
<item quantity="other">Pendant %d min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">Pendant %d heure</item>
- <item quantity="other">Pendant %d heures</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">Pendant %d heure</item>
+ <item quantity="other">Pendant %d heures</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">Pendant %d h</item>
@@ -1720,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"Mis en sourdine par <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Un problème interne est survenu avec votre appareil. Il se peut qu\'il soit instable jusqu\'à ce que vous le réinitialisiez à sa configuration d\'usine."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Un problème interne est survenu avec votre appareil. Communiquez avec le fabricant pour obtenir plus de détails."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"La demande USSD a été modifiée et est maintenant une demande DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"La demande USSD a été modifiée et est maintenant une demande SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"La demande USSD a été modifiée et est maintenant une nouvelle demande USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"La demande USSD a été modifiée et est maintenant une demande Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La demande SS a été modifiée et est maintenant une demande DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"La demande SS a été modifiée et est maintenant une demande Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La demande SS a été modifiée et est maintenant une demande USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La demande SS a été modifiée et est maintenant une nouvelle demande SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil professionnel"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Développer"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Réduire"</string>
@@ -1837,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Une application nuisible a été détectée"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> souhaite afficher <xliff:g id="APP_2">%2$s</xliff:g> tranches"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Modifier"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Les appels et les notifications vibreront"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Les appels et les notifications seront silencieux"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Changements système"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne pas déranger"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Le mode Ne pas déranger masque les notifications pour vous aider à vous concentrer"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"C\'est un nouveau comportement. Touchez l\'écran pour changer vos options."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Les paramètres du mode Ne pas déranger ont changé"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Touchez l\'écran pour vérifier vos paramètres de comportement pour les interruptions"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Touchez l\'écran pour vérifier ce qui est bloqué."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index f840922090c9..34ebece77dd3 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : non restreint"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Ce service n\'est pas pris en charge."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Impossible de modifier le paramètre relatif au numéro de l\'appelant."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Aucun service de données"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Aucun appel d\'urgence"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Aucun service de données mobiles"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Appels d\'urgence non disponibles"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Aucun service vocal"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Aucun service vocal/d\'urgence"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Momentanément non proposé par le réseau mobile à votre position"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible d\'accéder au réseau"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Pour améliorer la réception, essayez de modifier le type sélectionné sous Paramètres &gt; Réseau et Internet &gt; Réseaux mobiles &gt; Type de réseau préféré."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Les appels Wi-Fi sont actifs"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Les appels d\'urgence requièrent un réseau mobile."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Aucun service vocal ni d\'appels d\'urgence"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Service temporairement désactivé par votre opérateur"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossible d\'accéder au réseau mobile"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Essayez de changer le réseau préféré. Appuyez pour le modifier."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Appels d\'urgence non disponibles"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Impossible de passer des appels d\'urgence via le Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Bannière d\'itinérance activée"</string>
<string name="roamingText12" msgid="1189071119992726320">"Bannière d\'itinérance désactivée"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Recherche des services disponibles"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Appels Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Pour passer des appels et envoyer des messages via le Wi-Fi, demandez d\'abord à votre opérateur de configurer ce service. Ensuite, réactivez les appels Wi-Fi dans les paramètres. (Code d\'erreur : <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Enregistrez-vous auprès de votre opérateur (Code d\'erreur : <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Appels Wi-Fi %s"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Trop de requêtes sont en cours de traitement. Veuillez réessayer ultérieurement."</string>
<string name="notification_title" msgid="8967710025036163822">"Erreur de connexion au compte \"<xliff:g id="ACCOUNT">%1$s</xliff:g>\""</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchroniser"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchronisation"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Trop de contenus supprimés (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"La mémoire de la tablette est pleine. Supprimez des fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"La mémoire de la montre est saturée. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"L\'espace de stockage du téléviseur est saturé. Pour libérer de l\'espace, veuillez supprimer des fichiers."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Par l\'administrateur de votre profil professionnel"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Par <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profil professionnel supprimé"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profil professionnel supprimé, car une application d\'administration est manquante"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"L\'application d\'administration du profil professionnel est manquante ou endommagée. Par conséquent, votre profil professionnel et toutes les données associées ont été supprimés. Pour obtenir de l\'aide, contactez l\'administrateur."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Votre profil professionnel n\'est plus disponible sur cet appareil"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Trop de tentatives de saisie du mot de passe"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"L\'appareil est géré"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Votre organisation gère cet appareil et peut surveiller le trafic réseau. Appuyez ici pour obtenir plus d\'informations."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Les données de votre appareil vont être effacées"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Impossible d\'utiliser l\'application d\'administration. Les données de votre appareil vont maintenant être effacées.\n\nSi vous avez des questions, contactez l\'administrateur de votre organisation."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Impossible d\'utiliser l\'application d\'administration. Les données de votre appareil vont maintenant être effacées.\n\nSi vous avez des questions, contactez l\'administrateur de votre organisation."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Impression désactivée par <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Moi"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Options de la tablette"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode Avion"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Le mode Avion est activé."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Le mode Avion est désactivé."</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Économiseur de batterie"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Économiseur de batterie DÉSACTIVÉ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Économiseur de batterie ACTIVÉ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assistance vocale"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil professionnel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder à vos contacts"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Localisation"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accéder à la position de l\'appareil"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder à la position de cet appareil"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accéder à votre agenda"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder à votre agenda"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"envoyer et consulter des SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'envoyer et d\'afficher des SMS"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Stockage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accéder à des photos, à des contenus multimédias et à des fichiers sur votre appareil"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder aux photos, contenus multimédias et fichiers sur votre appareil"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"enregistrer des fichiers audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'enregistrer des contenus audio"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"prendre des photos et enregistrer des vidéos"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; de prendre des photos et de filmer des vidéos"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"effectuer et gérer des appels téléphoniques"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; de passer et gérer des appels téléphoniques"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Capteurs corporels"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs relatives à vos signes vitaux"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder aux données des capteurs relatives à vos signes vitaux"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Effectuer des gestes"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Permet d\'appuyer sur l\'écran, de le balayer, de le pincer et d\'effectuer d\'autres gestes."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestes avec l\'empreinte digitale"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Peut enregistrer des gestes effectués sur le lecteur d\'empreinte digitale de l\'appareil."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Peut enregistrer des gestes effectués sur le lecteur d\'empreinte digitale de l\'appareil."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"Désactivation ou modification de la barre d\'état"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permet à l\'application de désactiver la barre d\'état, ou d\'ajouter et de supprimer des icônes système."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"remplacer la barre d\'état"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir la tablette."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permet à l\'application d\'activer la persistance de certains de ces composants dans la mémoire. Cette fonctionnalité peut limiter l\'espace mémoire disponible pour les autres applications et ralentir ainsi le téléviseur."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir le téléphone."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"exécuter un service de premier plan"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Autorise l\'application à utiliser des services de premier plan."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"évaluer l\'espace de stockage de l\'application"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permet à l\'application de récupérer son code, ses données et la taille de sa mémoire cache."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modifier les paramètres du système"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Déverrouillage par reconnaissance faciale"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par code PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Déverrouillage de la carte SIM à l\'aide d\'un code."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Déverrouillage de la carte SIM à l\'aide d\'une clé PUK."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Déverrouillage par mot de passe"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zone du schéma"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zone où faire glisser votre doigt sur l\'écran"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Le texte a été copié dans le presse-papier."</string>
<string name="more_item_label" msgid="4650918923083320495">"Plus"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Méta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Maj+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fonction+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espace"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"entrée"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"supprimer"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Rechercher les mises à jour"</string>
<string name="smv_application" msgid="3307209192155442829">"L\'application <xliff:g id="APPLICATION">%1$s</xliff:g> (du processus <xliff:g id="PROCESS">%2$s</xliff:g>) a enfreint ses propres règles du mode strict."</string>
<string name="smv_process" msgid="5120397012047462446">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> a enfreint ses propres règles du mode strict."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Mise à jour d\'Android…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Démarrage d\'Android en cours"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Mise à jour du téléphone…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Mise à jour de la tablette…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Mise à jour de l\'appareil…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Démarrage du téléphone…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Démarrage de la tablette…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Démarrage de l\'appareil…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimisation du stockage en cours…"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finalisation de la mise à jour Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Certaines applications peuvent ne pas fonctionner correctement jusqu\'à ce que la mise à jour soit terminée."</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Finalisation de la mise à jour du système…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Mise à jour de l\'application <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimisation de l\'application <xliff:g id="NUMBER_0">%1$d</xliff:g> sur <xliff:g id="NUMBER_1">%2$d</xliff:g>…"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Préparation de <xliff:g id="APPNAME">%1$s</xliff:g> en cours…"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Lancement des applications…"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finalisation de la mise à jour."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Appuyez pour revenir au jeu"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Choisir un jeu"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Pour des performances optimales, un seul de ces jeux peut être ouvert à la fois."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Revenir à <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Ouvrir <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> va se fermer sans enregistrer les données"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Le processus \"<xliff:g id="PROC">%1$s</xliff:g>\" a dépassé la limite de mémoire"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Une empreinte de la mémoire a bien été générée. Appuyez pour partager."</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Partager l\'empreinte de la mémoire ?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Le processus \"<xliff:g id="PROC">%1$s</xliff:g>\" a dépassé sa limite de mémoire fixée à <xliff:g id="SIZE">%2$s</xliff:g>. Une empreinte de la mémoire est disponible pour que vous la communiquiez à son développeur. Attention : celle-ci peut contenir des informations personnelles auxquelles l\'application a accès."</string>
<string name="sendText" msgid="5209874571959469142">"Sélectionner une action pour le texte"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Se connecter pour ouvrir le réseau Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Se connecter au réseau Wi-Fi de l\'opérateur"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connexion pour ouvrir un réseau Wi-Fi…"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connecté au réseau Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossible de se connecter au réseau Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Appuyer pour afficher tous les réseaux"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Se connecter"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Tous les réseaux"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tous les réseaux"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Le Wi-Fi sera activé automatiquement"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Lorsque vous êtes à proximité d\'un réseau enregistré de haute qualité"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne pas réactiver"</string>
@@ -1204,6 +1225,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Redémarrer"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activer le service de données mobiles"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Téléchargez l\'application de l\'opérateur pour activer votre nouvelle carte SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Téléchargez l\'application <xliff:g id="APP_NAME">%1$s</xliff:g> pour activer votre nouvelle carte SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Télécharger l\'application"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nouvelle carte SIM insérée"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Appuyez ici pour effectuer la configuration."</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB activé"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Partage de connexion via USB activé"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB activé"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Mode d\'accessoire USB activé"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Accessoire USB connecté"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Appuyez ici pour plus d\'options."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Rechargement de l\'appareil connecté. Appuyez ici pour plus d\'options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Accessoire audio analogique détecté"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"L\'appareil connecté n\'est pas compatible avec ce téléphone. Appuyez ici pour en savoir plus."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Appuyez ici pour désactiver le débogage USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Appuyez pour désactiver le débogage USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Sélectionnez cette option pour désactiver le débogage USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Création du rapport de bug…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Partager le rapport de bug ?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> est affichée sur les autres applications"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se superpose aux autres applis"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DÉSACTIVER"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Désactiver"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation mémoire \"<xliff:g id="NAME">%s</xliff:g>\" en cours"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Une nouvelle mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" a été détectée."</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN permanent en cours de connexion…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN permanent connecté"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Déconnecté du VPN permanent"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erreur du VPN permanent"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Modifier les paramètres réseau ou VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Sélectionner un fichier"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Aucun fichier sélectionné"</string>
<string name="reset" msgid="2448168080964209908">"Réinitialiser"</string>
<string name="submit" msgid="1602335572089911941">"Envoyer"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mode Voiture activé"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Appuyez ici pour quitter le mode Voiture."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Partage de connexion ou point d\'accès sans fil activé"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Appuyez ici pour configurer."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Le partage de connexion est désactivé"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Clé USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Mémoire de stockage USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Modifier"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alerte de consommation des données"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Appuyez pour conso/paramètres."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Limite de données 2G-3G atteinte"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Limite de données 4G atteinte"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Avertissement de consommation de données"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Vous avez utilisé <xliff:g id="APP">%s</xliff:g> de données"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Limite données mobiles atteinte"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Limite données Wi-Fi atteinte"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Données suspendues jusqu\'à la fin du cycle"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Quota de données 2G-3G dépassé"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Quota de données 4G dépassé"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Quota utilisation données dépassé"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Quota de données Wi-Fi dépassé"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> au-delà de la limite spécifiée."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Données suspendues jusqu\'à la fin du cycle"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Limite données mobiles dépassée"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Limite de données Wi-Fi dépassée"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Vous avez dépassé votre limite définie de <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Données en arrière-plan limitées"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Appuyez pour suppr. restriction."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Consommation données importante"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Consommation de données supérieure à la normale au cours des derniers jours. Appuyez pour afficher consommation et paramètres."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Conso données mobiles élevée"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Vos applications ont utilisé plus de données que d\'habitude"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> a utilisé plus de données que d\'habitude"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificat de sécurité"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ce certificat est valide."</string>
<string name="issued_to" msgid="454239480274921032">"Délivré à :"</string>
@@ -1669,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installé par votre administrateur"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Mis à jour par votre administrateur"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Supprimé par votre administrateur"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Pour optimiser l\'autonomie de la batterie, l\'économiseur de batterie réduit les performances de votre appareil et limite le vibreur, les services de localisation et la plupart des données en arrière-plan. Vous devrez peut-être ouvrir manuellement vos applications d\'e-mail, de SMS/MMS et autres applications synchronisées pour les mettre à jour.\n\nL\'économiseur de batterie s\'éteint automatiquement lorsque l\'appareil est en charge."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Pour réduire la consommation de données, l\'économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Ainsi, les applications que vous utilisez peuvent toujours accéder aux données, mais pas en permanence. Par exemple, il se peut que les images ne s\'affichent pas tant que vous n\'appuyez pas dessus."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activer l\'économiseur de données ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activer"</string>
@@ -1681,7 +1704,7 @@
<item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
@@ -1697,7 +1720,7 @@
<item quantity="one">Pendant %d min</item>
<item quantity="other">Pendant %d min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">Pendant %d heure</item>
<item quantity="other">Pendant %d heures</item>
</plurals>
@@ -1720,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"Son coupé par : <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Un problème interne lié à votre appareil est survenu. Ce dernier risque d\'être instable jusqu\'à ce que vous rétablissiez la configuration d\'usine."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Un problème interne lié à votre appareil est survenu. Veuillez contacter le fabricant pour en savoir plus."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"La requête USSD a été remplacée par une requête DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"La requête USSD a été remplacée par une requête SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"La requête USSD a été remplacée par une autre requête USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"La requête SS a été remplacée par une requête vidéo DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La requête SS a été remplacée par une requête DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"La requête SS a été remplacée par une requête vidéo DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La requête SS a été remplacée par une requête USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La requête SS a été remplacée par une autre requête SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil professionnel"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Développer"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Réduire"</string>
@@ -1837,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Application dangereuse détectée"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> souhaite afficher des éléments de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Modifier"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Vibreur pour les appels et les notifications"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Sonnerie désactivée pour les appels et les notifications"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Modifications du système"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne pas déranger"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Le mode Ne pas déranger masque les notifications pour vous aider à vous concentrer"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Il s\'agit d\'un nouveau comportement. Appuyez pour modifier les paramètres."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Le mode Ne pas déranger a été modifié"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Appuyez afin de vérifier vos paramètres de comportement pour les interruptions"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Appuyez pour vérifier les contenus bloqués."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 5114ba0da507..2373b6c5bc9d 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"O valor predeterminado do identificador de chamada é restrinxido. Próxima chamada: non restrinxido"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Servizo non ofrecido."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Non podes cambiar a configuración do identificador de chamada."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Non hai servizo de datos"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Non se poden realizar chamadas de urxencia"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Non hai servizo de datos para móbiles"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"As chamadas de urxencia non están dispoñibles"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Non hai servizo de chamadas de voz"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Non hai servizo de chamadas de urxencia nin de voz"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"A rede de telefonía móbil non ofrece o servizo na túa localización temporalmente"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Non se pode conectar coa rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Para mellorar a recepción, proba a cambiar o tipo seleccionado en Configuración &gt; Rede e Internet &gt; Redes de telefonía móbil &gt; Tipo de rede preferido."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"As chamadas por wifi están activadas"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"As chamadas de urxencia precisan unha rede de telefonía móbil."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Non hai servizo de voz nin chamadas de urxencia"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"O teu operador desactivou este servizo temporalmente"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Non se puido conectar coa rede de telefonía móbil"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Proba a cambiar a rede preferida. Toca para cambiar."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"As chamadas de emerxencia non están dispoñibles"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Non se poden realizar chamadas de emerxencia por wifi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de chamadas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de chamadas de urxencia"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de itinerancia activado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de itinerancia desactivado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Buscando servizo"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chamadas por wifi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para facer chamadas e enviar mensaxes a través da wifi, primeiro solicítalle ao operador que configure este servizo. Despois, activa de novo as chamadas por wifi en Configuración. (Código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Rexístrate co teu operador (código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Chamadas wifi de %s"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Estanse a procesar demasiadas solicitudes. Téntao de novo máis tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Erro de inicio de sesión en <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronizar"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronizar"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Demasiados elementos de <xliff:g id="CONTENT_TYPE">%s</xliff:g> eliminados."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"O almacenamento da tableta está cheo. Elimina algúns ficheiros para liberar espazo."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"O almacenamento do reloxo está cheo. Elimina algúns ficheiros para liberar espazo."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"O almacenamento da televisión está cheo. Elimina algúns ficheiros para liberar espazo."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Por parte do administrador do teu perfil de traballo"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Eliminouse o perfil de traballo"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Eliminouse o perfil de traballo porque falta a aplicación de administración"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Falta a aplicación de administración do perfil de traballo ou ben está danada. Como resultado, eliminouse o teu perfil de traballo e os datos relacionados. Para obter asistencia, contacta co administrador."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"O teu perfil de traballo xa non está dispoñible neste dispositivo"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Demasiados intentos de introdución do contrasinal"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"O dispositivo está xestionado"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"A túa organización xestiona este dispositivo e pode controlar o tráfico de rede. Toca para obter máis detalles."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Borrarase o teu dispositivo"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Non se pode utilizar a aplicación de administración. Borrarase o teu dispositivo.\n\nSe tes preguntas, contacta co administrador da túa organización."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Non se pode utilizar a aplicación de administración. Borrarase o teu dispositivo.\n\nSe tes preguntas, contacta co administrador da organización."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> desactivou a impresión."</string>
<string name="me" msgid="6545696007631404292">"Eu"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opcións da tableta"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo avión está activado"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo avión está desactivado"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Aforro de batería"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"A función Aforro de batería está DESACTIVADA"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"A función Aforro de batería está ACTIVADA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Cambiar ao perfil de traballo"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder aos teus contactos"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda aos teus contactos"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Localización"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder á localización deste dispositivo"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda á localización deste dispositivo"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder ao teu calendario"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda ao teu calendario"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar e consultar mensaxes de SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envíe e vexa mensaxes SMS"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Almacenamento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acceder a fotos, contido multimedia e ficheiros no teu dispositivo"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a fotos, contido multimedia e ficheiros no teu dispositivo"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"gravar audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; grave audio"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Cámara"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tirar fotos e gravar vídeos"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; realice fotos e grave vídeos"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"facer e xestionar chamadas telefónicas"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; realice e xestione chamadas telefónicas"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder aos datos do sensor sobre as túas constantes vitais"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda aos datos do sensor sobre as túas constantes vitais"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar contido da ventá"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona o contido dunha ventá coa que estás interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar a exploración táctil"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Realizar xestos"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Podes tocar, pasar o dedo, beliscar e realizar outros xestos."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Xestos de impresión dixital"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Pode rexistrar os xestos realizados no sensor de impresión dixital dos dispositivos."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Pode rexistrar os xestos realizados no sensor de impresión dixital do dispositivo."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desactivar ou modificar a barra de estado"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite á aplicación desactivar a barra de estado ou engadir e eliminar as iconas do sistema."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"actuar como a barra de estado"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite á aplicación converter partes súas como persistentes na memoria. Esta acción pode limitar a cantidade memoria dispoñible para outras aplicacións e reducir a velocidade de funcionamento da tableta."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite que a aplicación faga que algunhas das súas partes se manteñan na memoria. Esta acción pode limitar a cantidade de memoria dispoñible para outras aplicacións e reducir a velocidade da televisión."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permite á aplicación converter partes súas como persistentes na memoria. Esta acción pode limitar a cantidade memoria dispoñible para outras aplicacións e reducir a velocidade de funcionamento do teléfono."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"executar un servizo en primeiro plano"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Permite que a aplicación utilice os servizos en primeiro plano."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"medir o espazo de almacenamento da aplicación"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permite á aplicación recuperar o código, os datos e os tamaños da caché"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modificar a configuración do sistema"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo mediante padrón"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo mediante PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Desbloqueo da SIM co PIN."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Desbloqueo da SIM co PUK."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo mediante contrasinal"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zona do padrón"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zona para pasar o dedo"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"O texto copiouse no portapapeis."</string>
<string name="more_item_label" msgid="4650918923083320495">"Máis"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menú+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Maiús +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sim +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Función +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espazo"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"intro"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"eliminar"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Buscar actualización"</string>
<string name="smv_application" msgid="3307209192155442829">"A aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> (proceso <xliff:g id="PROCESS">%2$s</xliff:g>) infrinxiu a súa política StrictMode autoaplicada."</string>
<string name="smv_process" msgid="5120397012047462446">"O proceso <xliff:g id="PROCESS">%1$s</xliff:g> infrinxiu a política StrictMode de aplicación automática."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Estase actualizando Android…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Estase iniciando Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"O teléfono estase actualizando…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"A tableta estase actualizando…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"O dispositivo estase actualizando…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"O teléfono estase iniciando…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"A tableta estase iniciando…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"O dispositivo estase iniciando…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizando almacenamento."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finalizando a actualización de Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"É posible que algunhas aplicacións non funcionen correctamente ata que finalice o proceso de actualización"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Finalizando actualización do sistema…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Actualizando <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizando aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicacións."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Está finalizando o arranque"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> está en execución"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Toca para volver ao xogo"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Escolle un xogo"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Para gozar dun mellor rendemento, só se pode abrir un destes xogos á vez."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Volver á aplicación <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Abrir a aplicación <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"A aplicación <xliff:g id="OLD_APP">%1$s</xliff:g> pecharase sen gardar o contido"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> superou o límite de memoria"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Recompilouse o baleirado de montóns. Toca para compartir"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Queres compartir o baleirado de montóns?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"O proceso <xliff:g id="PROC">%1$s</xliff:g> superou o seu límite de memoria de proceso de <xliff:g id="SIZE">%2$s</xliff:g>. Tes dispoñible un baleirado de montóns para compartir co seu programador. Debes ter coidado, pois este baleirado de montóns pode conter información persoal á que ten acceso a aplicación."</string>
<string name="sendText" msgid="5209874571959469142">"Seleccionar unha acción para o texto"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conéctate a unha rede wifi aberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectarse á rede wifi dun operador"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectándose á rede wifi aberta"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectouse á rede wifi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Non se puido conectar á rede wifi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectarse"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas as redes"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"A wifi activarase automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Cando esteas preto dunha rede gardada de alta calidade"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Non volver activar"</string>
@@ -1161,7 +1182,7 @@
<item msgid="8257233890381651999">"VPN"</item>
</string-array>
<string name="network_switch_type_name_unknown" msgid="4552612897806660656">"un tipo de rede descoñecido"</string>
- <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Non se puido conectar coa rede Wi-Fi"</string>
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Non se puido conectar á wifi"</string>
<!-- no translation found for wifi_watchdog_network_disabled_detailed (4917472096696322767) -->
<skip />
<string name="wifi_connect_alert_title" msgid="8455846016001810172">"Queres permitir a conexión?"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activar o servizo móbil"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descarga a aplicación do operador para activar a túa nova SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Descarga a aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> para activar a nova SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descargar aplicación"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Introduciuse unha nova SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tocar para configurar"</string>
@@ -1223,14 +1245,14 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Activouse o modo PTP por USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Activouse a conexión compartida por USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Activouse o modo MIDI por USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Activouse o modo de accesorio USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Conectouse un accesorio USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toca para ver máis opcións."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Cargando o dispositivo conectado. Toca para ver máis opcións."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Detectouse un accesorio de audio analóxico"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo conectado non é compatible con este teléfono. Toca para obter máis información."</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB conectada"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Toca para desactivar a depuración de erros de USB."</string>
- <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecciona a opción para desactivar a depuración de USB."</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Toca para desactivar a depuración por USB"</string>
+ <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecciona a opción para desactivar a depuración por USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Creando informe de erros…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Queres compartir o informe de erros?"</string>
<string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Compartindo informe de erros..."</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Mostrando <xliff:g id="NAME">%s</xliff:g> sobre outras aplicacións"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> móstrase sobre outras aplicacións"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca para abrir a configuración e desactívaa."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactivar"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando a <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando se hai erros"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Detectouse unha <xliff:g id="NAME">%s</xliff:g> nova"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre activada conectándose..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre activada conectada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectácheste da VPN sempre activada"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro na VPN sempre activada"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Cambia a configuración da rede ou da VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Escoller un ficheiro"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Non se seleccionou ningún ficheiro"</string>
<string name="reset" msgid="2448168080964209908">"Restablecer"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo de coche activado"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toca para saír do modo de coche."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Conexión compartida ou zona wifi activada"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tocar para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"A conexión compartida está desactivada"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Unidade USB de <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"almacenamento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alerta de uso de datos"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Toca para uso e configuración."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Límite de datos de 2G-3G acadado"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Límite de datos de 4G acadado"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Aviso de consumo de datos"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Utilizaches <xliff:g id="APP">%s</xliff:g> de datos"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Alcanzouse o límite de datos móbiles"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Límite de datos da wifi acadado"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Datos pausados para o resto do ciclo"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Límite de datos 2G-3G superado"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Límite de datos 4G superado"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Límite de datos móbiles superado"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Límite de datos Wi-Fi superado"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> supera o límite especificado."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Pausáronse os datos para o resto do ciclo"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Límite de datos móbiles superado"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Límite de datos wifi superado"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Pasácheste <xliff:g id="SIZE">%s</xliff:g> do límite establecido"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Datos en segundo plano limitados"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Toca para eliminar a restrición."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Uso de datos elevado"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Nos últimos días estás usando máis datos do habitual. Toca para ver o uso e a configuración."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Uso elevado de datos móbiles"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"As aplicacións utilizaron máis datos do normal"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"A aplicación <xliff:g id="APP">%s</xliff:g> utilizou máis datos do normal"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificado de seguranza"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Este certificado é válido."</string>
<string name="issued_to" msgid="454239480274921032">"Emitido para:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado polo teu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado polo teu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado polo teu administrador"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Para axudar a mellorar a duración da batería, a función Aforro de batería reduce o rendemento do dispositivo e limita a vibración, os servizos de localización e a maioría dos datos en segundo plano. É posible que o correo electrónico, as mensaxes e outras aplicacións que dependen da sincronización non se actualicen a menos que os abras. \n\nA función Aforro de batería desactívase automaticamente cando o dispositivo está cargando."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Para contribuír a reducir o uso de datos, o Economizador de datos impide que algunhas aplicacións envíen ou reciban datos en segundo plano. Cando esteas utilizando unha aplicación, esta poderá acceder aos datos, pero é posible que o faga con menos frecuencia. Por exemplo, é posible que as imaxes non se mostren ata que as toques."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Queres activar o economizador de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
@@ -1682,9 +1705,9 @@
<item quantity="other">Durante %1$d min (ata as <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Durante un min (ata as <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">Durante %1$d horas (ata as <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante unha hora (ata as <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">Durante %1$d horas (ata: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Durante 1 hora (ata: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Durante %1$d h (ata as <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1698,9 +1721,9 @@
<item quantity="other">Durante %d min</item>
<item quantity="one">Durante un min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Durante %d horas</item>
- <item quantity="one">Durante unha hora</item>
+ <item quantity="one">Durante 1 hora</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Durante %d h</item>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"Silenciado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Produciuse un erro interno no teu dispositivo e quizais funcione de maneira inestable ata o restablecemento dos datos de fábrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Produciuse un erro interno co teu dispositivo. Contacta co teu fabricante para obter máis información."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"A solicitude USSD transformouse nunha solicitude DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"A solicitude USSD transformouse nunha solicitude SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"A solicitude USSD transformouse nunha nova solicitude USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"A solicitude USSD transformouse nunha solicitude DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"A solicitude SS transformouse nunha solicitude DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"A solicitude SS transformouse nunha solicitude DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"A solicitude SS transformouse nunha solicitude USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"A solicitude SS transformouse nunha nova solicitude SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de traballo"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Despregar"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Contraer"</string>
@@ -1789,7 +1820,7 @@
<string name="app_category_maps" msgid="5878491404538024367">"Mapas e navegación"</string>
<string name="app_category_productivity" msgid="3742083261781538852">"Produtividade"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"Almacenamento do dispositivo"</string>
- <string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Depuración de USB"</string>
+ <string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Depuración por USB"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"hora"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"minuto"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Definir hora"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Detectouse unha aplicación daniña"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"A aplicación <xliff:g id="APP_0">%1$s</xliff:g> quere mostrar partes de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"As chamadas e as notificacións vibrarán"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"As chamadas e as notificacións estarán silenciadas"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Cambios no sistema"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Non molestar"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"O modo Non molestar oculta as notificacións para axudarche a centrarte"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é un comportamento novo. Toca para cambialo."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo Non molestar cambiou"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toca para cambiar a túa configuración de comportamentos para as interrupcións"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toca para comprobar o contido bloqueado."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index bf48dedd70ba..36dadd69e4ee 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"કૉલર ID પ્રતિબંધિત નહીં પર ડિફોલ્ટ છે. આગલો કૉલ: પ્રતિબંધિત નહીં"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"સેવાની જોગવાઈ કરી નથી."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"તમે કૉલર ID સેટિંગ બદલી શકતાં નથી."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"કોઈ ડેટા સેવા નથી"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"કટોકટીમાં કૉલ કરવાની કોઈ સુવિધા નથી"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"કોઈ મોબાઇલ ડેટા સેવા નથી"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"કોટોકટીની કૉલિંગ સેવા અનુપલબ્ધ"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"કોઈ વૉઇસ સેવા નથી"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"કોઈ વૉઇસ/કટોકટીની સેવા નથી"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"તમારા સ્થળે મોબાઇલ નેટવર્ક દ્વારા અસ્થાયીરૂપે ઑફર કરવામાં આવતી નથી"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"નેટવર્ક પર પહોંચી શકાતું નથી"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"રિસેપ્શનને બહેતર બનાવવા માટે, સેટિંગ &gt; નેટવર્ક અને ઇન્ટરનેટ &gt; મોબાઇલ નેટવર્ક &gt; પસંદગીના નેટવર્ક પ્રકાર પર જઈને પસંદ કરેલ પ્રકાર બદલવાનો પ્રયાસ કરો."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"વાઇ-ફાઇ કૉલિંગ સક્રિય છે"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"કટોકટીના કૉલ માટે એક મોબાઇલ નેટવર્કની આવશ્યકતા છે."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"કોઈ વૉઇસ સેવા અથવા કટોકટીની કૉલિંગ સેવા નથી"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"તમારા કૅરિઅરે હંગામી રૂપે બંધ કરી છે"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"મોબાઇલ નેટવર્ક સુધી પહોંચી શકાતું નથી"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"પસંદગીનું નેટવર્ક બદલવાનો પ્રયાસ કરો. બદલવા માટે ટૅપ કરો."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"કટોકટીની કૉલિંગ સેવા અનુપલબ્ધ"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"વાઇ-ફાઇ પરથી કટોકટીના કૉલ કરી શકાતા નથી"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ચેતવણીઓ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"કૉલ ફૉર્વર્ડિંગ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"કટોકટી કૉલબૅક મોડ"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"રોમિંગ બેનર ચાલુ"</string>
<string name="roamingText12" msgid="1189071119992726320">"રૉમિંગ બૅનર બંધ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"સેવા શોધી રહ્યું છે"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"વાઇ-ફાઇ કૉલિંગ"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"વાઇ-ફાઇ પરથી કૉલ કરવા અને સંદેશા મોકલવા માટે પહેલાં તમારા કૅરિઅરને આ સેવા સેટ કરવા માટે કહો. પછી સેટિંગ્સમાંથી વાઇ-ફાઇ કૉલિંગ ફરીથી ચાલુ કરો. (ભૂલ કોડ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"તમારા કૅરિઅર સાથે નોંધણી કરો (ભૂલ કોડ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s વાઇ-ફાઇ કૉલિંગ"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ઘણી બધી વિનંતીઓ પર પ્રક્રિયા કરવામાં આવી રહી છે. પછીથી ફરી પ્રયાસ કરો."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> માટે સાઇન ઇન ભૂલ"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"સમન્વયન"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"સમન્વયન"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"ઘણાં બધા <xliff:g id="CONTENT_TYPE">%s</xliff:g> કાઢી નાખે છે."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ટેબ્લેટ સ્ટોરેજ પૂર્ણ ભરેલું છે. સ્થાન ખાલી કરવા માટે કેટલીક ફાઇલો કાઢી નાખો."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ઘડિયાળ સ્ટોરેજ પૂર્ણ ભરેલું છે. સ્થાન ખાલી કરવા માટે કેટલીક ફાઇલો કાઢી નાખો."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV સ્ટોરેજ પૂર્ણ ભરેલું છે. સ્થાન ખાલી કરવા માટે કેટલીક ફાઇલો કાઢી નાખો."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"તમારી કાર્ય પ્રોફાઇલના વ્યવસ્થાપક દ્વારા"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> દ્વારા"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"કાર્યાલયની પ્રોફાઇલ કાઢી નાખી"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"ખૂટતી વ્યવસ્થાપક ઍપ્લિકેશનને કારણે કાર્યાલયની પ્રોફાઇલ કાઢી નાખી"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"કાર્ય પ્રોફાઇલ વ્યવસ્થાપક ઍપ્લિકેશન ખૂટે છે અથવા તો દૂષિત છે. પરિણામે, તમારી કાર્યાલયની પ્રોફાઇલ અને તે સંબંધિત ડેટા કાઢી નાખવામાં આવ્યો છે. સહાયતા માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"આ ઉપકરણ પર તમારી કાર્યાલયની પ્રોફાઇલ હવે ઉપલબ્ધ નથી"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"પાસવર્ડના ઘણા વધુ પ્રયત્નો"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"ઉપકરણ સંચાલિત છે"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"તમારી સંસ્થા આ ઉપકરણનું સંચાલન કરે છે અને નેટવર્ક ટ્રાફિફનું નિયમન કરી શકે છે. વિગતો માટે ટૅપ કરો."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"તમારું ઉપકરણ કાઢી નાખવામાં આવશે"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"આ વ્યવસ્થાપક ઍપ્લિકેશનનો ઉપયોગ કરી શકાશે નહીં. તમારું ઉપકરણ હવે કાઢી નાખવામાં આવશે.\n\nજો તમને પ્રશ્નો હોય, તો તમારી સંસ્થાના વ્યવસ્થાપકનો સંપર્ક કરો."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"વ્યવસ્થાપક ઍપનો ઉપયોગ કરી શકાશે નહીં. તમારું ઉપકરણ હવે કાઢી નાખવામાં આવશે.\n\nજો તમને પ્રશ્નો હોય, તો તમારી સંસ્થાના વ્યવસ્થાપકનો સંપર્ક કરો."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> દ્વારા પ્રિન્ટ કરવાનું બંધ કરાયું છે."</string>
<string name="me" msgid="6545696007631404292">"હું"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ટેબ્લેટ વિકલ્પો"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"એરપ્લેન મોડ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"એરપ્લેન મોડ ચાલુ છે."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"એરપ્લેન મોડ બંધ છે."</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"બૅટરી સેવર"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"બૅટરી સેવર બંધ છે"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"બૅટરી સેવર ચાલુ છે"</string>
<string name="global_action_settings" msgid="1756531602592545966">"સેટિંગ્સ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"સહાય"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"વૉઇસ સહાય"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"કાર્યાલયની પ્રોફાઇલ પર સ્વિચ કરો"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"સંપર્કો"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"તમારા સંપર્કોને ઍક્સેસ કરવાની"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારા સંપર્કોને ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"સ્થાન"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"કૅલેન્ડર"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"તમારા કેલેન્ડરને ઍક્સેસ કરવાની"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારા કૅલેન્ડરને ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS સંદેશા મોકલવાની અને જોવાની"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને SMS સંદેશા મોકલવા અને જોવાની મંજૂરી આપો"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"સ્ટોરેજ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"તમારા ઉપકરણ પર ફોટો, મીડિયા અને ફાઇલો ઍક્સેસ કરવાની"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારા ઉપકરણ પર ફોટો, મીડિયા, અને ફાઇલોને ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"માઇક્રોફોન"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ઑડિઓ રેકોર્ડ કરવાની"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને ઑડિઓ રોકૉર્ડ કરવાની મંજૂરી આપો"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"કૅમેરો"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ચિત્રો લેવાની અને વીડિઓ રેકોર્ડ કરવાની"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને ચિત્રો લેવાની અને વીડિઓ રેકૉર્ડ કરવાની મંજૂરી આપો"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"ફોન"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ફોન કૉલ કરો અને સંચાલિત કરો"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને ફોન કૉલ કરવાની અને તેને સંચાલિત કરવાની મંજૂરી આપો"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"બોડી સેન્સર્સ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"તમારા મહત્વપૂર્ણ ચિહ્નો વિશે સેન્સર ડેટા ઍક્સેસ કરો"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારા મહત્વપૂર્ણ ચિહ્નો વિશેના સેન્સર ડેટાને ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"વિંડો સામગ્રી પુનર્પ્રાપ્ત કરો"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"તમે જેની સાથે ક્રિયાપ્રતિક્રિયા કરી રહ્યાં છો તે વિંડોની સામગ્રીની તપાસ કરો."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"સ્પર્શ કરીને શોધખોળ કરવું સક્ષમ કરો"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"હાવભાવ કરો"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"ટૅપ, સ્વાઇપ, પિંચ કરી અને અન્ય હાવભાવ કરી શકે છે."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ફિંગરપ્રિન્ટ સંકેતો"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"ઉપકરણોનાં ફિંગરપ્રિન્ટ સેન્સર પર ભજવેલા સંકેતો કૅપ્ચર કરી શકે છે."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"ઉપકરણના ફિંગરપ્રિન્ટ સેન્સર પર કરવામાં આવેલા સંકેતો કૅપ્ચર કરી શકે છે."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"સ્ટેટસ બારને અક્ષમ કરો અથવા તેમાં ફેરફાર કરો"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ઍપ્લિકેશનને સ્ટેટસ બાર અક્ષમ કરવાની અથવા સિસ્ટમ આયકન્સ ઉમેરવા અને દૂર કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"સ્ટેટસ બારમાં બતાવો"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"એપ્લિકેશનને મેમરીમાં પોતાના ભાગ સતત બનાવવાની મંજૂરી આપે છે. આ ટેબ્લેટને ધીમું કરીને અન્ય ઍપ્લિકેશનો પર ઉપલબ્ધ મેમરીને સીમિત કરી શકે છે."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"એપ્લિકેશનને મેમરીમાં પોતાના ભાગ સતત બનાવવાની મંજૂરી આપે છે. આ ટીવીને ધીમું કરીને અન્ય ઍપ્લિકેશનો પર ઉપલબ્ધ મેમરીને સીમિત કરી શકે છે."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"એપ્લિકેશનને મેમરીમાં પોતાના ભાગ સતત બનાવવાની મંજૂરી આપે છે. આ ફોનને ધીમો કરીને અન્ય ઍપ્લિકેશનો પર ઉપલબ્ધ મેમરીને સીમિત કરી શકે છે."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ફૉરગ્રાઉન્ડ સેવા ચલાવો"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"ઍપને ફૉરગ્રાઉન્ડ સેવાઓનો ઉપયોગ કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"ઍપ્લિકેશન સંગ્રહ સ્થાન માપો"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"એપ્લિકેશનને તેનો કોડ, ડેટા અને કેશ કદ પુનઃપ્રાપ્ત કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"સિસ્ટમ સેટિંગ્સ સંશોધિત કરો"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"પૅટર્ન અનલૉક."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ફેસ અનલૉક"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"પિન અનલૉક."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"પિનથી સિમને અનલૉક કરો."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Pukથી સિમને અનલૉક કરો."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"પાસવર્ડ અનલૉક કરો."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"પૅટર્ન ક્ષેત્ર."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"સ્લાઇડ ક્ષેત્ર."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"ક્લિપબોર્ડ પર ટેક્સ્ટ કૉપિ કરી."</string>
<string name="more_item_label" msgid="4650918923083320495">"વધુ"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"મેનૂ+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"કાઢી નાખો"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"અપડેટ માટે તપાસો"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> ઍપ્લિકેશન (<xliff:g id="PROCESS">%2$s</xliff:g> પ્રક્રિયા)એ તેની સ્વ-લાગુ કરેલ StrictMode નીતિનું ઉલ્લંઘન કર્યું છે."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> પ્રક્રિયાએ તેની સ્વ-લાગુ કરેલ StrictMode નીતિનું ઉલ્લંઘન કર્યું છે."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android અપગ્રેડ થઈ રહ્યું છે..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android પ્રારંભ થઈ રહ્યું છે…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ફોન અપડેટ થઈ રહ્યો છે…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ટૅબ્લેટ અપડેટ થઈ રહ્યું છે…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"ઉપકરણ અપડેટ થઈ રહ્યું છે…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ફોન શરૂ થઈ રહ્યો છે…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ટૅબ્લેટ શરૂ થઈ રહ્યું છે…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"ઉપકરણ શરૂ થઈ રહ્યું છે…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"સંગ્રહ ઓપ્ટિમાઇઝ કરી રહ્યું છે."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android અપડેટ સમાપ્ત કરી રહ્યાં છે…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"અપગ્રેડ સમાપ્ત ન થાય ત્યાં સુધી કેટલીક ઍપ્લિકેશનો કદાચ યોગ્ય રીતે કામ ન કરે"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"સિસ્ટમ અપડેટ સમાપ્ત કરી રહ્યાં છીએ…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> અપગ્રેડ થઈ રહી છે…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> માંથી <xliff:g id="NUMBER_0">%1$d</xliff:g> ઍપ્લિકેશન ઓપ્ટિમાઇઝ કરી રહ્યું છે."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> તૈયાર કરી રહ્યું છે."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ઍપ્લિકેશનો શરૂ કરી રહ્યાં છે."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"બૂટ સમાપ્ત કરી રહ્યાં છે."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ચાલુ છે"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"ગેમ પર પાછા આવવા માટે ટૅપ કરો"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ગેમ પસંદ કરો"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"બહેતર કાર્યપ્રદર્શન માટે, આ ગેમમાંથી માત્ર એક વખતે એક જ ગેમ ખોલી શકાશે."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> પર પાછા જાઓ"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> ખોલો"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ફેરફારો સાચવ્યા વિના બંધ થશે"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> એ મેમરી સીમા વટાવી"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"હીપ ડમ્પ ભેગો કરવામાં આવ્યો છે; શેર કરવા માટે ટૅપ કરો"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"હીપ ડમ્પ શેર કરીએ?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"પ્રક્રિયા <xliff:g id="PROC">%1$s</xliff:g> એ તેની <xliff:g id="SIZE">%2$s</xliff:g> ની પ્રક્રિયા મેમરી મર્યાદા ઓળંગી. તેના વિકાસકર્તા સાથે શેર કરવા તમારી માટે એક હીપ ડમ્પ ઉપલબ્ધ છે. સાવચેત રહો: આ હીપ ડમ્પમાં તમારી વ્યક્તિગત માહિતી શામેલ હોઈ શકે છે કે જેની એપ્લિકેશનને ઍક્સેસ છે."</string>
<string name="sendText" msgid="5209874571959469142">"ટેક્સ્ટ માટે ક્રિયા પસંદ કરો"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ખુલ્લા વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરો"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"કૅરિઅરના વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરો"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ખુલ્લા વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરી રહ્યાં છીએ"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કર્યુ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરી શકાયું નથી"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"બધા નેટવર્ક જોવા ટૅપ કરો"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"કનેક્ટ કરો"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"બધા નેટવર્ક"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"બધા નેટવર્કો"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"વાઇ-ફાઇ આપમેળે ચાલુ થઈ જશે"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"જ્યારે તમે એક ઉચ્ચ ક્વૉલિટીવાળા સાચવેલ નેટવર્કની નજીક હોવ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"પાછું ચાલુ કરશો નહીં"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"રિસ્ટાર્ટ કરો"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"મોબાઇલ સેવાને સક્રિય કરો"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"તમારું નવું સિમ સક્રિય કરવા માટે કૅરિઅર ઍપ ડાઉનલોડ કરો"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"તમારું નવું સિમ સક્રિય કરવા માટે <xliff:g id="APP_NAME">%1$s</xliff:g> ઍપ ડાઉનલોડ કરો"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ઍપ ડાઉનલોડ કરો"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"નવું સિમ દાખલ કર્યું"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"તેને સેટ કરવા માટે ટૅપ કરો"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB મારફતે PTP ચાલુ કર્યું"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USBથી ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ કરી"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB મારફતે MIDI ચાલુ કર્યું"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ઍક્સેસરી મોડ ચાલુ કર્યો"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB ઍક્સેસરી કનેક્ટ કરેલ છે"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"વધુ વિકલ્પો માટે ટૅપ કરો."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"કનેક્ટ કરેલ ઉપકરણ ચાર્જ થઈ રહ્યું છે. વધુ વિકલ્પો માટે ટૅપ કરો."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"એનાલોગ ઑડિઓ ઍક્સેસરી મળી"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"જોડેલ ઉપકરણ આ ફોન સાથે સુસંગત નથી. વધુ જાણવા માટે ટૅપ કરો."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ડીબગિંગ કનેક્ટ થયું."</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB ડીબગિંગ અક્ષમ કરવા માટે ટૅપ કરો."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB ડિબગીંગ બંધ કરવા માટે ટૅપ કરો"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ડિબગીંગને અક્ષમ કરવા માટે પસંદ કરો."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"બગ રિપોર્ટ લઈ રહ્યાં છે…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"બગ રિપોર્ટ શેર કરીએ?"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનોની ઉપર પ્રદર્શિત થઈ રહ્યું છે"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનો પર દેખાઈ છે"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"જો તમે નથી ઇચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તેને બંધ કરો."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"બંધ કરો"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"બંધ કરો"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ને તૈયાર કરી રહ્યું છે"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ભૂલો માટે તપાસી રહ્યું છે"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"નવું <xliff:g id="NAME">%s</xliff:g> મળ્યું"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"હંમેશા-ચાલુ VPN કનેક્ટ થઈ રહ્યું છે…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"હંમેશા-ચાલુ VPN કનેક્ટ થયું"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"હંમેશાં-ચાલુ VPN થી ડિસ્કનેક્ટ થયું"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"હંમેશાં ચાલુ VPN ભૂલ"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"નેટવર્ક અથવા VPN સેટિંગ્સ બદલો"</string>
<string name="upload_file" msgid="2897957172366730416">"ફાઇલ પસંદ કરો"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"કોઈ ફાઇલ પસંદ કરેલી નથી"</string>
<string name="reset" msgid="2448168080964209908">"ફરીથી સેટ કરો"</string>
<string name="submit" msgid="1602335572089911941">"સબમિટ કરો"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"કાર મોડ સક્ષમ છે"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"કાર મોડથી બહાર નીકળવા માટે ટૅપ કરો."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"ટિથરિંગ અથવા હૉટસ્પૉટ સક્રિય"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"સેટ કરવા માટે ટૅપ કરો."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ટિથરિંગ અક્ષમ કરેલ છે"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ડ્રાઇવ"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB સ્ટોરેજ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"સંપાદિત કરો"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"ડેટા વપરાશ ચેતવણી"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"વપરાશ અને સેટિંગ્સ જોવા ટૅપ કરો."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ડેટા મર્યાદા પર પહોંચ્યાં"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ડેટા મર્યાદા સુધી પહોંચ્યાં"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ડેટા ચેતવણી"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"તમે <xliff:g id="APP">%s</xliff:g> ડેટા વાપર્યો છે"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"મોબાઇલ ડેટાની મર્યાદા આવી ગઈ"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"વાઇ-ફાઇ ડેટા સીમા પર પહોંચ્યાં"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"બાકીના ચક્ર માટે ડેટા થોભાવ્યો"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G ડેટા મર્યાદા ઓળંગાઈ"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ડેટા મર્યાદા ઓળંગાઈ"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"મોબાઇલ ડેટા મર્યાદા ઓળંગાઈ"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"વાઇ-ફાઇ ડેટા મર્યાદા ઓળંગાઈ"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"ઉલ્લેખિત મર્યાદાથી <xliff:g id="SIZE">%s</xliff:g> વધુ."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"તમારા બાકીના ચક્ર માટે ડેટા થોભાવ્યો"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"મોબાઇલ ડેટાના મર્યાદાથી વધુ"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"વાઇ-ફાઇ ડેટાના મર્યાદાથી વધુ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"તમે તમારી સેટ કરેલ મર્યાદા કરતાં વધુ <xliff:g id="SIZE">%s</xliff:g>નો ઉપયોગ કર્યો છે"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"બૅકગ્રાઉન્ડ ડેટા પ્રતિબંધિત"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"પ્રતિબંધ દૂર કરવા માટે ટૅપ કરો."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"વધુ પડતો ડેટા વપરાશ"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"છેલ્લા થોડા દિવસ દરમ્યાનમાં તમારો ડેટા વપરાશ સામાન્ય કરતાં વધુ થયો છે. વપરાશ અને સેટિંગ જોવા માટે ટૅપ કરો."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ઉચ્ચ મોબાઇલ ડેટા વપરાશ"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"તમારા ઍપએ સામાન્ય કરતાં વધુ ડેટાનો વપરાશ કર્યો છે"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g>એ સામાન્ય કરતાં વધુ ડેટાનો વપરાશ કર્યો છે"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"સુરક્ષા પ્રમાણપત્ર"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"આ પ્રમાણપત્ર માન્ય છે."</string>
<string name="issued_to" msgid="454239480274921032">"આને રજૂ:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"તમારા વ્યવસ્થાપક દ્વારા ઇન્સ્ટૉલ કરવામાં આવેલ છે"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"તમારા વ્યવસ્થાપક દ્વારા અપડેટ કરવામાં આવેલ છે"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"તમારા વ્યવસ્થાપક દ્વારા કાઢી નાખવામાં આવેલ છે"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"બૅટરી આવરદા વધુ સારી કરવામાં સહાય કરવા માટે, બૅટરી સેવર તમારા ઉપકરણના કાર્યપ્રદર્શનને ઘટાડે છે અને વાઇબ્રેશન, સ્થાન સેવાઓ અને મોટાભાગના બૅકગ્રાઉન્ડ ડેટાને સીમિત કરે છે. ઇમેઇલ, મેસેજિંગ અને અન્ય ઍપ જે સિંક થવા પર આધાર રાખે છે, તેમને કદાચ તમે ખોલશો નહીં ત્યાં સુધી અપડેટ થઈ શકશે નહીં.\n\nજ્યારે તમારું ઉપકરણ ચાર્જ થઈ રહ્યું હોય ત્યારે બૅટરી સેવર આપમેળે બંધ થઈ જાય છે."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ડેટા વપરાશને ઘટાડવામાં સહાય માટે, ડેટા સેવર કેટલીક ઍપ્લિકેશનોને પૃષ્ઠભૂમિમાં ડેટા મોકલવા અથવા પ્રાપ્ત કરવાથી અટકાવે છે. તમે હાલમાં ઉપયોગ કરી રહ્યાં છો તે ઍપ્લિકેશન ડેટાને ઍક્સેસ કરી શકે છે, પરંતુ તે આ ક્યારેક જ કરી શકે છે. આનો અર્થ એ હોઈ શકે છે, ઉદાહરણ તરીકે, છબીઓ ત્યાં સુધી પ્રદર્શિત થશે નહીં જ્યાં સુધી તમે તેને ટૅપ નહીં કરો."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ડેટા સેવર ચાલુ કરીએ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ચાલુ કરો"</string>
@@ -1682,7 +1705,7 @@
<item quantity="one">%1$d મિનિટ માટે (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> સુધી)</item>
<item quantity="other">%1$d મિનિટ માટે (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> સુધી)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">%1$d કલાક માટે (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> સુધી)</item>
<item quantity="other">%1$d કલાક માટે (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> સુધી)</item>
</plurals>
@@ -1698,7 +1721,7 @@
<item quantity="one">%d મિનિટ માટે</item>
<item quantity="other">%d મિનિટ માટે</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">%d કલાક માટે</item>
<item quantity="other">%d કલાક માટે</item>
</plurals>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> દ્વારા મ્યૂટ કરાયું"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"તમારા ઉપકરણમાં આંતરિક સમસ્યા છે અને જ્યાં સુધી તમે ફેક્ટરી ડેટા ફરીથી સેટ કરશો નહીં ત્યાં સુધી તે અસ્થિર રહી શકે છે."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"તમારા ઉપકરણમાં આંતરિક સમસ્યા છે. વિગતો માટે તમારા નિર્માતાનો સંપર્ક કરો."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD વિનંતીને DIAL વિનંતી પર સંશોધિત કરી."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD વિનંતીને SS વિનંતી પર સંશોધિત કરી."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD વિનંતીને નવી USSD વિનંતી પર સંશોધિત કરી."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD વિનંતીને વીડિઓ DIAL વિનંતીમાં સંશોધિત કરી."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS વિનંતીને DIAL વિનંતી પર સંશોધિત કરી."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS વિનંતીને વીડિઓ DIAL વિનંતીમાં સંશોધિત કરી."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS વિનંતીને USSD વિનંતી પર સંશોધિત કરી."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS વિનંતીને નવી SS વિનંતી પર સંશોધિત કરી."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"કાર્યાલયની પ્રોફાઇલ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"વિસ્તૃત કરો"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"સંકુચિત કરો"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"નુકસાનકારક ઍપ મળી આવી છે"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>એ <xliff:g id="APP_2">%2$s</xliff:g> સ્લાઇસ બતાવવા માગે છે"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ફેરફાર કરો"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"કૉલ અને નોટિફિકેશન માટે ઉપકરણ વાઇબ્રેટ થશે"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"કૉલ અને નોટિફિકેશન મ્યૂટ કરવામાં આવશે"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"સિસ્ટમના ફેરફારો"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ખલેલ પાડશો નહીં"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"તમને ફોકસ કરવામાં સહાય કરવા માટે ખલેલ પાડશો નહીં નોટિફિકેશન છુપાવે છે"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"આ નવી વર્તણૂક છે. બદલવા માટે ટૅપ કરો."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ખલેલ પાડશો નહીંમાં ફેરફાર થયો છે"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"વિક્ષેપો સંબંધિત તમારી વર્તણૂક સેટિંગ તપાસવા માટે ટૅપ કરો"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"શું બ્લૉક કરેલ છે તે તપાસવા માટે ટૅપ કરો."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index bb1af18831e7..57f841b4a822 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"कॉलर आईडी डिफ़ॉल्ट रूप से सीमित नहीं है. अगली कॉल: सीमित नहीं"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"सेवा प्रावधान की हुई नहीं है."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"आप कॉलर आईडी सेटिंग नहीं बदल सकते."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"कोई डेटा सेवा नहीं है"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"कोई भी आपातकालीन कॉलिंग नहीं है"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"मोबाइल डेटा सेवा पर रोक लगा दी गई है"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"आपातकालीन कॉल पर रोक लगा दी गई है"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"कोई वॉइस सेवा नहीं है"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"कोई वॉइस/आपातकालीन सेवा नहीं है"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"मोबाइल नेटवर्क आपके जगह पर इस समय यह सेवाएं नहीं दे पा रहा"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्क तक नहीं पहुंच पा रहे हैं"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"रिसेप्शन बेहतर करने के लिए, सेटिंग &gt; नेटवर्क और इंटरनेट &gt; मोबाइल नेटवर्क &gt; पसंदीदा नेटवर्क प्रकार पर जाकर, चुना गया प्रकार बदलकर देखें."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"वाई-फ़ाई कॉलिंग सक्रिय है"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"आपातकालीन कॉल के लिए मोबाइल नेटवर्क ज़रूरी है."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"सामान्य (वॉइस) कॉल या आपातकालीन कॉल पर रोक लगा दी गई है"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"आपकी मोबाइल और इंटरनेट सेवा देने वाली कंपनी ने सेवा पर कुछ समय के लिए रोक लगा दी है"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"मोबाइल नेटवर्क से कनेक्ट नहीं किया जा सका"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"पसंदीदा नेटवर्क बदलकर देखें. बदलने के लिए टैप करें."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"आपातकालीन कॉल करने की सुविधा उपलब्ध नहीं है"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"वाई-फ़ाई नेटवर्क पर आपातकालीन कॉल नहीं की जा सकती"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"सूचनाएं"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल को दूसरे नंबर पर भेजना"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपातकालीन कॉलबैक मोड"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"रोमिंग बैनर चालू"</string>
<string name="roamingText12" msgid="1189071119992726320">"रोमिंग बैनर बंद"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"नेटवर्क खोज रहा है"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"वाई-फ़ाई कॉलिंग"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"वाई-फ़ाई से फ़ोन करने और मैसेज भेजने के लिए, सबसे पहले अपनी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से इस सेवा को सेट अप करने के लिए कहें. उसके बाद सेटिंग से वाई-फ़ाई कॉलिंग को फिर से चालू करें. (गड़बड़ी कोड: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"अपनी मोबाइल और इंटरनेट सेवा देने वाली कंपनी के साथ रजिस्टर करें (गड़बड़ी कोड: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s वाई-फ़ाई कॉलिंग"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"बहुत सारे अनुरोधों का संसाधन हो रहा है. बाद में पुन: प्रयास करें."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> के लिए प्रवेश गड़बड़ी"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"समन्वयन"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"समन्वयन"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"बहुत से <xliff:g id="CONTENT_TYPE">%s</xliff:g> हटाए जाते हैं."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"टैबलेट की मेमोरी भर गई है. जगह खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"घड़ी की मेमोरी भर गई है. स्‍थान खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"टीवी की मेमोरी भर गई है. जगह खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"आपकी कार्य प्रोफ़ाइल का व्यवस्थापक करता है"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> के द्वारा"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"कार्य प्रोफ़ाइल हटाई गई"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"अनुपलब्ध व्यवस्थापक ऐप्लिकेशन के कारण कार्य प्रोफ़ाइल हटा दी गई"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"कार्य प्रोफ़ाइल व्यवस्थापक ऐप्लिकेशन या तो मौजूद नहीं है या वह खराब हो गया है. परिणामस्वरूप, आपकी कार्य प्रोफ़ाइल और उससे जुड़े डेटा को हटा दिया गया है. सहायता के लिए अपने व्यवस्थापक से संपर्क करें."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"आपकी कार्य प्रोफ़ाइल अब इस डिवाइस पर उपलब्‍ध नहीं है"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"कई बार गलत पासवर्ड डाला गया"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"डिवाइस प्रबंधित है"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"आपका संगठन इस डिवाइस का प्रबंधन करता है और वह नेटवर्क ट्रैफ़िक की निगरानी भी कर सकता है. विवरण के लिए टैप करें."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"आपके डिवाइस को मिटा दिया जाएगा"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"व्यवस्थापक ऐप्लिकेशन का उपयोग नहीं किया जा सकता. अब आपके डिवाइस को मिटा दिया जाएगा.\n\nअगर आप सवाल पूछना चाहते हैं, तो अपने संगठन के व्यवस्थापक से संपर्क करें."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"एडमिन ऐप्लिकेशन का इस्तेमाल नहीं किया जा सकता. आपके डिवाइस पर मौजूद डेटा अब मिटा दिया जाएगा.\n\nअगर आप कुछ पूछना चाहते हैं तो, अपने संगठन के एडमिन से संपर्क करें."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> ने प्रिंटिंग सुविधा बंद कर दी है."</string>
<string name="me" msgid="6545696007631404292">"मैं"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"टैबलेट विकल्‍प"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"हवाई जहाज मोड"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाई जहाज मोड चालू है"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाई जहाज मोड बंद है"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"बैटरी सेवर"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"बैटरी सेवर बंद है"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"बैटरी सेवर चालू है"</string>
<string name="global_action_settings" msgid="1756531602592545966">"सेटिंग"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहायता"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज़ से डिवाइस का इस्तेमाल"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"प्रोफ़ाइल बदलकर कार्य प्रोफ़ाइल पर जाएं"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"संपर्क"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"अपने संपर्कों को ऐक्सेस करने की"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को अपने संपर्क तक पहुंचने दें"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"जगह"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"इस डिवाइस की जगह तक पहुंचने दें"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को इस डिवाइस की जगह तक पहुंचने दें"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"कैलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"अपने कैलेंडर को ऐक्सेस करने"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को अपना कैलेंडर तक पहुंचने दें"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"मैसेज (एसएमएस)"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"मैसेज (एसएमएस) भेजें और देखें"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को मैसेज (एसएमएस) भेजने और देखने दें"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"मेमोरी"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"अपने डिवाइस पर मौजूद फ़ोटो, मीडिया और फ़ाइलें ऐक्सेस करने की"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को अपने डिवाइस पर फ़ोटो, मीडिया और फ़ाइलों तक पहुंचने दें"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"माइक्रोफ़ोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ऑडियो रिकॉर्ड करें"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को ऑडियो रिकॉर्ड करने दें"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"कैमरा"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"चित्र लेने और वीडियो रिकॉर्ड करने"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को चित्र लेने दें और वीडियो रिकॉर्ड करने दें"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"फ़ोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फ़ोन कॉल करें और प्रबंधित करें"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को फ़ोन कॉल करने और संभालने दें"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"शरीर संवेदक"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"अपने महत्वपूर्ण संकेतों के बारे में सेंसर डेटा को ऐक्सेस करें"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को अपने अहम संकेतों के बारे में सेंसर डेटा का इस्तेमाल करने दें"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडो सामग्री प्राप्त करें"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"उस विंडो की सामग्री का निरीक्षण करें जिससे आप सहभागिता कर रहे हैं."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छूकर, उससे जुड़ी जानकारी सुनने की सुविधा चालू करें"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"जेस्चर करें"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"इस सेवा के ज़रिए टैप, स्वाइप, पिंच और बाकी जेस्चर किए जा सकते हैं."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"फ़िंगरप्रिंट जेस्चर"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"डिवाइस फ़िंगरप्रिंट सेंसर पर किए गए जेस्चर कैप्चर किए जा सकते हैं."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"डिवाइस के फ़िंगरप्रिंट सेंसर पर किए गए हाथ के जेस्चर (स्पर्श) कैप्चर किए जा सकते हैं."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"स्टेटस बार को अक्षम करें या बदलें"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ऐप को, स्टेटस बार को बंद करने या सिस्‍टम आइकॉन को जोड़ने और निकालने की अनुमति देता है."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"स्टेटस बार को रहने दें"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ऐप्स को मेमोरी में स्‍वयं के कुछ हिस्सों को लगातार बनाने की अनुमति देता है. यह अन्‍य ऐप्स के लिए उपलब्‍ध स्‍मृति को सीमित कर टैबलेट को धीमा कर सकता है."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"ऐप को मेमोरी में स्‍वयं के दीर्घस्थायी भाग बनाने देती है. इससे अन्‍य ऐप्‍स के लिए उपलब्‍ध मेमोरी सीमित हो सकती है जिससे टीवी धीमा हो सकता है."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ऐप्स को मेमोरी में स्‍वयं के कुछ हिस्सों को लगातार बनाने देता है. यह अन्‍य ऐप्स के लिए उपलब्‍ध स्‍मृति को सीमित कर फ़ोन को धीमा कर सकता है."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"स्क्रीन पर दिखने वाली सेवा चालू करें"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"ऐप्लिकेशन को स्क्रीन पर दिखने वाली सेवाएं इस्तेमाल करने दें."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"पता करें कि ऐप मेमोरी में कितनी जगह है"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"ऐप को उसका कोड, डेटा, और कैश मेमोरी के आकारों को फिर से पाने देता है"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"सिस्‍टम सेटिंग बदलें"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"आकार अनलॉक."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"मालिक का चेहरा पहचानकर अनलॉक करें."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"पिन के ज़रिए सिम अनलॉक करें."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"पीयूके के ज़रिए सिम अनलॉक करें."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवर्ड अनलॉक."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"आकार क्षेत्र."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"स्लाइड क्षेत्र."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"लेख को क्‍लिपबोर्ड पर कॉपी किया गया."</string>
<string name="more_item_label" msgid="4650918923083320495">"अधिक"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"मेन्यू+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"मिटाएं"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"देखें कि अपडेट उपलब्ध हैं या नहीं"</string>
<string name="smv_application" msgid="3307209192155442829">"ऐप्स <xliff:g id="APPLICATION">%1$s</xliff:g> (प्रक्रिया <xliff:g id="PROCESS">%2$s</xliff:g>) ने उसकी स्‍वयं लागू होने वाली StrictMode नीति का उल्‍लंघन किया है."</string>
<string name="smv_process" msgid="5120397012047462446">"प्रक्रिया <xliff:g id="PROCESS">%1$s</xliff:g> ने उसकी स्‍व-प्रवर्तित StrictMode नीति का उल्‍लंघन किया है."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android अपग्रेड हो रहा है..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android प्रारंभ हो रहा है…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"फ़ोन अपडेट हो रहा है…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"टैबलेट अपडेट हो रहा है…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"डिवाइस अपडेट हो रहा है…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"फ़ोन चालू हो रहा है…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"टैबलेट चालू हो रहा है…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"डिवाइस चालू हो रहा है…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"मेमोरी ऑप्‍टिमाइज़ हो रही है."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android अपडेट समाप्त हो रहा है…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"जब तक अपग्रेड पूरा नहीं हो जाता, हो सकता है कि तब तक कुछ ऐप्लिकेशन ठीक से काम ना करें"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"सिस्टम अपडेट पूरा होने वाला है…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> अपग्रेड हो रहा है…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> में से <xliff:g id="NUMBER_0">%1$d</xliff:g> ऐप्स अनुकूलित हो रहा है."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> तैयार हो रहा है."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ऐप्स प्रारंभ होने वाले हैं"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"बूट समाप्‍त हो रहा है."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चल रही है"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"गेम पर वापस जाने के लिए टैप करें"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"गेम चुनें"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"ऐप्लिकेशन को बेहतर ढंग से चलाने के लिए, इनमें से सिर्फ़ एक ही गेम को एक बार में खोला जा सकता है."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> पर वापस जाएं"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> खोलें"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> बिना सेव किए बंद हो जाएगा"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> मेमोरी सीमा को पार कर गई है"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"हीप डंप का संग्रह कर लिया गया है; शेयर करने के लिए टैप करें"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"हीप डंप शेयर करें?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"यह प्रक्रिया <xliff:g id="PROC">%1$s</xliff:g> इसकी <xliff:g id="SIZE">%2$s</xliff:g> की मेमोरी की सीमा को पार कर गई है. एक हीप डंप मौजूद है जिसे आप इसके डेवलपर से शेयर कर सकते हैं. सावधान रहें: इस हीप डंप में आपकी ऐसी कोई भी निजी जानकारी हो सकती है जिस पर ऐप्लिकेशन की पहुंच हो."</string>
<string name="sendText" msgid="5209874571959469142">"मैसेज करने के लिए कोई कार्रवाई चुनें"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"खुले वाई-फ़ाई नेटवर्क से कनेक्ट करें"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी के वाई-फ़ाई नेटवर्क से कनेक्ट करें"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"खुले वाई-फ़ाई नेटवर्क से कनेक्ट हो रहा है"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"वाई-फ़ाई नेटवर्क से कनेक्‍ट हो गया है"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"वाई-फ़ाई नेटवर्क से कनेक्‍ट नहीं हो सका"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सभी नेटवर्क देखने के लिए यहां पर टैप करें"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करें"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"सभी नेटवर्क"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सभी नेटवर्क"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"वाई-फ़ाई अपने आप चालू हो जाएगा"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"जब आप किसी अच्छी क्वालिटी वाले सेव किए गए नेटवर्क के पास हों"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"वापस चालू न करें"</string>
@@ -1203,7 +1224,8 @@
<string name="sim_added_message" msgid="6599945301141050216">"मोबाइल नेटवर्क की पहुंच पाने लिए अपना डिवाइस फिर से चालू करें."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"फिर से शुरू करें"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"माेबाइल सेवा चालू करें"</string>
- <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"अपने नए सिम काे चालू करने के लिए इंटरनेट सेवा देने वाली कंपनी का एेप्लिकेशन डाउनलोड करें"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"अपना नया सिम चालू करने के लिए मोबाइल और इंटरनेट सेवा देने वाली कंपनी का एेप्लिकेशन डाउनलोड करें"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"अपना नया सिम चालू करने के लिए <xliff:g id="APP_NAME">%1$s</xliff:g> एेप्लिकेशन डाउनलाेड करें"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ऐप्लिकेशन डाउनलोड करें"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"नई SIM डाली गई"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"इसे सेट करने के लिए टैप करें"</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"यूएसबी के ज़रिए पीटीपी की सुविधा चालू की गई"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"यूएसबी टेदरिंग की सुविधा चालू की गई"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"यूएसबी के ज़रिए एमआईडीआई (मिडी) की सुविधा चालू की गई"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"यूएसबी ऐक्सेसरी वाला मोड चालू कर दिया गया है"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"यूएसबी ऐक्सेसरी कनेक्ट हो गई है"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ज़्यादा विकल्पों के लिए टैप करें."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"जोड़ा गया डिवाइस चार्ज हो रहा है. ज़्यादा विकल्पों के लिए टैप करें."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"एनालॉग ऑडियो एक्सेसरी का पता चला"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"अटैच किया गया डिवाइस इस फ़ोन से संगत नहीं है. अधिक जानने के लिए टैप करें."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग कनेक्ट किया गया"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB डीबग करना अक्षम करने के लिए टैप करें."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"यूएसबी को डीबग करने की सुविधा बंद करने के लिए टैप करें"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB डीबग करना अक्षम करने के लिए चुनें."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"गड़बड़ी की रिपोर्ट ली जा रही है…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"गड़बड़ी की रिपोर्ट शेयर करें?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप्लिकेशन के ऊपर दिखाई दे रहा है"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप पर दिखाई दे रहा है"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने और उसे बंद करने के लिए टैप करें."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"बंद करें"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"बंद करें"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> को तैयार किया जा रहा है"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटियों की जाँच कर रहा है"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"नए <xliff:g id="NAME">%s</xliff:g> का पता लगा"</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"हमेशा-चालू VPN कनेक्ट हो रहा है…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"हमेशा-चालू VPN कनेक्ट है"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"हमेशा चालू रहने वाले VPN से डिसकनेक्ट किया गया"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"हमेशा-चालू VPN गड़बड़ी"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"नेटवर्क या VPN सेटिंग बदलें"</string>
<string name="upload_file" msgid="2897957172366730416">"फ़ाइल चुनें"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"कोई फ़ाइल चुनी नहीं गई"</string>
<string name="reset" msgid="2448168080964209908">"रीसेट करें"</string>
<string name="submit" msgid="1602335572089911941">"सबमिट करें"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"कार मोड सक्षम किया गया"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"कार मोड से बाहर निकलने के लिए टैप करें."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"टेदरिंग या हॉटस्‍पॉट सक्रिय"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"सेट करने के लिए टैप करें."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिंग अक्षम है"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB डिस्‍क"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB मेमोरी"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"बदलाव करें"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"डेटा खर्च की चेतावनी"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"उपयोग व सेटिंग देखने हेतु टैप करें."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G डेटा सीमा पूर्ण हो गई"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G डेटा सीमा पूर्ण हो गई"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"डेटा खर्च की चेतावनी"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"अाप <xliff:g id="APP">%s</xliff:g> डेटा इस्तेमाल कर चुके हैं"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"मोबाइल डेटा की सीमा पार हो गई है"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi डेटा की सीमा पूर्ण हो गई"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"शेष चक्र के लिए डेटा रोका गया"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G डेटा सीमा पार हो गई है"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G डेटा सीमा पार हो गई है"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"मोबाइल डेटा सीमा पार हो गई है"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"वाई-फ़ाई डेटा सीमा पार हो गई है"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> निर्दिष्ट सीमा से अधिक."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"आपकी मौजूदा बिलिंग साइकिल के बाकी दिनों के लिए डेटा का इस्तेमाल राेक दिया गया है"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"माेबाइल डेटा की सीमा से ज़्यादा"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"वाई-फ़ाई की सीमा से ज़्यादा डेटा खर्च"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"अाप अपनी तय सीमा से <xliff:g id="SIZE">%s</xliff:g> ज़्यादा डेटा इस्तेमाल कर चुके हैं"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"पृष्ठभूमि डेटा प्रतिबंधित है"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"प्रतिबंध निकालने हेतु टैप करें."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"डेटा खर्च ज़्यादा हो गया है"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"पिछले कुछ दिनों से आपका डेटा खर्च, सामान्य से ज़्यादा है. डेटा का इस्तेमाल और सेटिंग देखने के लिए टैप करें."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"माेबाइल डेटा का ज़्यादा इस्तेमाल"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"आपके एेप्लिकेशन ने आम तौर पर इस्तेमाल होने वाले डेटा से ज़्यादा डेटा खर्च कर दिया है"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ने आम तौर पर इस्तेमाल होने वाले डेटा से ज़्यादा डेटा खर्च कर दिया है"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"सुरक्षा प्रमाणपत्र"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"यह प्रमाणपत्र मान्य है."</string>
<string name="issued_to" msgid="454239480274921032">"इन्हें जारी किया गया:"</string>
@@ -1669,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"आपके व्यवस्थापक ने इंस्टॉल किया है"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"आपके व्यवस्थापक ने अपडेट किया है"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"आपके व्यवस्थापक ने हटा दिया है"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"बैटरी लाइफ़ को बेहतर बनाने में मदद करने के लिए, बैटरी सेवर आपके डिवाइस पर सिर्फ़ ज़रूरी ऐप्लिकेशन को काम करने देता है. यह कंपन (वाइब्रेशन), जगह की जानकारी से जुड़ी सेवाओं और ज़्यादातर बैकग्राउंड डेटा को सीमित कर देता है. हो सकता है कि ईमेल, मैसेज सेवा और सिंक पर आधारित दूसरे ऐप्लिकेशन तब तक ना खुलें जब तक कि आप उन्‍हें नहीं खोलते.\n\nजब आपका डिवाइस चार्ज हो रहा होता है, तब बैटरी सेवर अपने आप बंद हो जाता है."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"डेटा खर्च, कम करने के लिए डेटा सेवर कुछ ऐप को बैकग्राउंड में डेटा भेजने या पाने से रोकता है. आप फ़िलहाल जिस एेप का इस्तेमाल कर रहे हैं वह डेटा तक पहुंच सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इसे समझिये कि तस्वीर तब तक दिखाई नहीं देंगी जब तक कि आप उन्हें टैप नहीं करते."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा बचाने की सेटिंग चालू करें?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करें"</string>
@@ -1681,9 +1704,9 @@
<item quantity="one">%1$d मिनट के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item>
<item quantity="other">%1$d मिनट के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">%1$d घंटे के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item>
- <item quantity="other">%1$d घंटे के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">%1$d घंटों के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item>
+ <item quantity="other">%1$d घंटों के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">%1$d घंटे के लिए (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> तक)</item>
@@ -1697,9 +1720,9 @@
<item quantity="one">%d मिनट के लिए</item>
<item quantity="other">%d मिनट के लिए</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">%d घंटे के लिए</item>
- <item quantity="other">%d घंटे के लिए</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">%d घंटों के लिए</item>
+ <item quantity="other">%d घंटों के लिए</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">%d घंटे के लिए</item>
@@ -1720,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारा म्यूट किया गया"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"आपके डिवाइस में कोई अंदरूनी समस्या है और यह तब तक ठीक नहीं होगी जब तक आप फ़ैक्‍टरी डेटा रीसेट नहीं करते."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"आपके डिवाइस के साथ कोई आंतरिक गड़बड़ी हुई. विवरणों के लिए अपने निर्माता से संपर्क करें."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD अनुरोध को DIAL अनुरोध में बदल दिया गया है."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD अनुरोध को SS अनुरोध में बदल दिया गया है."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD अनुरोध को नए USSD अनुरोध में बदल दिया गया है."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD अनुरोध को वीडियो DIAL अनुरोध में बदल दिया गया है."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS अनुरोध को DIAL अनुरोध में बदल दिया गया है."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS अनुरोध को वीडियो DIAL अनुरोध में बदल दिया गया है."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS अनुरोध को USSD अनुरोध में बदल दिया गया है."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS अनुरोध को नए SS अनुरोध में बदल दिया गया है."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफ़ाइल"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तार करें"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"छोटा करें"</string>
@@ -1837,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"नुकसान पहुंचाने वाले ऐप का पता चला"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>, <xliff:g id="APP_2">%2$s</xliff:g> के हिस्से (स्लाइस) दिखाना चाहता है"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"बदलाव करें"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"कॉल अाैर सूचनाअाें के लिए डिवाइस वाइब्रेट हाेगा"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"कॉल अाैर सूचनाओं के लिए डिवाइस म्यूट रहेगा"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"सिस्टम में हुए बदलाव"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"परेशान न करें"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"आपका ध्यान न भटके, इसलिए परेशान न करें सुविधा सूचनाएं नहीं दिखा रही है"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"यह नई सुविधा है. बदलने के लिए टैप करें."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"परेशान न करें की सुविधा बदल गई है"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"सूचना पर टैप करके जानें कि आपने रुकावटों के लिए कौनसी सेटिंग सेट की है"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"टैप करके देखें कि किन चीज़ों पर रोक लगाई गई है."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index f740d742db04..22affdb71ba6 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -78,15 +78,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Zadana postavka ID-a pozivatelja nema ograničenje. Sljedeći poziv: Nije ograničen"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Usluga nije rezervirana."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Ne možete promijeniti postavku ID-a pozivatelja."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Podatkovna usluga nije dostupna"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Nema hitnih poziva"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Nema podatkovne mobilne usluge"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Hitni pozivi nisu dostupni"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Nema glasovnih usluga"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema glasovnih i hitnih usluga"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Trenutačno nije u ponudi mobilne mreže na vašoj lokaciji"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Pristup mreži nije moguć"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Za bolji prijem pokušajte promijeniti vrstu odabranu u odjeljku Postavke &gt; Mreža i internet &gt; Mobilne mreže &gt; Preferirana vrsta mreže."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Aktivni su Wi‑Fi pozivi"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Za hitne pozive potrebna je mobilna mreža."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nema glasovne usluge ni hitnih poziva"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Privremeno isključio vaš mobilni operater"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobilna mreža nije dostupna"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Pokušajte promijeniti preferiranu mrežu. Dodirnite da biste je promijenili."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hitni pozivi nisu dostupni"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Nije moguće upućivati hitne pozive putem Wi‑Fi-ja"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način hitnog povratnog poziva"</string>
@@ -121,13 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Uključen je natpis roaminga"</string>
<string name="roamingText12" msgid="1189071119992726320">"Isključen je natpis roaminga"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Pretraživanje usluge"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi pozivi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Da biste telefonirali i slali poruke putem Wi-Fi-ja, od mobilnog operatera morate tražiti da postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozive u postavkama. (Kôd pogreške: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registrirajte se kod mobilnog operatera (kôd pogreške: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi pozivanje"</item>
@@ -161,8 +160,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"U obradi je previše zahtjeva. Pokušajte ponovo kasnije."</string>
<string name="notification_title" msgid="8967710025036163822">"Pogreška prijave za račun <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinkronizacija"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkronizacija"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Previše brisanja stavki <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Prostor za pohranu tabletnog računala pun je. Izbrišite nekoliko datoteka kako biste oslobodili prostor."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Memorija sata je puna. Izbrišite neke datoteke da biste oslobodili prostor."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Prostor za pohranu na televizoru je pun. Izbrišite neke datoteke da biste oslobodili prostor."</string>
@@ -176,14 +177,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Administrator radnog profila"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Od strane domene <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Radni je profil izbrisan"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Radni je profil izbrisan jer nedostaje administratorska aplikacija"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Administratorska aplikacija radnog profila nedostaje ili je oštećena. Zbog toga su radni profil i povezani podaci izbrisani. Za pomoć se obratite svom administratoru."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Vaš radni profil više nije dostupan na ovom uređaju"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Previše pokušaja unosa zaporke"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Uređaj je upravljan"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Vaša organizacija upravlja ovim uređajem i može nadzirati mrežni promet. Dodirnite za pojedinosti."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Uređaj će se izbrisati"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Administratorska aplikacija ne može se upotrebljavati. Uređaj će se izbrisati.\n\nAko imate pitanja, obratite se administratoru organizacije."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Administratorska aplikacija ne može se upotrebljavati. Uređaj će se izbrisati.\n\nAko imate pitanja, obratite se administratoru organizacije."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Ispis je onemogućila aplikacija <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Ja"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opcije tabletnog uređaja"</string>
@@ -239,6 +239,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Način rada u zrakoplovu"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uključen je način rada u zrakoplovu"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Isključen je način rada u zrakoplovu"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Štednja baterije"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Štednja baterije isključena"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Štednja baterije uključena"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Postavke"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
@@ -272,31 +275,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Prijeđite na radni profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupati vašim kontaktima"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Dopustite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa vašim kontaktima"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupiti lokaciji ovog uređaja"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Dopustite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa lokaciji ovog uređaja"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupati kalendaru"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Dopustite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa vašem kalendaru"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"slati i pregledavati SMS poruke"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Dopustite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da šalje i pregledava SMS poruke"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Prostor za pohranu"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"pristupiti fotografijama, medijima i datotekama na vašem uređaju"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Dopustite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa fotografijama, medijima i datotekama na vašem uređaju"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"snimati zvuk"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Dopustite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da snima audiozapise"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparat"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"snimati fotografije i videozapise"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Dopustite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da fotografira i snima videozapise"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"uspostavljati telefonske pozive i upravljati njima"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Dopustite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da upućuje telefonske pozive i upravlja njima"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Biometrijski senzori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupiti podacima senzora o vašim vitalnim znakovima"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Dopustite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa podacima senzora o vašim vitalnim znakovima"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dohvaćati sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregledat će sadržaj prozora koji upotrebljavate."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključiti značajku Istraži dodirom"</string>
@@ -308,7 +320,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Izvođenje pokreta"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Može dodirnuti, prijeći prstom, spojiti prste i izvoditi druge pokrete."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Pokreti za otisak prsta"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Može snimati pokrete izvršene na senzoru otiska prsta na uređaju."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Može snimati pokrete izvršene na senzoru otiska prsta na uređaju."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"onemogućavanje ili izmjena trake statusa"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Aplikaciji omogućuje onemogućavanje trake statusa ili dodavanje i uklanjanje sistemskih ikona."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"biti traka statusa"</string>
@@ -359,6 +371,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Aplikaciji omogućuje trajnu prisutnost nekih njenih dijelova u memoriji. To može ograničiti dostupnost memorije drugim aplikacijama i usporiti tabletno računalo."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Aplikaciji omogućuje trajnu ugradnju nekih svojih dijelova u memoriju. To može ograničiti memoriju raspoloživu drugim aplikacijama i usporiti televizor."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Aplikaciji omogućuje trajnu prisutnost nekih njenih dijelova u memoriji. To može ograničiti dostupnost memorije drugim aplikacijama i usporiti telefon."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"pokrenuti uslugu u prednjem planu"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Omogućuje aplikaciji da upotrebljava usluge koje su u prednjem planu."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"mjerenje prostora za pohranu aplikacije"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Aplikaciji omogućuje dohvaćanje koda, podataka i veličine predmemorije"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"izmjena postavki sustava"</string>
@@ -805,6 +819,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Uzorak za otključavanje."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Otključavanje licem."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje PIN-om."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Otključavanje SIM-a PIN-om."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Otključavanje SIM-a PUK-om."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje zaporkom."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Područje uzorka."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Područje klizanja."</string>
@@ -866,6 +882,12 @@
<string name="text_copied" msgid="4985729524670131385">"Tekst kopiran u međuspremnik."</string>
<string name="more_item_label" msgid="4650918923083320495">"Više"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Izbornik+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"razmak"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"izbriši"</string>
@@ -1094,31 +1116,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Provjeri ažuriranja"</string>
<string name="smv_application" msgid="3307209192155442829">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) prekršila je vlastito pravilo StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> prekršio je svoje vlastito pravilo StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android se nadograđuje…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Pokretanje Androida..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefon se ažurira…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet se ažurira…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Uređaj se ažurira…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon se pokreće…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet se pokreće…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Uređaj se pokreće…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimiziranje pohrane."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dovršavanje ažuriranja Androida…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Neke aplikacije možda neće funkcionirati pravilno dok nadogradnja ne završi"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Dovršavanje ažuriranja sustava…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Nadogradnja aplikacije <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiziranje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Pripremanje aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Završetak inicijalizacije."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Izvodi se <xliff:g id="APP">%1$s</xliff:g>"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Dodirnite za povratak na igru"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Odabir igre"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Radi bolje izvedbe istovremeno može biti otvorena samo jedna od tih igara."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Povratak na aplikaciju <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Otvori aplikaciju <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"Aplikacija <xliff:g id="OLD_APP">%1$s</xliff:g> zatvorit će se bez spremanja"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> premašio je ograničenje memorije"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Generirana je snimka memorije procesa. Dodirnite za dijeljenje."</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Žalite li dijeliti snimku memorije procesa?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> premašio je ograničenje memorije od <xliff:g id="SIZE">%2$s</xliff:g>. Dostupna vam je snimka memorije procesa koju možete podijeliti s razvojnim programerom. Budite oprezni: ta snimka memorije može sadržavati vaše osobne podatke kojoj aplikacija ima pristup."</string>
<string name="sendText" msgid="5209874571959469142">"Izaberite radnju za tekst"</string>
@@ -1155,12 +1175,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Povezivanje s otvorenom Wi‑Fi mrežom"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Povežite se s Wi‑Fi mrežom mobilnog operatera"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Povezivanje s otvorenom Wi‑Fi mrežom"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezano s Wi-Fi mrežom"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nije uspjelo povezivanje s Wi-Fi mrežom"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite za prikaz svih mreža"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Poveži"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Sve mreže"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi će se uključiti automatski"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kada ste u blizini spremljene mreže visoke kvalitete"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Više ne uključuj"</string>
@@ -1226,6 +1247,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Ponovno pokreni"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivirajte mobilnu uslugu"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Preuzmite aplikaciju mobilnog operatera da biste aktivirali novi SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Preuzmite aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> da biste aktivirali novi SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Preuzmite aplikaciju"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Umetnuta je nova SIM kartica"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Dodirnite da biste je postavili"</string>
@@ -1244,13 +1266,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Uključen je PTP putem USB-a"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Uključeno je modemsko povezivanje putem USB-a"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Uključen je MIDI putem USB-a"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Uključen je način rada s USB dodatkom"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Priključen je USB dodatak"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Dodirnite za više opcija."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Povezani se uređaj puni. Dodirnite za više opcija."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Otkriven je analogni audiododatak"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da biste saznali više."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Priključen je alat za otklanjanje pogrešaka putem USB-a"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Dodirnite da biste takvo otklanjanje onemogućili."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Dodirnite da biste isključili otklanjanje pogrešaka putem USB-a"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Odaberite da biste onemogućili rješavanje programske pogreške na USB-u."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Izrada izvješća o programskoj pogrešci…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Želite li podijeliti izvješće o programskoj pogrešci?"</string>
@@ -1269,7 +1291,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prikazuje se preko drugih aplikacija"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Apl. <xliff:g id="NAME">%s</xliff:g> zakriva druge aplikacije"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite da aplikacija <xliff:g id="NAME">%s</xliff:g> upotrebljava tu značajku, dodirnite da biste otvorili postavke i isključili je."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Isključi"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Priprema uređaja <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Traženje pogrešaka"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Otkriven je novi uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1355,14 +1377,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezivanje s uvijek uključenom VPN mrežom…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Povezan s uvijek uključenom VPN mrežom"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Prekinuta je veza s uvijek uključenim VPN-om"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Pogreška uvijek uključene VPN mreže"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Promijenite mrežu ili postavke VPN-a"</string>
<string name="upload_file" msgid="2897957172366730416">"Odaberite datoteku"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nema odabranih datoteka"</string>
<string name="reset" msgid="2448168080964209908">"Ponovo postavi"</string>
<string name="submit" msgid="1602335572089911941">"Pošalji"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Omogućen je način rada za automobil"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Dodirnite da biste napustili način rada u automobilu."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Ograničenje ili aktivan hotspot"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Dodirnite da biste postavili."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Modemsko je povezivanje onemogućeno"</string>
@@ -1441,22 +1466,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB pogon"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB pohrana"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Uredi"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Upozorenje o upotrebi podataka"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Dodirnite za upotrebu i postavke"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Dost. ogr. 2G–3G prijenosa pod."</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Dost. ogr. 4G prijenosa podataka"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Upozorenje o potrošnji"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Dosadašnji promet podataka: <xliff:g id="APP">%s</xliff:g>"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Dosegnuto je ograničenje za mob. podatkovni promet"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Dost. ogr. Wi-Fi prijenosa pod."</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Podaci su pauzirani do kraja ciklusa"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Prekoračeno ograničenje 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Prekoračeno je ograničenje 4G podataka"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Prekoračeno je ograničenje za podatke na mobilnom uređaju"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Prekorač. Wi-Fi ogranič. pod."</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Veličina <xliff:g id="SIZE">%s</xliff:g> prelazi navedeno ograničenje."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Podatkovni je promet pauziran za ostatak ciklusa"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Premašen limit mobilnih podataka"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Premašen limit podataka Wi-Fi-ja"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Premašili ste postavljeno ograničenje za <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Pozadinski podaci ograničeni"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Dodirnite i uklonite ograničenje"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Velika potrošnja podat. prometa"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Vaša potrošnja podatkovnog prometa u zadnjih je nekoliko dana veća nego obično. Dodirnite da biste vidjeli potrošnju i postavke."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Pojačan promet mobilnih podataka"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Vaše su aplikacije imale veći podatkovni promet nego obično"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Aplikacija <xliff:g id="APP">%s</xliff:g> imala je veći podatkovni promet nego obično"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Sigurnosni certifikat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ovaj je certifikat valjan."</string>
<string name="issued_to" msgid="454239480274921032">"Izdano za:"</string>
@@ -1694,7 +1716,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao administrator"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao administrator"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao administrator"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Da bi se produljilo trajanje baterije, Štednja baterije smanjuje rad uređaja i ograničava vibraciju, usluge lokacije i većinu pozadinskih podataka. Aplikacije za e-poštu, slanje poruka i druge aplikacije koje se oslanjaju na sinkronizaciju možda se neće ažurirati ako ih ne otvorite.\n\nŠtednja baterije isključuje se automatski dok se uređaj puni."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Da bi se produljilo trajanje baterije, Štednja baterije smanjuje rad uređaja i ograničava ili isključuje vibraciju, usluge lokacije i pozadinske podatke. Aplikacije za e-poštu, slanje poruka i druge aplikacije koje se oslanjaju na sinkronizaciju možda se neće ažurirati ako ih ne otvorite.\n\nŠtednja baterije isključuje se automatski dok se uređaj puni."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjio podatkovni promet, Štednja podatkovnog prometa onemogućuje nekim aplikacijama slanje ili primanje podataka u pozadini. Aplikacija koju trenutačno upotrebljavate može pristupiti podacima, no možda će to činiti rjeđe. To može značiti da se, na primjer, slike neće prikazivati dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Uključi"</string>
@@ -1708,7 +1730,7 @@
<item quantity="few">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">%1$d sat (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="few">%1$d sata (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">%1$d sati (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1728,7 +1750,7 @@
<item quantity="few">%d min</item>
<item quantity="other">%d min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">%d sat</item>
<item quantity="few">%d sata</item>
<item quantity="other">%d sati</item>
@@ -1753,14 +1775,14 @@
<string name="muted_by" msgid="6147073845094180001">"Zvuk je isklj. treća strana <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Na vašem uređaju postoji interni problem i možda neće biti stabilan dok ga ne vratite na tvorničko stanje."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Na vašem uređaju postoji interni problem. Obratite se proizvođaču za više pojedinosti."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD zahtjev izmijenjen je u DIAL zahtjev."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD zahtjev izmijenjen je u SS zahtjev."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD zahtjev izmijenjen je u novi USSD zahtjev."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD zahtjev izmijenjen je u Video DIAL zahtjev."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS zahtjev izmijenjen je u DIAL zahtjev."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS zahtjev izmijenjen je u Video DIAL zahtjev."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS zahtjev izmijenjen je u USSD zahtjev."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS zahtjev izmijenjen je u novi SS zahtjev."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"USSD zahtjev promijenjen je u običan poziv"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"USSD zahtjev promijenjen je u SS zahtjev"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Promijenjeno u novi USSD zahtjev"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"USSD zahtjev promijenjen je u videopoziv"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"SS zahtjev promijenjen je u običan poziv"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"SS zahtjev promijenjen je u videopoziv"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"SS zahtjev promijenjen je u USSD zahtjev"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Promijenjeno u novi SS zahtjev"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Radni profil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Proširivanje"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Sažimanje"</string>
@@ -1872,7 +1894,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Otkrivena je štetna aplikacija"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> želi prikazivati isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Uređivanje"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Uređaj će vibrirati za pozive i obavijesti"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Zvučni signal poziva i obavijesti bit će isključen"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Promjene sustava"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne uznemiravaj"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Način Ne uznemiravaj sakriva obavijesti da biste se lakše usredotočili"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ovo je novo ponašanje. Dodirnite da biste ga promijenili."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Promijenjena je postavka Ne uznemiravaj"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Dodirnite za provjeru postavki načina Ne uznemiravaj"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Dodirnite da biste provjerili što je blokirano."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 1fb05b243a0c..8c19e3fcbdbf 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"A hívóazonosító alapértelmezett értéke nem korlátozott. Következő hívás: nem korlátozott"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"A szolgáltatás nincs biztosítva."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Nem tudja módosítani a hívó fél azonosítója beállítást."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Adatszolgáltatás letiltva"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Nincs segélyhívás"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Nincs mobiladat-szolgáltatás"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Segélyhívás nem lehetséges"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Hangszolgáltatás letiltva"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hang- és segélyszolgáltatás letiltva"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Az Ön tartózkodási helyén ideiglenesen nem áll rendelkezésre a mobilhálózaton"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"A hálózat nem érhető el"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"A vétel javítása érdekében próbálja módosítani a kiválasztott hálózattípust a Beállítások &gt; Hálózat és internet &gt; Mobilhálózatok &gt; Preferált hálózattípus menüpontban."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"A Wi‑Fi-hívás aktív"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"A segélyhíváshoz mobilhálózatra van szükség."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nincs hanghívás vagy segélyhívás"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"A szolgáltató ideiglenesen kikapcsolta"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"A mobilhálózat nem érhető el"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Próbálja meg módosítani a preferált hálózatot. Koppintson a módosításhoz."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Segélyhívás nem lehetséges"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Nem lehet segélyhívást kezdeményezni Wi-Fi-n keresztül"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Értesítések"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Hívásátirányítás"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Sürgősségi visszahívás mód"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Barangolást jelző szalaghirdetés bekapcsolva"</string>
<string name="roamingText12" msgid="1189071119992726320">"Barangolást jelző szalaghirdetés kikapcsolva"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Szolgáltatás keresése"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-hívás"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Ha Wi-Fi-hálózaton szeretne telefonálni és üzenetet küldeni, kérje meg szolgáltatóját, hogy állítsa be ezt a szolgáltatást. Ezután kapcsolja be újra a Wi-Fi-hívást a Beállításokban. (Hibakód: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Regisztráljon a szolgáltatójánál (hibakód: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi-hívás"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Túl sok kérés áll feldolgozás alatt. Próbálja újra később."</string>
<string name="notification_title" msgid="8967710025036163822">"Bejelentkezési hiba a(z) <xliff:g id="ACCOUNT">%1$s</xliff:g> fióknál"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Szinkronizálás"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Szinkronizálás"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Túl sok <xliff:g id="CONTENT_TYPE">%s</xliff:g> törlés."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Sikertelen szinkronizálás"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Túl sok <xliff:g id="CONTENT_TYPE">%s</xliff:g> típusú tartalmat próbált törölni."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"A táblagép tárhelye tele van. Szabadítson fel helyet néhány fájl törlésével."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Az óra tárhelye megtelt. Szabadítson fel helyet néhány fájl törlésével."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"A tévé tárhelye megtelt. Hely felszabadításához töröljön néhány fájlt."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"A munkaprofil rendszergazdája által"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Megfigyelő: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Munkahelyi profil törölve"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"A munkaprofilt a rendszer hiányzó rendszergazdai alkalmazás miatt törölte"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"A munkaprofil rendszergazdai alkalmazása hiányzik vagy sérült. A rendszer ezért törölte a munkaprofilt, és az ahhoz kapcsolódó adatokat. Ha segítségre van szüksége, vegye fel a kapcsolatot rendszergazdájával."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Munkaprofilja már nem hozzáférhető ezen az eszközön."</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Túl sok jelszómegadási kísérlet"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Felügyelt eszköz"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Ezt az eszközt szervezete kezeli, és lehetséges, hogy a hálózati forgalmat is figyelik. További részletekért koppintson."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"A rendszer törölni fogja eszközét"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"A rendszergazdai alkalmazás nem használható. A rendszer most törli az eszközt.\n\nKérdéseivel forduljon szervezete rendszergazdájához."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"A rendszergazdai alkalmazás nem használható. A rendszer most törli az eszközt.\n\nKérdéseivel forduljon szervezete rendszergazdájához."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"A(z) <xliff:g id="OWNER_APP">%s</xliff:g> letiltotta a nyomtatást."</string>
<string name="me" msgid="6545696007631404292">"Saját"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Táblagép beállításai"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Repülőgép üzemmód"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Repülőgép üzemmód bekapcsolva"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Repülőgép üzemmód kikapcsolva"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Akkumulátorkímélő mód"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Akkumulátorkímélő mód kikapcsolva"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Akkumulátorkímélő mód bekapcsolva"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Beállítások"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Segítség"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hangsegéd"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Váltás munkaprofilra"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Névjegyek"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"hozzáférés a névjegyekhez"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen a névjegyekhez"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen a névjegyekhez?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Helyadatok"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"hozzáférés az eszköz földrajzi helyéhez"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen az eszköz helyadataihoz"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen az eszköz helyadataihoz?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Naptár"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"hozzáférés a naptárhoz"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen a naptárhoz"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen a naptárhoz?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS-ek küldése és megtekintése"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy SMS-eket küldhessen és tekinthessen meg"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy SMS-eket küldhessen és tekinthessen meg?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Tárhely"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"az eszközön lévő fotók, médiatartalmak és fájlok elérése"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen az eszközön tárolt fotókhoz, médiatartalmakhoz és fájlokhoz"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen az eszközön tárolt fotókhoz, médiatartalmakhoz és fájlokhoz?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"hanganyag rögzítése"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hangfelvételt készíthessen"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hangfelvételt készíthessen?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fényképezőgép"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotók és videók készítése"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy képeket és videókat készíthessen"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy képeket és videókat készíthessen?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefonhívások kezdeményezése és kezelése"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hívásokat indíthasson és kezelhessen"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hívásokat indíthasson és kezelhessen?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Testérzékelők"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"az érzékelők által mért, életjelekkel kapcsolatos adatok elérése"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen az életjelekkel kapcsolatos szenzoradatokhoz"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen az életjelekkel kapcsolatos szenzoradatokhoz?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ablaktartalom lekérdezése"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"A használt ablak tartalmának vizsgálata."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Felfedezés érintéssel bekapcsolása"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Kézmozdulatok végrehajtása"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Koppintás, ujjak gyors csúsztatása és összehúzása, illetve egyéb kézmozdulatok végrehajtása."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Kézmozdulatok az ujjlenyomat-érzékelőn"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Érzékeli az ujjlenyomat-érzékelőn végzett kézmozdulatokat."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Érzékeli az eszköz ujjlenyomat-érzékelőjén végzett kézmozdulatokat."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"állapotsor kikapcsolása vagy módosítása"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Lehetővé teszi az alkalmazás számára az állapotsor kikapcsolását, illetve rendszerikonok hozzáadását és eltávolítását."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"az állapotsor szerepének átvétele"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Lehetővé teszi az alkalmazás számára, hogy egyes részeit állandó jelleggel eltárolja a memóriában. Ez korlátozhatja a többi alkalmazás számára rendelkezésre álló memóriát, és lelassíthatja a táblagépet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Lehetővé teszi az alkalmazás számára azt, hogy egyes részeit állandóan a memóriában tartsa. Ez korlátozhatja a többi alkalmazás számára elérhető memóriát, ezáltal lelassulhat a tévé."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Lehetővé teszi az alkalmazás számára, hogy egyes részeit állandó jelleggel eltárolja a memóriában. Ez korlátozhatja a többi alkalmazás számára rendelkezésre álló memóriát, és lelassíthatja a telefont."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"előtérben lévő szolgáltatás futtatása"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Engedélyezi az alkalmazásnak az előtérben lévő szolgáltatások használatát."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"alkalmazás-tárhely felmérése"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Lehetővé teszi az alkalmazás számára a kód, az adatok és a gyorsítótár-méret lekérését"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"rendszerbeállítások módosítása"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Feloldás mintával"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Arcalapú feloldás"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Feloldás PIN kóddal"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM-kártya PIN-kódjának feloldása."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM-kártya PUK-kódjának feloldása."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Feloldás jelszóval"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mintaterület"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Csúsztatási terület"</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"A szöveg bemásolva a vágólapra."</string>
<string name="more_item_label" msgid="4650918923083320495">"Egyebek"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menü+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"szóköz"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"törlés"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Frissítés keresése"</string>
<string name="smv_application" msgid="3307209192155442829">"A(z) <xliff:g id="APPLICATION">%1$s</xliff:g> alkalmazás (<xliff:g id="PROCESS">%2$s</xliff:g> folyamat) megsértette az általa kényszerített Szigorú üzemmód irányelvet."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> folyamat megsértette az általa kényszerített Szigorú üzemmód irányelvet."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android frissítése folyamatban..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Az Android indítása…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"A telefon frissítése…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"A táblagép frissítése…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Az eszköz frissítése…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"A telefon indítása…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"A táblagép indítása…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Az eszköz indítása…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Tárhely-optimalizálás."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Az Android frissítésének befejezése…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"A frissítés befejezéséig előfordulhat, hogy egyes alkalmazások nem megfelelően működnek."</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"A rendszerfrissítés befejezése…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"A(z) <xliff:g id="APPLICATION">%1$s</xliff:g> frissítése folyamatban van"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Alkalmazás optimalizálása: <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"A(z) <xliff:g id="APPNAME">%1$s</xliff:g> előkészítése."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Kezdő alkalmazások."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Rendszerindítás befejezése."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> fut"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Koppintson ide a játékhoz való visszatéréshez"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Játék kiválasztása"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"A jobb teljesítmény érdekében egyszerre csak egy játék lehet megnyitva ezek közül."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Vissza a következőhöz: <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> megnyitása"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"A(z) <xliff:g id="OLD_APP">%1$s</xliff:g> mentés nélkül bezáródik"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"A(z) <xliff:g id="PROC">%1$s</xliff:g> túllépte a memóriakorlátot"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Elkészült a memória-pillanatfelvétel (heap dump); a megosztáshoz koppintson rá"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Elkészült a memória-pillanatfelvétel (heap dump). A megosztáshoz koppintson rá."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Megosztja a memória-pillanatfelvételt?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"A(z) <xliff:g id="PROC">%1$s</xliff:g> folyamat túllépte a(z) <xliff:g id="SIZE">%2$s</xliff:g> méretű memóriakorlátot. Elérhető a memória-pillanatfelvétel (heap dump), hogy megossza a fejlesztővel. Figyelem: ez a felvétel tartalmazhatja az Ön olyan személyes adatait, amelyekhez az alkalmazásnak hozzáférése van."</string>
<string name="sendText" msgid="5209874571959469142">"Válasszon ki egy műveletet a szöveghez"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Nyílt Wi-Fi-hálózathoz kapcsolódhat"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Csatlakozás szolgáltatói Wi‑Fi-hálózatra"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Kapcsolódás nyílt Wi‑Fi-hálózathoz…"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Sikeres kapcsolódás a Wi-Fi-hálózathoz"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nem sikerült kapcsolódni a Wi‑Fi-hálózathoz"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Koppintással megjelenítheti az összes hálózatot"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Kapcsolódás"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Összes hálózat"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Összes hálózat"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"A Wi-Fi automatikusan bekapcsol"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Amikor jó minőségű mentett hálózat közelében tartózkodik"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne kapcsolódjon vissza"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Újraindítás"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobilszolgáltatás aktiválása"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Töltse le a szolgáltatói alkalmazást az új SIM-kártya aktiválásához"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Az új SIM-kártya aktiválásához töltse a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazást"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Alkalmazás letöltése"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Új SIM behelyezve"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Koppintson rá a beállításhoz"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Az USB-n keresztüli PTP be van kapcsolva"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Az USB-internetmegosztás be van kapcsolva"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Az USB-n keresztüli MIDI be van kapcsolva"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Az USB-kiegészítő mód be van kapcsolva"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-kiegészítő csatlakoztatva"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Koppintson a további beállítások megjelenítéséhez."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Folyamatban van a csatlakoztatott eszköz töltése. Koppintson a további lehetőségekhez."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analóg audiotartozék észlelve"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"A csatlakoztatott eszköz nem kompatibilis ezzel a telefonnal. További információért koppintson ide."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hibakereső csatlakoztatva"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Koppintson az USB fejlesztő mód kikapcsolásához."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Koppintson az USB-hibakeresés kikapcsolásához"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Válassza ezt az USB hibakeresés kikapcsolásához."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Hibajelentés készítése…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Megosztja a hibajelentést?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"A(z) <xliff:g id="NAME">%s</xliff:g> a többi alkalmazás felett jelenik meg"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> – a többi alkalmazás felett"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"KIKAPCSOLÁS"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Kikapcsolás"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> előkészítése"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Hibák keresése"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Új <xliff:g id="NAME">%s</xliff:g> észlelve"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Csatlakozás a mindig bekapcsolt VPN-hez..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Csatlakozva a mindig bekapcsolt VPN-hez"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Mindig bekapcsolt állapotú VPN-ről leválasztva"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Hiba a mindig bekapcsolt VPN-nel"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Nem sikerült csatlakozni a mindig bekapcsolt állapotú VPN-hez"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Hálózati vagy VPN-beállítások módosítása"</string>
<string name="upload_file" msgid="2897957172366730416">"Fájl kiválasztása"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nincs fájl kiválasztva"</string>
<string name="reset" msgid="2448168080964209908">"Alaphelyzet"</string>
<string name="submit" msgid="1602335572089911941">"Elküldés"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Gépkocsi üzemmód bekapcsolva"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Koppintson az autós üzemmódból való kilépéshez."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Az autós alkalmazás fut"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Koppintson ide az autós alkalmazásból való kilépéshez."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Megosztás vagy aktív hotspot"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Koppintson a beállításhoz."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Az internetmegosztás le van tiltva"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB-meghajtó"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-tár"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Szerkesztés"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Adathasználati értesítés"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Koppintson az adatokért."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-/3G-adatkorlát elérve"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G-adatkorlát elérve"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Adatforgalmi figyelmeztetés"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> adatot használt fel"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Elérte a mobiladatkorlátot"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi-adatkorlát elérve"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"A ciklus végéig az adatforgalom szünetel"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Elérte a 2G/3G adatkorlátot"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Elérte a 4G adatkorlátot"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Elérte a mobil adatkorlátot"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Elérte a Wi-Fi adatkorlátot"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g>-tal túllépte a korlátot."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Az adatforgalom szünetel a ciklus fennmaradó részében"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Túllépte a mobiladatkorlátot"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Túllépte a Wi-Fi-adatkorlátot"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"<xliff:g id="SIZE">%s</xliff:g> adattal meghaladta a beállított korlátot"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Háttéradatok korlátozva"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Koppintson az eltávolításhoz."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Nagymértékű adathasználat"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Adathasználata az elmúlt napokban nagyobb a szokásosnál. Koppintson az adathasználati adatok és a beállítások megtekintéséhez."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Nagymértékű mobiladat-forgalom"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Alkalmazásai több adatot használtak a megszokottnál"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"A(z) <xliff:g id="APP">%s</xliff:g> több adatot használ a megszokottnál"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Biztonsági tanúsítvány"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"A tanúsítvány érvényes."</string>
<string name="issued_to" msgid="454239480274921032">"Kiállítva a következőnek:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"A rendszergazda által telepítve"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"A rendszergazda által frissítve"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"A rendszergazda által törölve"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Az akkumulátoridő növelése érdekében az Akkumulátorkímélő mód csökkenti az eszköz teljesítményét, és korlátozza a rezgést, a helyszolgáltatásokat, valamint a legtöbb háttéradatot is. Előfordulhat, hogy azok az e-mail-, üzenetküldő és egyéb alkalmazások, amelyek szinkronizálást használnak, csak akkor frissítenek, ha megnyitja őket.\n\nAz Akkumulátorkímélő mód automatikusan kikapcsol, ha eszköze töltőn van."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Az adatforgalom csökkentése érdekében az Adatforgalom-csökkentő megakadályozza, hogy egyes alkalmazások adatokat küldjenek vagy fogadjanak a háttérben. Az Ön által aktuálisan használt alkalmazások hozzáférhetnek az adatokhoz, de csak ritkábban. Ez például azt jelentheti, hogy a képek csak rákoppintás után jelennek meg."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Bekapcsolja az Adatforgalom-csökkentőt?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Bekapcsolás"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d percen keresztül (eddig: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">1 percen keresztül (eddig: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d órán át (eddig: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Egy órán át (eddig: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d órára (eddig: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">1 órára (eddig: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d órán keresztül (eddig: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">%d percen keresztül</item>
<item quantity="one">1 percen keresztül</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">%d órán át</item>
- <item quantity="one">Egy órán át</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d órára</item>
+ <item quantity="one">1 órára</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d órán keresztül</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"A(z) <xliff:g id="THIRD_PARTY">%1$s</xliff:g> elnémította"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Belső probléma van az eszközzel, és instabil lehet, amíg vissza nem állítja a gyári adatokat."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Belső probléma van az eszközzel. A részletekért vegye fel a kapcsolatot a gyártóval."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Az USSD-kérés módosítva DIAL-kérésre."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Az USSD-kérés módosítva SS-kérésre."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Az USSD-kérés módosítva új USSD-kérésre."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-kérés módosítva Video DIAL-kérésre."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Az SS-kérés módosítva DIAL-kérésre."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-kérés módosítva Video DIAL-kérésre."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Az SS-kérés módosítva USSD-kérésre."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Az SS-kérés módosítva új SS-kérésre."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Munkaprofil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Kibontás"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Összecsukás"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"A rendszer kártékony alkalmazást észlelt"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"A(z) <xliff:g id="APP_0">%1$s</xliff:g> alkalmazás részleteket szeretne megjeleníteni a(z) <xliff:g id="APP_2">%2$s</xliff:g> alkalmazásból"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Szerkesztés"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"A hívások és az értesítések rezegnek"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"A hívások és az értesítések némák"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Rendszermódosítások"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ne zavarjanak"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"A Ne zavarjanak mód elrejti az értesítéseket, hogy segítsen az összpontosításban"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ez új viselkedés. Koppintson a módosításhoz."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Módosultak a Ne zavarjanak mód beállításai"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Koppintson a megszakításokkal kapcsolatos viselkedési beállítások megtekintéséhez."</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Koppintson a letiltott elemek megtekintéséhez."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Rendszer"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Beállítások"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 6ac404cfc022..8f4d7df37721 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Nomor penelepon default tidak dibatasi. Panggilan selanjutnya: Tidak dibatasi"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Layanan tidak diperlengkapi."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Anda tidak dapat mengubah setelan nomor penelepon."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Tidak ada layanan data"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Tidak ada panggilan darurat"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Tidak ada layanan data seluler"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Panggilan darurat tidak tersedia"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Tidak ada layanan panggilan suara"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tidak ada layanan panggilan suara/darurat"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Untuk sementara tidak ditawarkan oleh jaringan seluler di lokasi Anda"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat menjangkau jaringan"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Untuk menyempurnakan penerimaan sinyal, coba ubah jenis yang dipilih di Setelan &gt; Jaringan &amp; internet &gt; Jaringan seluler &gt; Jenis jaringan pilihan."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Panggilan Wi‑Fi aktif"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Panggilan darurat memerlukan jaringan seluler."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Tidak ada layanan suara atau panggilan darurat"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Dinonaktifkan sementara oleh operator"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Tidak dapat menjangkau jaringan seluler"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Coba ubah jaringan pilihan. Tap untuk mengubah."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Panggilan darurat tidak tersedia"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Tidak dapat melakukan panggilan darurat melalui Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Notifikasi"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Penerusan panggilan"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode panggilan balik darurat"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Spanduk Roaming Hidup"</string>
<string name="roamingText12" msgid="1189071119992726320">"Spanduk Roaming Mati"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Mencari layanan"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Panggilan Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Untuk menelepon dan mengirim pesan melalui Wi-Fi, tanyalah ke operator Anda terlebih dahulu untuk menyiapkan layanan ini. Kemudian, aktifkan kembali panggilan Wi-Fi dari Setelan. (Kode error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Daftarkan ke operator (Kode error: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Panggilan Wi-Fi"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Terlalu banyak permintaan yang diproses. Coba lagi nanti."</string>
<string name="notification_title" msgid="8967710025036163822">"Kesalahan saat masuk untuk <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinkron"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinkron"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Terlalu banyak <xliff:g id="CONTENT_TYPE">%s</xliff:g> penghapusan."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Tidak dapat menyinkronkan"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Berupaya menghapus terlalu banyak <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Penyimpanan tablet penuh. Hapus beberapa file untuk mengosongkan ruang."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Penyimpanan arloji penuh. Hapus beberapa file untuk mengosongkan ruang."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Penyimpanan TV sudah penuh. Hapus beberapa file untuk mengosongkan ruang."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Oleh admin profil kerja"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Oleh <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profil kerja dihapus"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profil kerja dihapus karena tidak ada aplikasi admin"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Aplikasi admin profil kerja tidak ada atau rusak. Akibatnya, profil kerja dan data terkait telah dihapus. Hubungi admin untuk meminta bantuan."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Profil kerja tidak tersedia lagi di perangkat ini"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Terlalu banyak percobaan memasukkan sandi"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Perangkat ini ada yang mengelola"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Organisasi mengelola perangkat ini dan mungkin memantau traffic jaringan. Tap untuk melihat detailnya."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Perangkat akan dihapus"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Aplikasi admin tidak dapat digunakan. Kini, perangkat Anda akan dihapus.\n\nJika ada pertanyaan, hubungi admin organisasi."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Aplikasi admin tidak dapat digunakan. Perangkat Anda kini akan dihapus.\n\nJika ada pertanyaan, hubungi admin organisasi."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Fitur pencetakan dinonaktifkan oleh <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Saya"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opsi tablet"</string>
@@ -236,10 +234,13 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode pesawat"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode pesawat AKTIF"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode pesawat MATI"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Penghemat baterai"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Penghemat baterai NONAKTIF"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Penghemat baterai AKTIF"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Setelan"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Bantuan"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string>
- <string name="global_action_lockdown" msgid="1099326950891078929">"Gembok total"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Kunci total"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notifikasi baru"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Keyboard virtual"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Beralih ke profil kerja"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontak"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"mengakses kontak"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses kontak"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses kontak?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokasi"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"mengakses lokasi perangkat ini"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses lokasi perangkat ini"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses lokasi perangkat ini?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"mengakses kalender"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses kalender"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses kalender?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"mengirim dan melihat pesan SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengirim dan melihat SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengirim dan melihat SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Penyimpanan"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"mengakses foto, media, dan file di perangkat"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses foto, media, dan file di perangkat"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses foto, media, dan file di perangkat?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"merekam audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; merekam audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; merekam audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"mengambil gambar dan merekam video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengambil gambar dan merekam video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengambil gambar dan merekam video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telepon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"melakukan dan mengelola panggilan telepon"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; melakukan dan mengelola panggilan telepon"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; melakukan dan mengelola panggilan telepon?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensor Tubuh"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"mengakses data sensor tentang tanda-tanda vital"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses data sensor tentang tanda-tanda vital Anda"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses data sensor tentang tanda-tanda vital Anda?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Mengambil konten jendela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Memeriksa konten jendela tempat Anda berinteraksi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Mengaktifkan Jelajahi dengan Sentuhan"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Melakukan isyarat"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Dapat mengetuk, menggeser, mencubit, dan melakukan isyarat lainnya."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestur sidik jari"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Dapat merekam gestur yang dilakukan di sensor sidik jari perangkat."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Dapat merekam gestur yang dilakukan di sensor sidik jari perangkat."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"nonaktifkan atau ubah bilah status"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Mengizinkan apl menonaktifkan bilah status atau menambah dan menghapus ikon sistem."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"jadikan bilah status"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Memungkinkan aplikasi membuat bagian dari dirinya sendiri terus-menerus berada dalam memori. Izin ini dapat membatasi memori yang tersedia untuk aplikasi lain sehingga menjadikan tablet lambat."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Mengizinkan aplikasi untuk membuat bagian dirinya tetap berada dalam memori. Izin ini dapat membatasi memori yang tersedia untuk aplikasi lain yang membuat TV menjadi lambat."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Memungkinkan aplikasi membuat bagian dari dirinya sendiri terus-menerus berada dalam memori. Izin ini dapat membatasi memori yang tersedia untuk aplikasi lain sehingga menjadikan ponsel lambat."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"jalankan layanan di latar depan"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Mengizinkan aplikasi menggunakan layanan di latar depan."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"mengukur ruang penyimpanan apl"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Mengizinkan apl mengambil kode, data, dan ukuran temboloknya"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ubah setelan sistem"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci dengan pola."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Buka kunci dengan face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci dengan PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"PIN SIM terbuka."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"PUK SIM terbuka."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci dengan sandi."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Area pola."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Area geser."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Teks disalin ke papan klip."</string>
<string name="more_item_label" msgid="4650918923083320495">"Lainnya"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"spasi"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"hapus"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Periksa apakah ada update"</string>
<string name="smv_application" msgid="3307209192155442829">"Apl <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) telah melanggar kebijakan StrictMode yang diberlakukannya sendiri."</string>
<string name="smv_process" msgid="5120397012047462446">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> telah melanggar kebijakan StrictMode yang diberlakukan secara otomatis."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android sedang meningkatkan versi..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Memulai Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Mengupdate ponsel…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Mengupdate tablet…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Mengupdate perangkat…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Menyalakan ponsel…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Menyalakan tablet…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Menyalakan perangkat…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Mengoptimalkan penyimpanan."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Menyelesaikan pembaruan Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Beberapa aplikasi mungkin tidak berfungsi dengan baik jika peningkatan versi belum selesai"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Menyelesaikan update sistem…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> sedang ditingkatkan versinya…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Mengoptimalkan aplikasi <xliff:g id="NUMBER_0">%1$d</xliff:g> dari <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Menyiapkan <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulai aplikasi."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Menyelesaikan boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tap untuk kembali ke game"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Pilih game"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Agar performa tetap maksimal, hanya 1 game yang dapat dibuka sekaligus."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Kembali ke <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Buka <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> akan ditutup tanpa menyimpan"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> melampaui batas memori"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Informasi memori elah dikumpulkan; ketuk untuk membagikan"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Informasi memori dikumpulkan. Tap untuk membagikan."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share tumpukan membuang?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Proses <xliff:g id="PROC">%1$s</xliff:g> telah melampaui batas memori proses <xliff:g id="SIZE">%2$s</xliff:g>. Tumpukan sampah tersedia untuk Anda bagikan kepada pengembangnya. Hati-hati, tumpukan sampah ini hanya dapat memuat informasi pribadi yang dapat diakses oleh aplikasi."</string>
<string name="sendText" msgid="5209874571959469142">"Pilih tindakan untuk teks"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Hubungkan ke jaringan Wi-Fi terbuka"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Hubungkan ke jaringan Wi-Fi operator"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Menghubungkan ke jaringan Wi-Fi terbuka"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Terhubung ke jaringan Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Tidak dapat menghubungkan ke jaringan Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap untuk melihat semua jaringan"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Hubungkan"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Semua Jaringan"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Semua jaringan"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi akan aktif otomatis"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Saat berada di dekat jaringan berkualitas tinggi yang tersimpan"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Jangan aktifkan kembali"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Nyalakan Ulang"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktifkan layanan seluler"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download aplikasi operator untuk mengaktifkan SIM baru"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Download aplikasi <xliff:g id="APP_NAME">%1$s</xliff:g> untuk mengaktifkan SIM baru"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download aplikasi"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM baru dimasukkan"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Ketuk untuk menyiapkan"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB diaktifkan"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB diaktifkan"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB diaktifkan"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Mode aksesori USB diaktifkan"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Aksesori USB tersambung"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Ketuk untuk opsi lainnya."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Mengisi daya perangkat yang terhubung. Tap untuk opsi lainnya."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Aksesori audio analog terdeteksi"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Perangkat yang terpasang tidak kompatibel dengan ponsel ini. Tap untuk mempelajari lebih lanjut."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debugging USB terhubung"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tap untuk menonaktifkan debug USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Tap untuk menonaktifkan debug USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Pilih untuk menonaktifkan debugging USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Mengambil laporan bug…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Bagikan laporan bug?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, tap untuk membuka setelan dan menonaktifkannya."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"NONAKTIFKAN"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Nonaktifkan"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Menyiapkan <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Memeriksa kesalahan"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> baru terdeteksi"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Menyambungkan VPN selalu aktif..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN selalu aktif tersambung"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Terputus dari VPN yang selalu aktif"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Kesalahan VPN selalu aktif"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Tidak dapat terhubung ke VPN yang selalu aktif"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Ubah setelan jaringan atau VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Pilih file"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Tidak ada file yang dipilih"</string>
<string name="reset" msgid="2448168080964209908">"Setel ulang"</string>
<string name="submit" msgid="1602335572089911941">"Kirim"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mode mobil diaktifkan"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Ketuk untuk keluar dari mode mobil."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Aplikasi mengemudi sedang berjalan"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tap untuk keluar dari aplikasi mengemudi."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering (Penambatan) atau hotspot aktif"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Ketuk untuk menyiapkan."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering dinonaktifkan"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Drive USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Penyimpanan USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edit"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Notifikasi penggunaan data"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Ketuk untuk lihat penggunaan &amp; setelan."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Batas data 2G-3G terlampaui"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Batas data 4G terlampaui"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Peringatan kuota"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Anda menggunakan <xliff:g id="APP">%s</xliff:g> dari kuota"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Batas seluler data tercapai"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Batas data Wi-Fi terlampaui"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data dijeda untuk sisa periode"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Batas data 2G-3G terlampaui"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Batas data 4G terlampaui"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Batas data seluler terlampaui"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Batas data Wi-Fi terlampaui"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> melebihi batas yang ditentukan."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Kuota dijeda selama sisa siklus Anda"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Melebihi batas kuota Anda"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Melebihi batas kuota Wi-Fi Anda"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Anda telah menggunakan <xliff:g id="SIZE">%s</xliff:g> melebihi batas yang ditetapkan"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Data latar belakang dibatasi"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Ketuk untuk menghapus batasan."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Penggunaan data yang besar"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Penggunaan data selama beberapa hari terakhir lebih besar dari biasanya. Tap untuk melihat penggunaan dan setelan."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Penggunaan kuota yang tinggi"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Aplikasi Anda menggunakan lebih banyak kuota daripada biasanya"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> menggunakan lebih banyak kuota daripada biasanya"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Sertifikat keamanan"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Sertifikat ini valid."</string>
<string name="issued_to" msgid="454239480274921032">"Diterbitkan ke:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Diinstal oleh admin Anda"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Diupdate oleh admin Anda"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Dihapus oleh admin Anda"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Untuk membantu meningkatkan masa pakai baterai, Penghemat Baterai mengurangi performa perangkat dan membatasi getaran, layanan lokasi, dan sebagian besar data latar belakang. Email, messaging, dan aplikasi lain yang mengandalkan sinkronisasi mungkin tidak diupdate kecuali jika dibuka.\n\nPenghemat Baterai otomatis nonaktif jika perangkat diisi dayanya."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Untuk membantu mengurangi penggunaan data, Penghemat Kuota Internet mencegah beberapa aplikasi mengirim atau menerima data di latar belakang. Aplikasi yang sedang digunakan dapat mengakses data, tetapi frekuensinya agak lebih jarang. Misalnya saja, gambar hanya akan ditampilkan setelah disentuh."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Aktifkan Penghemat Kuota Internet?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Aktifkan"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">Selama %1$d menit (hingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Selama 1 menit (hingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">Selama %1$d jam (hingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Selama satu jam (hingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">Selama 1 jam (hingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Selama %1$d jam (hingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">Selama %d menit</item>
<item quantity="one">Selama 1 menit</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Selama %d jam</item>
- <item quantity="one">Selama satu jam</item>
+ <item quantity="one">Selama 1 jam</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Selama %d jam</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"Dinonaktifkan oleh <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Ada masalah dengan perangkat. Hal ini mungkin membuat perangkat jadi tidak stabil dan perlu dikembalikan ke setelan pabrik."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Ada masalah dengan perangkat. Hubungi produsen perangkat untuk informasi selengkapnya."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Permintaan USSD diubah menjadi permintaan DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Permintaan USSD diubah menjadi permintaan SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Permintaan USSD diubah menjadi permintaan USSD baru."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Permintaan USSD diubah menjadi permintaan DIAL Video."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Permintaan SS diubah menjadi permintaan DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Permintaan SS diubah menjadi permintaan DIAL Video."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Permintaan SS diubah menjadi permintaan USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Permintaan SS diubah menjadi permintaan SS baru."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil kerja"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Luaskan"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Ciutkan"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplikasi berbahaya terdeteksi"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ingin menampilkan potongan <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Panggilan dan notifikasi akan bergetar"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Suara panggilan dan notifikasi akan dinonaktifkan"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Perubahan sistem"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Jangan Ganggu"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Mode Jangan Ganggu menyembunyikan notifikasi untuk membantu Anda fokus"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ini adalah perilaku baru. Tap untuk mengubah."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Jangan Ganggu telah berubah"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap untuk memeriksa apakah ada gangguan pada setelan perilaku Anda"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tap untuk memeriksa item yang diblokir."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Setelan"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 9c782bc2f75a..0da40a5023fa 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ID chiamante generalmente non limitato. Prossima chiamata: non limitato"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Servizio non fornito."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Non è possibile modificare l\'impostazione ID chiamante."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Nessun servizio dati"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Chiamate di emergenza non disponibili"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Nessun servizio dati mobile"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Chiamate di emergenza non disponibili"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Nessun servizio di telefonia"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nessun servizio di telefonia/emergenza"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Servizio temporaneamente non offerto dalla rete mobile nella tua località"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossibile raggiungere la rete"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Per migliorare la ricezione, prova a modificare il tipo selezionato in Impostazioni &gt; Rete e Internet &gt; Reti mobili &gt; Tipo di rete preferito."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Chiamate Wi‑Fi attive"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Per le chiamate di emergenza è necessaria una rete mobile."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nessun servizio vocale o di chiamate di emergenza"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Servizio disattivato temporaneamente dall\'operatore"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossibile raggiungere la rete mobile"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prova a cambiare la rete preferita. Tocca per cambiare."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Chiamate di emergenza non disponibili"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Impossibile fare chiamate di emergenza tramite Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Avvisi"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Deviazione chiamate"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modalità di richiamata di emergenza"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner roaming attivato"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner roaming disattivato"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Ricerca servizio"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chiamate Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Per effettuare chiamate e inviare messaggi tramite Wi-Fi, chiedi prima al tuo operatore di impostare questo servizio. Dopodiché, attiva di nuovo la funzione Chiamate Wi-Fi nelle impostazioni. (Codice di errore: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registra con il tuo operatore (codice di errore: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Chiamata Wi-Fi %s"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Troppe richieste in fase di elaborazione. Riprova più tardi."</string>
<string name="notification_title" msgid="8967710025036163822">"Errore di accesso relativo a <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinc"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronizzazione"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Troppe eliminazioni di <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Impossibile sincronizzare"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Numero eccessivo di tentativi di eliminazione di <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Spazio di archiviazione del tablet esaurito. Elimina alcuni file per liberare spazio."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"La memoria dell\'orologio è piena. Elimina alcuni file per liberare spazio."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"La memoria della TV è piena. Elimina alcuni file per liberare spazio."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Dall\'amministratore del tuo profilo di lavoro"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Da <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profilo di lavoro eliminato"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profilo di lavoro eliminato per app di amministrazione mancante"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"L\'app di amministrazione dei profili di lavoro manca o è danneggiata. Di conseguenza, il tuo profilo di lavoro e i relativi dati sono stati eliminati. Contatta l\'amministratore per ricevere assistenza."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Il tuo profilo di lavoro non è più disponibile sul dispositivo"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Troppi tentativi di inserimento della password"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Il dispositivo è gestito"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Questo dispositivo è gestito dalla tua organizzazione, che potrebbe monitorare il traffico di rete. Tocca per i dettagli."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Il dispositivo verrà resettato"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Impossibile usare l\'app di amministrazione. Il dispositivo verrà resettato.\n\nPer eventuali domande, contatta l\'amministratore della tua organizzazione."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Impossibile usare l\'app di amministrazione. Il dispositivo verrà resettato.\n\nPer eventuali domande, contatta l\'amministratore della tua organizzazione."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Stampa disattivata da <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Io"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opzioni tablet"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modalità aereo"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modalità aereo attiva"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modalità aereo non attiva"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Risparmio energetico"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Risparmio energetico disattivato"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Risparmio energetico attivo"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Impostazioni"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistenza"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Passa a profilo di lavoro"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accedere ai contatti"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Consenti a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai tuoi contatti"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai tuoi contatti?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Geolocalizzazione"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accedere alla posizione di questo dispositivo"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Consenti a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alla posizione di questo dispositivo"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alla posizione di questo dispositivo?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accedere al calendario"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Consenti a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere al tuo calendario"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere al tuo calendario?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"inviare e visualizzare SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Consenti a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di inviare e visualizzare SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di inviare e visualizzare SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Archiviazione"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accedere a foto, contenuti multimediali e file sul dispositivo"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Consenti a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere a foto, contenuti multimediali e file memorizzati sul dispositivo"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere a foto, contenuti multimediali e file memorizzati sul dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"registrare audio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Consenti a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di registrare audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di registrare audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotocamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"scattare foto e registrare video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Consenti a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di scattare foto e registrare video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di scattare foto e registrare video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"eseguire e gestire le telefonate"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Consenti a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di effettuare e gestire chiamate"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di effettuare e gestire telefonate?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensori per il corpo"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Consenti a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai dati dei sensori relativi ai parametri vitali"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai dati dei sensori relativi ai parametri vitali?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperare contenuti della finestra"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Esaminare i contenuti di una finestra con cui interagisci."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Attivare Esplora al tocco"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Esegui gesti"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Consente di toccare, far scorrere, pizzicare ed eseguire altri gesti."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gesti con sensore di impronte digitali"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"È in grado di rilevare i gesti compiuti con il sensore di impronte digitali dei dispositivi."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"È in grado di rilevare i gesti compiuti con il sensore di impronte digitali dei dispositivi."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disattivare o modificare la barra di stato"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Consente all\'applicazione di disattivare la barra di stato o di aggiungere e rimuovere icone di sistema."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ruolo di barra di stato"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Consente all\'applicazione di rendere persistenti in memoria alcune sue parti. Ciò può limitare la memoria disponibile per altre applicazioni, rallentando il tablet."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Consente all\'app di rendere alcune sue parti persistenti nella memoria. Potrebbe così essere limitata la memoria a disposizione di altre app ed essere rallentata la TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Consente all\'applicazione di rendere persistenti in memoria alcune sue parti. Ciò può limitare la memoria disponibile per altre applicazioni, rallentando il telefono."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"esegui servizio in primo piano"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Consente all\'app di utilizzare i servizi in primo piano."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"calcolo spazio di archiviazione applicazioni"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Consente all\'applicazione di recuperare il suo codice, i suoi dati e le dimensioni della cache"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modifica delle impostazioni di sistema"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Sblocco con sequenza."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sblocco col sorriso."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Sblocco con PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Sblocco tramite PIN della SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Sblocco tramite PUK della SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Sblocco con password."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Area sequenza."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Area di scorrimento."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Testo copiato negli appunti."</string>
<string name="more_item_label" msgid="4650918923083320495">"Altro"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"META +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"CTRL +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"ALT +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"MAIUSC +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"SYM +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"FUNZIONE +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"spazio"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"Invio"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"Canc"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Verifica la presenza di aggiornamenti"</string>
<string name="smv_application" msgid="3307209192155442829">"L\'applicazione <xliff:g id="APPLICATION">%1$s</xliff:g> (processo <xliff:g id="PROCESS">%2$s</xliff:g>) ha violato la norma StrictMode autoimposta."</string>
<string name="smv_process" msgid="5120397012047462446">"Il processo <xliff:g id="PROCESS">%1$s</xliff:g> ha violato la norma StrictMode autoimposta."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Aggiornamento di Android..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Avvio di Android…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Aggiornamento del telefono…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Aggiornamento del tablet…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Aggiornamento del dispositivo…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Avvio del telefono…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Avvio del tablet…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Avvio del dispositivo…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Ottimizzazione archiviazione."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Completamento aggiornamento Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Alcune app potrebbero non funzionare correttamente fino al completamento dell\'upgrade"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Completamento aggiornamento di sistema…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Upgrade dell\'app <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Ottimizzazione applicazione <xliff:g id="NUMBER_0">%1$d</xliff:g> di <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> in preparazione."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Avvio applicazioni."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Conclusione dell\'avvio."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> in esecuzione"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tocca per tornare al gioco"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Scegli gioco"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Per migliorare le prestazioni, è possibile aprire uno solo di questi giochi alla volta."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Torna a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Apri <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> si chiuderà senza salvare"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superato il limite di memoria"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Dump dell\'heap raccolto; tocca per condividere"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Dump dell\'heap raccolto. Tocca per condividere."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Condividere il dump dell\'heap?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Il processo <xliff:g id="PROC">%1$s</xliff:g> ha superato il suo limite di memoria pari a <xliff:g id="SIZE">%2$s</xliff:g>. È disponibile un dump dell\'heap che puoi condividere con lo sviluppatore. Presta attenzione: questo dump dell\'heap può contenere tue informazioni personali a cui l\'applicazione ha accesso."</string>
<string name="sendText" msgid="5209874571959469142">"Scegli un\'azione per il testo"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Stabilisci la connessione per aprire la rete Wi‑Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Collegati alla rete Wi-Fi dell\'operatore"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connessione per aprire la rete Wi‑Fi"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connessione alla rete Wi-Fi stabilita"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossibile connettersi alla rete Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tocca per vedere tutte le reti"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connetti"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Tutte le reti"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tutte le reti"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Il Wi‑Fi verrà attivato automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quando ti trovi nell\'area di una rete salvata di alta qualità"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Non riattivare"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Riavvia"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Attiva il servizio dati mobile"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Scarica l\'app dell\'operatore per attivare la nuova SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Scarica l\'app <xliff:g id="APP_NAME">%1$s</xliff:g> per attivare la nuova SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Scarica app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nuova SIM inserita"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tocca per configurarla"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Modalità PTP tramite USB attivata"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB attivato"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Modalità MIDI tramite USB attivata"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modalità accessorio USB attivata"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Accessorio USB collegato"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tocca per altre opzioni."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Dispositivo collegato in carica. Tocca per altre opzioni."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Accessorio audio analogico rilevato"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Il dispositivo collegato non è compatibile con questo telefono. Tocca per avere ulteriori informazioni."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debug USB collegato"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tocca per disattivare il debug USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Tocca per disattivare il debug USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Seleziona per disattivare il debug USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Recupero della segnalazione di bug…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Condividere la segnalazione di bug?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"App <xliff:g id="NAME">%s</xliff:g> visualizzata sopra altre app"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"App <xliff:g id="NAME">%s</xliff:g> mostrata sopra altre app"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DISATTIVA"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Disattiva"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparazione della <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Ricerca errori"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nuova <xliff:g id="NAME">%s</xliff:g> rilevata"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Connessione a VPN sempre attiva…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre attiva connessa"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Disconnesso da VPN sempre attiva"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Errore VPN sempre attiva"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Impossibile connettersi alla VPN sempre attiva"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Cambia le impostazioni VPN o di rete"</string>
<string name="upload_file" msgid="2897957172366730416">"Scegli file"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nessun file è stato scelto"</string>
<string name="reset" msgid="2448168080964209908">"Reimposta"</string>
<string name="submit" msgid="1602335572089911941">"Invia"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modalità automobile attivata"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tocca per uscire dalla modalità automobile."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"App di guida in esecuzione"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Tocca per uscire dall\'app di guida."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering oppure hotspot attivo"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tocca per impostare."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering disattivato"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Unità USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Archivio USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Modifica"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Avviso sull\'utilizzo dei dati"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Tocca per uso e impostazioni."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Limite di dati 2G-3G raggiunto"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Limite di dati 4G raggiunto"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Avviso sui dati"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Hai usato <xliff:g id="APP">%s</xliff:g> di dati"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Limite dati mobili raggiunto"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Limite di dati Wi-Fi raggiunto"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Dati sospesi per resto del ciclo"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Limite dati 2G-3G superato"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Limite dati 4G superato"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Limite dati cellulare superato"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Limite dati Wi-Fi superato"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> oltre il limite specificato."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Dati sospesi per il resto del ciclo"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Limite di dati mobili superato"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Limite di dati Wi-Fi superato"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Hai superato di <xliff:g id="SIZE">%s</xliff:g> il limite impostato"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Dati in background limitati"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Tocca per rimuovere le limitazioni."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Massiccio utilizzo dei dati"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"L\'utilizzo dei dati negli ultimi giorni è superiore al normale. Tocca per visualizzare l\'utilizzo e le impostazioni."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Utilizzo elevato di dati mobili"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Le tue app hanno usato più dati del solito"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ha usato più dati del solito"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificato di sicurezza"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Questo certificato è valido."</string>
<string name="issued_to" msgid="454239480274921032">"Rilasciato a:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installato dall\'amministratore"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Aggiornato dall\'amministratore"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminato dall\'amministratore"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Per aumentare la durata della batteria, la funzione Risparmio energetico riduce le prestazioni del dispositivo e limita la vibrazione, i servizi di geolocalizzazione e la maggior parte dei dati in background. App di email, messaggi e altre app che si basano sulla sincronizzazione potrebbero essere aggiornate soltanto all\'apertura.\n\nLa funzione Risparmio energetico viene disattivata automaticamente quando il dispositivo è in carica."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Per contribuire a ridurre l\'utilizzo dei dati, la funzione Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Esempio: le immagini non vengono visualizzate finché non le tocchi."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Attivare Risparmio dati?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Attiva"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">Per %1$d minuti (fino alle ore <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Per 1 minuto (fino alle ore <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">Per %1$d ore (fino alla ore <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Per un\'ora (fino alle ore <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">Per %1$d ore (fino alle ore <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Per 1 ora (fino alle ore <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Per %1$d ore (fino alle ore <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">Per %d minuti</item>
<item quantity="one">Per 1 minuto</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Per %d ore</item>
- <item quantity="one">Per un\'ora</item>
+ <item quantity="one">Per 1 ora</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Per %d ore</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"Audio disattivato da <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Si è verificato un problema interno con il dispositivo, che potrebbe essere instabile fino al ripristino dei dati di fabbrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Si è verificato un problema interno con il dispositivo. Per informazioni dettagliate, contatta il produttore."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"La richiesta USSD è stata modificata in richiesta DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"La richiesta USSD è stata modificata in richiesta SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"La richiesta USSD è stata modificata in nuova richiesta USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"La richiesta USSD è stata modificata in richiesta Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"La richiesta SS è stata modificata in richiesta DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"La richiesta SS è stata modificata in richiesta Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La richiesta SS è stata modificata in richiesta USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La richiesta SS è stata modificata in nuova richiesta SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profilo di lavoro"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Espandi"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Comprimi"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"App dannosa rilevata"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"L\'app <xliff:g id="APP_0">%1$s</xliff:g> vuole mostrare porzioni dell\'app <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Modifica"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"La vibrazione sarà attiva per chiamate e notifiche"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"L\'audio di chiamate e notifiche sarà disattivato"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Modifiche al sistema"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Non disturbare"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"La modalità Non disturbare nasconde le notifiche per favorire la concentrazione"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Si tratta di un nuovo comportamento. Tocca per cambiarlo."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"L\'impostazione Non disturbare è cambiata"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tocca per controllare le interruzioni nelle impostazioni relative al comportamento"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tocca per controllare le notifiche bloccate."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Impostazioni"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 15fa7dc3923d..16abaca2eeab 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"既定: 発信者番号通知、次の発信: 通知"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"提供可能なサービスがありません。"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"発信者番号の設定は変更できません。"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"データサービス停止"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"緊急通報は利用できません"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"モバイルデータ サービスのブロック"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"緊急通報のブロック"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"音声通話サービス停止"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"音声通話 / 緊急通報サービス停止"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"現在地のモバイル ネットワークでは一時的に提供されていません"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ネットワークにアクセスできません"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"受信状態を改善するには、[設定] &gt; [ネットワークとインターネット] &gt; [モバイル ネットワーク] &gt; [優先ネットワーク タイプ] で選択したタイプを変更してみてください。"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi 通話が有効な状態です"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"緊急通報にはモバイル ネットワークが必要です。"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"音声サービスと緊急通報のブロック"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"携帯通信会社によって一時的に OFF にされています"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"モバイル ネットワークにアクセスできません"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"タップして、優先ネットワークを変更してください。"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"緊急通報は利用できません"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi‑Fi では緊急通報ができません"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"電話の転送"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急通報待機モード"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"ローミングバナーON"</string>
<string name="roamingText12" msgid="1189071119992726320">"ローミングバナーOFF"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"サービスを検索中"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi通話"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi 経由で音声通話の発信やメッセージの送信を行うには、携帯通信会社に Wi-Fi サービスを申し込んだ上で、設定画面で Wi-Fi 通話を再度 ON にしてください(エラーコード: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"携帯通信会社に登録してください(エラーコード: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Wi-Fi通話(%s)"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"処理中のリクエストが多すぎます。しばらくしてからもう一度試してください。"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>のログインエラー"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"同期"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"同期"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g>での削除が多すぎます。"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"同期できません"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"削除する <xliff:g id="CONTENT_TYPE">%s</xliff:g> が多すぎます。"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"タブレットのストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ウォッチのストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"テレビのストレージに空き容量がありません。ファイルを削除して空き領域を確保してください。"</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"仕事用プロファイルの管理者からの通知"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>によって監視される場合があります"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"仕事用プロファイルが削除されました"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"管理アプリがないため仕事用プロファイルが削除されました"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"仕事用プロファイルの管理アプリがないか、破損しています。そのため仕事用プロファイルと関連データが削除されました。管理者にサポートをご依頼ください。"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"お使いの仕事用プロファイルはこの端末で使用できなくなりました"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"パスワード入力回数が上限を超えました"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"管理対象の端末"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"この端末は組織によって管理され、ネットワーク トラフィックが監視される場合があります。詳しくはタップしてください。"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"端末のデータが消去されます"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"管理アプリを使用できません。端末のデータはこれから消去されます。\n\nご不明な点がある場合は、組織の管理者にお問い合わせください。"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"管理アプリを使用できません。端末のデータはこれから消去されます。\n\nご不明な点がある場合は、組織の管理者にお問い合わせください。"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"「<xliff:g id="OWNER_APP">%s</xliff:g>」により印刷は無効にされています。"</string>
<string name="me" msgid="6545696007631404292">"自分"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"タブレットオプション"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"機内モード"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"機内モードON"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"機内モードOFF"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"バッテリー セーバー"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"バッテリー セーバー OFF"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"バッテリー セーバー ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"サポート"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"音声アシスト"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"仕事用プロファイルに切り替える"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"連絡先"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"連絡先へのアクセス"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"連絡先へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可してください"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"連絡先へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"位置情報"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"この端末の位置情報へのアクセス"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"この端末の位置情報へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可してください"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"この端末の位置情報へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"カレンダー"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"カレンダーへのアクセス"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"カレンダーへのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可してください"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"カレンダーへのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMSメッセージの送信と表示"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"SMS メッセージの送信と表示を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可してください"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"SMS メッセージの送信と表示を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ストレージ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"端末内の写真、メディア、ファイルへのアクセス"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"端末内の写真、メディア、ファイルへのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可してください"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"端末内の写真、メディア、ファイルへのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"マイク"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"音声の録音"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"音声の録音を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可してください"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"音声の録音を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"カメラ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"写真と動画の撮影"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"写真と動画の撮影を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可してください"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"写真と動画の撮影を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"電話の発信と管理"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"電話の発信と管理を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可してください"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"電話の発信と管理を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ボディーセンサー"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"バイタルサインに関するセンサーデータへのアクセス"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"バイタルサインに関するセンサーデータへのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可してください"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"バイタルサインに関するセンサーデータへのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ウィンドウコンテンツの取得"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ユーザーがアクセスしているウィンドウのコンテンツを検査します。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"タッチガイドの有効化"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"操作の実行"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"タップ、スワイプ、ピンチ、その他の操作を行えます。"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"指紋認証センサーでの操作"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"端末の指紋認証センサーで行われた操作をキャプチャできます。"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"端末の指紋認証センサーで行われた操作をキャプチャできます。"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ステータスバーの無効化や変更"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ステータスバーの無効化、システムアイコンの追加や削除をアプリに許可します。"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ステータスバーへの表示"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"アプリにその一部をメモリに常駐させることを許可します。これにより他のアプリが使用できるメモリが制限されるため、タブレットの動作が遅くなることがあります。"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"アプリにその一部をメモリに常駐させることを許可します。これにより他のアプリが使用できるメモリが制限されるため、テレビの動作が遅くなることがあります。"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"アプリにその一部をメモリに常駐させることを許可します。これにより他のアプリが使用できるメモリが制限されるため、モバイル端末の動作が遅くなることがあります。"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"フォアグラウンド サービスの実行"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"フォアグラウンド サービスの使用をアプリに許可します。"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"アプリのストレージ容量の計測"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"アプリのコード、データ、キャッシュサイズを取得することをアプリに許可します"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"システム設定の変更"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"パターンロックを解除します。"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"フェイスアンロックを行います。"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PINロックを解除します。"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM PIN のロックを解除します。"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM PUK のロックを解除します。"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"パスワードロックを解除します。"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"パターンエリアです。"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"スライドエリアです。"</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"テキストをクリップボードにコピーしました。"</string>
<string name="more_item_label" msgid="4650918923083320495">"その他"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"MENU+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"Space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"Enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"Del"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"アップデートをチェック"</string>
<string name="smv_application" msgid="3307209192155442829">"アプリ「<xliff:g id="APPLICATION">%1$s</xliff:g>」(プロセス「<xliff:g id="PROCESS">%2$s</xliff:g>」)でStrictModeポリシー違反がありました。"</string>
<string name="smv_process" msgid="5120397012047462446">"プロセス<xliff:g id="PROCESS">%1$s</xliff:g>でStrictModeポリシー違反がありました。"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Androidをアップグレードしています..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Androidの起動中…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"スマートフォンの更新中…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"タブレットの更新中…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"端末の更新中…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"スマートフォンの起動中…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"タブレットの起動中…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"端末の起動中…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ストレージを最適化しています。"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android の更新の終了中…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"アップグレードが完了するまで一部のアプリが正常に動作しない可能性があります"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"システム アップデートの完了中…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"「<xliff:g id="APPLICATION">%1$s</xliff:g>」をアップグレードしています…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>個中<xliff:g id="NUMBER_0">%1$d</xliff:g>個のアプリを最適化しています。"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g>をペア設定しています。"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"アプリを起動しています。"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ブートを終了しています。"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>を実行中"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"タップするとゲームに戻ります"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ゲームの選択"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"パフォーマンスを向上させるため、一度に 1 つのゲームのみを開くことができます。"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> に戻る"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> を開く"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> を保存せずに閉じます"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>はメモリの上限を超えました"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ヒープダンプが収集されました。タップして共有できます"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"ヒープダンプを収集しました。共有するにはタップしてください。"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ヒープダンプを共有しますか?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"プロセス<xliff:g id="PROC">%1$s</xliff:g>はプロセスメモリの上限<xliff:g id="SIZE">%2$s</xliff:g>を超えました。ヒープダンプをデベロッパーと共有できます。このヒープダンプには、アプリがアクセスできる個人情報が含まれている可能性があるのでご注意ください。"</string>
<string name="sendText" msgid="5209874571959469142">"アプリケーションを選択"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Wi-Fi オープン ネットワークに接続"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"携帯通信会社の Wi‑Fi ネットワークに接続"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Wi-Fi オープン ネットワークに接続しています"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi-Fi ネットワークに接続しました"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ネットワークに接続できませんでした"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"すべてのネットワークを表示するにはタップします"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"接続"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"すべてのネットワーク"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"すべてのネットワーク"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi は自動的にオンになります"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"高品質の保存済みネットワークの検出時"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"再度オンにしない"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"再起動"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"モバイル サービスを有効にする"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"新しい SIM を有効にするには携帯通信会社のアプリをダウンロードします"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"新しい SIM を有効にするには「<xliff:g id="APP_NAME">%1$s</xliff:g>」アプリをダウンロードしてください"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"アプリをダウンロード"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"新しい SIM が挿入されました"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"タップして設定"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB PTP モード ON"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB テザリング ON"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB MIDI モード ON"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB アクセサリ モード ON"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB アクセサリが接続されました"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"タップしてその他のオプションを表示します。"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"接続されている端末を充電しています。タップすると、他の項目が表示されます。"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"アナログのオーディオ アクセサリを検出"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"接続したデバイスはこのスマートフォンと互換性がありません。タップすると、詳細を確認できます。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USBデバッグが接続されました"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"タップして USB デバッグを無効にします。"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"タップして USB デバッグを無効にしてください"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USBデバッグを無効にする場合に選択します。"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"バグレポートを取得しています…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"バグレポートを共有しますか?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>を他のアプリの上に重ねて表示"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>が他のアプリの上に表示されています"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>でこの機能を使用しない場合は、タップして設定を開いて OFF にしてください。"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"OFF にする"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"OFF にする"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>を準備中"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"エラーを確認中"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"新しい<xliff:g id="NAME">%s</xliff:g>が検出されました"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPNに常時接続しています…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPNに常時接続しました"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"常時接続 VPN から切断されました"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"常時接続VPNのエラー"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"常時接続 VPN に接続できませんでした"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"ネットワークまたは VPN の設定を変更できます"</string>
<string name="upload_file" msgid="2897957172366730416">"ファイルを選択"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ファイルが選択されていません"</string>
<string name="reset" msgid="2448168080964209908">"リセット"</string>
<string name="submit" msgid="1602335572089911941">"送信"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"運転モード中"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"タップして運転モードを終了します。"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"運転アプリを実行しています"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"運転アプリを終了するにはタップしてください。"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"テザリングまたはアクセスポイントが有効です"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"タップしてセットアップします。"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"テザリングは無効に設定されています"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g>製USBドライブ"</string>
<string name="storage_usb" msgid="3017954059538517278">"USBストレージ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"編集"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"データ使用量に関する通知"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"タップして使用状況と設定を表示します。"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G~3Gデータの上限に達しました"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4Gデータの上限に達しました"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"データ使用の警告"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> のデータを使用しました"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"モバイルデータの上限に達しました"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fiデータの上限に達しました"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"残りのサイクル中データは一時停止"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G~3Gデータの上限を超えました"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4Gデータの上限を超えました"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"モバイルデータの上限を超えました"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fiデータの上限を超えました"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"指定した上限を<xliff:g id="SIZE">%s</xliff:g>超えました。"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"残りの期間中はデータ使用が一時停止されます"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"モバイルデータ上限の超過"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi データ上限の超過"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"設定した上限を <xliff:g id="SIZE">%s</xliff:g> 超えました"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"バックグラウンドデータに上限あり"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"タップして制限を解除します。"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"データ使用量の増加"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"ここ数日間のデータ使用量が通常より増えています。タップして使用状況と設定を確認してください。"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"モバイルデータ使用量の増加"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"アプリが通常より多くのデータを使用しています"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"「<xliff:g id="APP">%s</xliff:g>」が通常より多くのデータを使用しています"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"セキュリティ証明書"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"証明書は有効です。"</string>
<string name="issued_to" msgid="454239480274921032">"発行先:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"管理者によりインストールされています"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"管理者により更新されています"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"管理者により削除されています"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"バッテリーを長持ちさせるため、バッテリー セーバーは端末のパフォーマンスを抑え、バイブレーション、位置情報サービス、大半のバックグラウンド データを制限します。同期を使用するメールやメッセージなどのアプリは起動しないと更新されない場合があります。\n\nバッテリー セーバーは端末の充電中は自動的に OFF になります。"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"データセーバーは、一部のアプリによるバックグラウンドでのデータ送受信を停止することでデータ使用量を抑制します。使用中のアプリからデータにアクセスすることはできますが、その頻度は低くなる場合があります。この影響として、たとえば画像はタップしないと表示されないようになります。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"データセーバーを ON にしますか?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ON にする"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d分間(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>まで)</item>
<item quantity="one">1分間(<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>まで)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d時間(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>まで)</item>
- <item quantity="one">1時間(<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>まで)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d 時間(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>まで)</item>
+ <item quantity="one">1 時間(<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>まで)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d時間(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>まで)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">%d分間</item>
<item quantity="one">1分間</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">%d時間</item>
- <item quantity="one">1時間</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d 時間</item>
+ <item quantity="one">1 時間</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d時間</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>によりミュートになっています"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"端末で内部的な問題が発生しました。データが初期化されるまで不安定になる可能性があります。"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"端末で内部的な問題が発生しました。詳しくはメーカーにお問い合わせください。"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSDリクエストはDIALリクエストに変更されました。"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSDリクエストはSSリクエストに変更されました。"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSDリクエストは新しいUSSDリクエストに変更されました。"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD リクエストは Video DIAL リクエストに変更されました。"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SSリクエストはDIALリクエストに変更されました。"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS リクエストは Video DIAL リクエストに変更されました。"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SSリクエストはUSSDリクエストに変更されました。"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SSリクエストは新しいSSリクエストに変更されました。"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"仕事用プロファイル"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展開"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"折りたたむ"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"有害なアプリが検出されました"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"「<xliff:g id="APP_0">%1$s</xliff:g>」が「<xliff:g id="APP_2">%2$s</xliff:g>」のスライスの表示をリクエストしています"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"編集"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"着信や通知をバイブレーションで知らせます"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"着信音と通知音をミュートします"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"システムの変更"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"マナーモード"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"マナーモードでは、集中できるよう通知が非表示になります"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"これが新しい動作です。変更するにはタップしてください。"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"マナーモードが変わりました"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"タップして割り込みの動作設定をご確認ください"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"タップしてブロック対象をご確認ください。"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"システム"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"設定"</string>
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index a0ff3b83a4fb..7bee20113ab1 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ნაგულისხმებად დაყენებულია ნომრის დაფარვის გამორთვა. შემდეგი ზარი: არ არის დაფარული."</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"სერვისი არ არის მიწოდებული."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"არ შეგიძლიათ აბონენტის ID პარამეტრების შეცვლა."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"მობილური ინტერნეტის სერვისი არ არის"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"გადაუდებელი ზარების სერვისი არ არის"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"მობილური ინტერნეტის სერვისი არ არის"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"გადაუდებელი ზარი მიუწვდომელია"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ხმოვანი ზარების სერვისი არ არის"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ხმოვანი/გადაუდებელი ზარების სერვისი არ არის"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"დროებით არ არის შემოთავაზებული მობილური ქსელის მიერ თქვენს მდებარეობაზე"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ქსელთან დაკავშირება ვერ ხერხდება"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"მიღების გასაუმჯობესებლად ცადეთ არჩეული ტიპის შეცვლა აქ: პარამეტრები &gt; ქსელი და ინტერნეტი &gt; მობილური ქსელები &gt; ქსელის სასურველი ტიპი."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"აქტიურია Wi‑Fi დარეკვა"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"გადაუდებელი ზარები საჭიროებს მობილურ ქსელს."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ხმოვანი სერვისები და გადაუდებელი ზარი მიუწვდომელია"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"დროებით გამორთულია თქვენი ოპერატორის მიერ"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"მობილურ ქსელთან დაკავშირება ვერ ხერხდება"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ცადეთ უპირატესი ქსელის შეცვლა. შეეხეთ შესაცვლელად."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"გადაუდებელი ზარი მიუწვდომელია"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"გადაუდებელი ზარები Wi‑Fi-ს მეშვეობით ვერ განხორციელდება"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"გაფრთხილებები"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ზარის გადამისამართება"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"გადაუდებელი გადმორეკვის რეჟიმი"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming Banner ჩართულია"</string>
<string name="roamingText12" msgid="1189071119992726320">"როუმინგის ბანერი გამორთულია"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"სერვისის ძიება"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"დარეკვა Wi-Fi-ს მეშვეობით"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi-ს მეშვეობით ზარების განსახორციელებლად ან შეტყობინებების გასაგზავნად, პირველ რიგში, ამ სერვისის გააქტიურება თქვენს ოპერატორს უნდა თხოვოთ. შემდეგ კი ხელახლა ჩართეთ Wi-Fi დარეკვა პარამეტრებიდან. (შეცდომის კოდი: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"თქვენს ოპერატორთან რეგისტრირება (შეცდომის კოდი: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s დარეკვა Wi-Fi-ს მეშვეობით"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ძალიან ბევრი მოთხოვნა მუშავდება. სცადეთ მოგვიანებით."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> ანგარიშის ავტორიზაციის შეცდომა"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"სინქრონიზაცია"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"სინქრონიზაცია"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g>-ის ძალიან ბევრი წაშლილები."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"სინქრონიზაცია ვერ ხერხდება"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"დაფიქსირდა <xliff:g id="CONTENT_TYPE">%s</xliff:g>-ის ზედმეტად ბევრი წაშლის მცდელობა."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ტაბლეტის მეხსიერება გავსებულია. ადგილის გასათავისუფლებლად წაშალეთ ფაილების ნაწილი."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"საათის მეხსიერება გავსებულია. ადგილის გასათავისუფლებლად წაშალეთ ფაილების ნაწილი."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ტელავიზორის მეხსიერება სავსეა.თავისუფალი სივრცისათვის, წაშალეთ გარკვეული ფაილები."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"თქვენი სამსახურის პროფილის ადმინისტრატორის მიერ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>-ის მიერ"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"სამუშაო პროფილი წაშლილია"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"სამსახურის პროფილი წაიშალა ადმინისტრატორის აპის არქონის გამო"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"სამსახურის პროფილის ადმინისტრატორის აპი მიუწვდომელია ან დაზიანებულია. ამის გამო, თქვენი სამსახურის პროფილი და დაკავშირებული მონაცემები წაიშალა. დახმარებისთვის დაუკავშირდით თქვენს ადმინისტრატორს."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"თქვენი სამსახურის პროფილი აღარ არის ხელმისაწვდომი ამ მოწყობილობაზე"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"დაფიქსირდა პაროლის შეყვანის ზედმეტად ბევრი მცდელობა"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"მოწყობილობა მართულია"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"ამ მოწყობილობას თქვენი ორგანიზაცია მართავს და მას ქსელის ტრაფიკის მონიტორინგი შეუძლია. შეეხეთ დამატებითი დეტალებისთვის."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"თქვენი მოწყობილობა წაიშლება"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"ადმინისტრატორის აპის გამოყენება ვერ მოხერხდება. თქვენი მოწყობილობა ახლა ამოიშლება.\n\nთუ შეკითხვები გაქვთ, დაუკავშირდით თქვენი ორგანიზაციის ადმინისტრატორს."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"ადმინისტრატორის აპის გამოყენება ვერ მოხერხდება. თქვენი მოწყობილობა ახლა ამოიშლება.\n\nთუ შეკითხვები გაქვთ, დაუკავშირდით თქვენი ორგანიზაციის ადმინისტრატორს."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"ბეჭდვა გათიშულია <xliff:g id="OWNER_APP">%s</xliff:g>-ის მიერ."</string>
<string name="me" msgid="6545696007631404292">"მე"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ტაბლეტის პარამეტრები"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"თვითმფრინავის რეჟიმი"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"თვითმფრინავის რეჟიმი ჩართულია."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"თვითმფრინავის რეჟიმი გამორთულია."</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ბატარეის დამზოგი"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ბატარეის დამზოგი გამორთულია"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ბატარეის დამზოგი ჩართულია"</string>
<string name="global_action_settings" msgid="1756531602592545966">"პარამეტრები"</string>
<string name="global_action_assist" msgid="3892832961594295030">"დახმარება"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ხმოვანი ასისტ."</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"სამსახურის პროფილზე გადართვა"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"კონტაქტები"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"თქვენს კონტაქტებზე წვდომა"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის&lt;/b&gt; თქვენს კონტაქტებზე წვდომის ნების დართვა"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; თქვენს კონტაქტებზე წვდომის ნებართვა?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"მდებარეობა"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"მოწყობილობის მდებარეობაზე წვდომა"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის&lt;/b&gt; ამ მოწყობილობის მდებარეობაზე წვდომის ნების დართვა"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; ამ მოწყობილობის მდებარეობაზე წვდომის ნებართვა?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"კალენდარი"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"თქვენს კალენდარზე წვდომა"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის&lt;/b&gt; თქვენს კალენდარზე წვდომის ნების დართვა"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; თქვენს კალენდარზე წვდომის ნებართვა?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS შეტყობინებების გაგზავნა და ნახვა"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის&lt;/b&gt; SMS-შეტყობინებათა გაგზავნის და ნახვის ნების დართვა"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; SMS-შეტყობინებათა გაგზავნის და ნახვის ნებართვა?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"შესანახი სივრცე"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"თქვენს მოწყობილობაზე არსებულ ფოტოებზე, მედიასა და ფაილებზე წვდომა"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის&lt;/b&gt; თქვენს მოწყობილობაზე არსებულ ფოტოებზე, მედია-კონტენტზე და ფაილებზე წვდომის ნების დართვა"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; თქვენს მოწყობილობაზე არსებულ ფოტოებზე, მედია-კონტენტზე და ფაილებზე წვდომის ნებართვა?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"მიკროფონი"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"აუდიოს ჩაწერა"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის&lt;/b&gt; აუდიოს ჩაწერის ნების დართვა"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; აუდიოს ჩაწერის ნებართვა?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"კამერა"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ფოტოებისა და ვიდეოების გადაღება"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის&lt;/b&gt; სურათების გადაღების და ვიდეოების ჩაწერის ნების დართვა"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; სურათების გადაღების და ვიდეოების ჩაწერის ნებართვა?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ტელეფონი"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"სატელეფონო ზარების განხორციელება და მართვა"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის&lt;/b&gt; სატელეფონო ზარების განხორციელების და მართვის ნების დართვა"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; სატელეფონო ზარების განხორციელების და მართვის ნებართვა?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"სხეულის სენსორები"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"თქვენი სასიცოცხლო ფუნქციების შესახებ სენსორის მონაცემებზე წვდომა"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის&lt;/b&gt; თქვენი სასიცოცხლო ფუნქციების შესახებ სენსორის მონაცემებზე წვდომის ნების დართვა"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; თქვენი სასიცოცხლო ფუნქციების შესახებ სენსორის მონაცემებზე წვდომის ნებართვა?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ფანჯრის კონტენტის მოძიება"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"იმ ფანჯრის კონტენტის შემოწმება, რომელშიც მუშაობთ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"„შეხებით აღმოჩენის“ ჩართვა"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ჟესტების შესრულება"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"შეუძლია შეხება, გადაფურცვლა, მასშტაბირება და სხვა ჟესტების შესრულება."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"თითის ანაბეჭდის ჟესტები"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"შეუძლია აღბეჭდოს მოწყობილობის თითის ანაბეჭდის სენსორზე განხორციელებული ჟესტები."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"შეუძლია აღბეჭდოს მოწყობილობის თითის ანაბეჭდის სენსორზე განხორციელებული ჟესტები."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"სტატუსის ზოლის გათიშვა ან ცვლილება"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"აპს შეეძლება სტატუსების ზოლის გათიშვა და სისტემის ხატულების დამატება/წაშლა."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"სტატუსის ზოლის ჩანაცვლება"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"აპს შეეძლება, საკუთარი ნაწილები მუდმივად ჩაწეროს მეხსიერებაში. ეს შეზღუდავს მეხსიერების ხელმისაწვდომობას სხვა აპებისთვის და შეანელებს ტაბლეტს."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"ნებას რთავს აპლიკაციას, მდგრადი გახადოს მეხსიერება. ამან შესაძლოა ტელევიზორის ფუნქიონირებისა და სხვა აპლიკაციების მეხსიერების შესუსტება გამოწივიოს."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"აპს შეეძლება, საკუთარი ნაწილები მუდმივად ჩაწეროს მეხსიერებაში. ეს შეზღუდავს მეხსიერების ხელმისაწვდომობას სხვა აპებისთვის და შეანელებს ტელეფონს."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"წინა პლანის სერვისის გაშვება"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"აპს შეეძლება, გამოიყენოს წინა პლანის სერვისები."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"აპის მეხსიერების სივრცის გაზომვა"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"აპს შეეძლება, მოიპოვოს თავისი კოდი, მონაცემები და ქეშის ზომები."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"სისტემის პარამეტრების შეცვლა"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"განბლოკვა ნიმუშით."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"განბლოკვა სახით"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"განბლოკვა Pin-ით."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM-ის PIN-კოდით განბლოკვა."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM-ის PUK-კოდით განბლოკვა."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"პაროლის განბლოკვა"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ნიმუშების სივრცე."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"გადასრიალების სივრცე."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"ტექსტი დაკოპირებულია გაცვლის ბუფერში."</string>
<string name="more_item_label" msgid="4650918923083320495">"დამატებით"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"მენიუ+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"[ინტერვალი]"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"წაშლა"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"განახლების შემოწმება"</string>
<string name="smv_application" msgid="3307209192155442829">"აპმა <xliff:g id="APPLICATION">%1$s</xliff:g> (პროცესი <xliff:g id="PROCESS">%2$s</xliff:g>) დაარღვია საკუთარი StrictMode დებულება."</string>
<string name="smv_process" msgid="5120397012047462446">"ამ პროცესმა <xliff:g id="PROCESS">%1$s</xliff:g> დააზიანა საკუთარი StrictMode დებულება."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android ახალ ვერსიაზე გადადის…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android იწყება…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"მიმდინარეობს ტელეფონის განახლება…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"მიმდინარეობს ტაბლეტის განახლება…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"მიმდინარეობს მოწყობილობის განახლება…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"მიმდინარეობს ტელეფონის ჩართვა…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"მიმდინარეობს ტაბლეტის ჩართვა…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"მიმდინარეობს მოწყობილობის ჩართვა…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"მეხსიერების ოპტიმიზირება."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-ის განახლება სრულდება…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ახალ ვერსიაზე გადასვლის დასრულებამდე, ზოგიერთმა აპმა შეიძლება არასწორად იმუშაოს"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"სისტემის განახლება სრულდება…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ახალ ვერსიაზე გადადის…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"მიმდინარეობს აპლიკაციების ოპტიმიზაცია. დასრულებულია <xliff:g id="NUMBER_0">%1$d</xliff:g>, სულ <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"ემზადება <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"აპების ჩართვა"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ჩატვირთვის დასასრული."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> გაშვებულია"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"შეეხეთ თამაშში დასაბრუნებლად"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"აირჩიეთ თამაში"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"უკეთესად ფუნქციონირებისთვის, ერთდროულად მხოლოდ ერთი თამაშის გახსნაა დაშვებული."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g>-ზე დაბრუნება"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"გახსენით <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> დაიხურება მონაცემთა შენახვის გარეშე"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>-მა გადააჭარბა მეხსიერების ლიმიტს"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"გროვის ამონაწერი მომზადდა; შეეხეთ გასაზიარებლად"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"გროვის ამონაწერი მომზადდა, შეეხეთ გასაზიარებლად."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"გავაზიაროთ გროვის ამონაწერი?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"პროცესმა <xliff:g id="PROC">%1$s</xliff:g> გადააჭარბა საპროცესო მეხსიერების <xliff:g id="SIZE">%2$s</xliff:g>-იან ლიმიტს. გროვის ამონაწერი ხელმისაწვდომია მის დეველოპერთან გასაზიარებლად. ფრთხილად: გროვის ამონაწერი შეიძლება შეიცავდეს ნებისმიერ თქვენს პირად ინფორმაციას, რომელზეც ამ აპლიკაციას წვდომა აქვს."</string>
<string name="sendText" msgid="5209874571959469142">"შეარჩიეთ ქმედება ტექსტისთვის."</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"დაუკავშირდით ღია Wi‑Fi ქსელს"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"დაუკავშირდით ოპერატორის Wi‑Fi-ქსელს"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"მიმდინარეობს ღია Wi‑Fi ქსელთან დაკავშირება"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi ქსელთან დაკავშირება წარმატებით მოხერხდა"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ქსელთან დაკავშირება ვერ მოხერხდა"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"შეეხეთ ყველა ქსელის სანახავად"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"დაკავშირება"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ყველა ქსელი"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ყველა ქსელი"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi ავტომატურად ჩაირთვება"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"როცა შენახულ მაღალხარისხიან ქსელებთან ახლოს იმყოფებით"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ხელახლა ნუ ჩართავ"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"გადატვირთვა"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"გაააქტიურეთ მობილური სერვისი"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ჩამოტვირთეთ ოპერატორის აპი, რათა თქვენი ახალი SIM გაააქტიუროთ"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"ჩამოტვირთეთ <xliff:g id="APP_NAME">%1$s</xliff:g>-ის აპი თქვენი ახალი SIM-ის გასააქტიურებლად"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"აპის ჩამოტვირთვა"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"მოთავსებულია ახალი SIM ბარათი"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"შეეხეთ პარამეტრების დასაყენებლად"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"ჩართულია PTP, USB-ს მეშვეობით"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ტეტერინგი ჩართულია"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"ჩართულია MIDI, USB-ს მეშვეობით"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB აქსესუარის რეჟიმი ჩართულია"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB აქსესუარი დაკავშირებულია"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"შეეხეთ დამატებითი ვარიანტების სანახავად."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"დაკავშირებული მოწყობილობა იტენება. შეეხეთ დამატებითი ვარიანტებისთვის."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"აღმოჩენილია ანალოგური აუდიო აქსესუარი"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"მიერთებული მოწყობილობა არაა თავსებადი ამ ტელეფონთან. მეტის გასაგებად, შეეხეთ."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB გამართვა შეერთებულია"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"შეეხეთ USB-გამართვის გასათიშად."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"შეეხეთ, რათა გამორთოთ USB შეცდომების გამართვა"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"მონიშნეთ რათა შეწყვიტოთ USB-ის გამართვა"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"მიმდინარეობს ხარვეზის შესახებ ანგარიშის შექმნა…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"გსურთ ხარვეზის შესახებ ანგარიშის გაზიარება?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ნაჩვენებია სხვა აპების ინტერფეისის გადაფარვით"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ნაჩვენებია სხვა აპების ინტერფეისის გადაფარვით"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"თუ არ გსურთ <xliff:g id="NAME">%s</xliff:g>-ის მიერ ამ ფუნქციის გამოყენება, შეეხეთ პარამეტრების გასახსნელად და გამორთეთ."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"გამორთვა"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"გამორთვა"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ის მომზადება"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"შეცდომების შემოწმება"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"აღმოჩენილია ახალი <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"მიმდინარეობს მუდმივად ჩართული VPN-ის მიერთება…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"მუდმივად ჩართული VPN-ის მიერთებულია"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"გათიშულია მუდმივად ჩართული VPN-იდან"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"შეცდომა მუდამ VPN-ზე"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"მუდმივად ჩართულ VPN-თან დაკავშირება ვერ მოხერხდა"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"შეცვალეთ ქსელი ან VPN-ის პარამეტრები"</string>
<string name="upload_file" msgid="2897957172366730416">"ფაილის არჩევა"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ფაილი არჩეული არ არის"</string>
<string name="reset" msgid="2448168080964209908">"საწყისზე დაბრუნება"</string>
<string name="submit" msgid="1602335572089911941">"გაგზავნა"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"მანქანის რეჟიმი ჩართულია"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"შეეხეთ მანქანის რეჟიმიდან გამოსასვლელად."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"მართვის აპი გაშვებულია"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"შეეხეთ მართვის აპიდან გასასვლელად."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ტეტერინგი ან უსადენო ქსელი აქტიურია"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"შეეხეთ დასაყენებლად."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ტეტერინგი გათიშულია"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB დისკი"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB მეხსიერება"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"რედაქტირება"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"მონაცემთა მოხმარების გაფრთხილება"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"შეეხეთ მოხმარებისა და პარამეტრების სანახავად."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G მონაცემთა ლიმიტი ამოიწურა"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G მონაცემთა ლიმიტი ამოიწურა"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"მოხმარების შესახებ გაფრთხილება"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"თქვენ მოიხმარეთ <xliff:g id="APP">%s</xliff:g> მობილური ინტერნეტი"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"მიღწეულია მობ. ინტერნეტის ლიმიტი"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi მონაცემთა ლიმიტი ამოიწურა"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"მონაცემები შეჩერდა ციკლისთვის"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"გადაჭარბებულია 2G-3G მონაცემების ლიმიტი"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ლიმიტი გადაჭარბებულია"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"მობილური ინტერნეტის ლიმიტი გადაჭარბებულია."</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi‑Fi მონაცემთა ლიმიტი გადაჭარბებულია"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"ლიმიტი გადაჭარბებულია <xliff:g id="SIZE">%s</xliff:g>-ით."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"მობილურ ინტერნეტზე წვდომა შეყოვნებულია მოცემული ციკლის ბოლომდე"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"მობილური ინტერნეტის მოხმარების ლიმიტი მიღწეულია"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi-ს ინტერნეტ-ლიმიტი მიღწეულია"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"თქვენ დაწესებულ ლიმიტზე <xliff:g id="SIZE">%s</xliff:g>-ით მეტი მოიხმარეთ"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"მონაცემთა ფონური გადაცემა შეზღუდულია"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"შეეხეთ შეზღუდვის მოსახსნელად."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"მონაცემთა ინტენსიური მოხმარება"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"ბოლო რამდენიმე დღე თქვენ მიერ მონაცემთა მოხმარება აჭარბებდა ჩვეულებრივს. შეეხეთ მოხმარებისა და პარამეტრების სანახავად."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"მობილური ინტერნეტის მაღალი მოხმარება"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"თქვენი აპები მოიხმარს ჩვეულებრივზე მეტ ინტერნეტს"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g>-მა მოიხმარა ჩვეულებრივზე მეტი ინტერნეტი"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"უსაფრთხოების სერტიფიკატი"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ეს სერტიფიკატი სწორია."</string>
<string name="issued_to" msgid="454239480274921032">"მიეცა:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"დაინსტალირებულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"განახლებულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"წაიშალა თქვენი ადმინისტრატორის მიერ"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"ბატარეის მუშაობის ხანგრძლივობის გაუმჯობესებისათვის, ბატარეის დამზოგი ამცირებს თქვენი მოწყობილობის ფუნქციონალობას და ზღუდავს ვიბრაციას, მდებარეობის სერვისებს და ფონურ მონაცემთა უმეტესობას. ელფოსტა, შეტყობინებები და სხვა სინქრონიზაციაზე დამოკიდებული აპები მათ გახსნამდე არ განახლდება.\n\nბატარეის დამზოგი ავტომატურად გამოირთვება, როცა თქვენს მოწყობილობას დამტენთან შეაერთებთ."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"მობილური ინტერნეტის მოხმარების შემცირების მიზნით, მონაცემთა დამზოგველი ზოგიერთ აპს ფონურ რეჟიმში მონაცემთა გაგზავნასა და მიღებას შეუზღუდავს. თქვენ მიერ ამჟამად გამოყენებული აპი მაინც შეძლებს მობილურ ინტერნეტზე წვდომას, თუმცა ამას ნაკლები სიხშირით განახორციელებს. ეს ნიშნავს, რომ, მაგალითად, სურათები არ გამოჩნდება მანამ, სანამ მათ საგანგებოდ არ შეეხებით."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ჩაირთოს მონაცემთა დამზოგველი?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ჩართვა"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d წთ. (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>-მდე)</item>
<item quantity="one">1 წთ. (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>-მდე)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d საათის განმავლობაში (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>-მდე)</item>
- <item quantity="one">ერთი საათის განმავლობაში (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>-მდე)</item>
+ <item quantity="one">1 საათის განმავლობაში (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>-მდე)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d სთ. (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>-მდე)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">%d წთ.</item>
<item quantity="one">1 წთ.</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d საათის განმავლობაში</item>
- <item quantity="one">ერთი საათის განმავლობაში</item>
+ <item quantity="one">1 საათის განმავლობაში</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d სთ.</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"დადუმებულია <xliff:g id="THIRD_PARTY">%1$s</xliff:g>-ის მიერ"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ფიქსირდება თქვენი მ ოწყობილობის შიდა პრობლემა და შეიძლება არასტაბილური იყოს, სანამ ქარხნულ მონაცემების არ განაახლებთ."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ფიქსირდება თქვენი მოწყობილობის შიდა პრობლემა. დეტალებისათვის, მიმართეთ თქვენს მწარმოებელს."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD მოთხოვნა შეიცვლალა DIAL მოთხოვნით."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD მოთხოვნა შეიცვალა SS მოთხოვნით."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD მოთხოვნა შეიცვალა ახალი USSD მოთხოვნით."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD მოთხოვნა შეიცვალა Video DIAL მოთხოვნით."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS მოთხოვნა შეიცვალა DIAL მოთხოვნით."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS მოთხოვნა შეიცვალა Video DIAL მოთხოვნით."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS მოთხოვნა შეიცვალა USSD მოთხოვნით."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS მოთხოვნა შეიცვალა ახალი SS მოთხოვნით."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"სამსახურის პროფილი"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"გაშლა"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ჩაკეცვა"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"აღმოჩენილია საზიანო აპი"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>-ს სურს, გაჩვენოთ <xliff:g id="APP_2">%2$s</xliff:g>-ის ფრაგმენტები"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"რედაქტირება"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"ზარების და შეტყობინებების მიღებისას ვიბრაცია ჩაირთვება"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ზარები და შეტყობინებები დადუმებული იქნება"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"სისტემის ცვლილებები"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"არ შემაწუხოთ"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"„არ შემაწუხოთ“ რეჟიმი მალავს შეტყობინებებს, რათა კონცენტრირებაში დაგეხმაროთ"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ეს ახალი ქცევაა. შეეხეთ შესაცვლელად."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"„არ შემაწუხოთ“ რეჟიმი შეცვლილია"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"შეეხეთ, რათა გადაამოწმოთ შეფერხებების მოქმედებათა პარამეტრები"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"შეეხეთ იმის სანახავად, თუ რა არის დაბლოკილი."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"სისტემა"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"პარამეტრები"</string>
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 4b106a2cf651..9a08420a5900 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Қоңырау шалушының жеке анықтағышы бастапқы бойынша шектелмеген. Келесі қоңырау: Шектелмеген"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Қызмет ұсынылмаған."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Қоңырау шалушы идентификаторы параметрін өзгерту мүмкін емес."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Деректер қызметі жоқ"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Шұғыл қоңырау шалу бөгелген"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Мобильдік деректер қызметі жоқ"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Жедел қызметке қоңырау шалу қолжетімді емес"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Дауыстық қоңыраулар қызметі жоқ"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Дауыстық/жедел қызметке қоңыраулар қызметі жоқ"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Орналасқан аймағыңызда мобильдік желі уақытша ұсынбады"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Желіге қосылу мүмкін емес"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Қабылдауды жақсарту үшін \"Параметрлер &gt; Желі және интернет &gt; Мобильді желілер > Қалаулы желі түрі\" тармағынан түрді өзгертіп көріңіз."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi қоңыраулары қосулы"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Жедел қызметке қоңырау шалу үшін мобильдік желі қажет."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Дауыс қызметі немесе жедел қызметке қоңырау шалу мүмкіндігі жоқ"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Оператор уақытша өшірген"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобильдік желіге қосылу мүмкін емес"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Таңдаулы желіні өзгертіп көріңіз. Өзгерту үшін түртіңіз."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Жедел қызметке қоңырау шалу мүмкін емес"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi-Fi арқылы жедел қызметке қоңырау шалу мүмкін емес"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Дабылдар"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Қоңырауды басқа нөмірге бағыттау"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шұғыл кері қоңырау шалу режимі"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Роуминг баннері қосулы"</string>
<string name="roamingText12" msgid="1189071119992726320">"Роуминг баннері өшірулі"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Қызметті іздеу"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi қоңыраулары"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi арқылы қоңырау шалу немесе хабарлар жіберу үшін, алдымен операторыңыздан құрылғыны реттеуді сұраңыз. Содан кейін \"Параметрлер\" бөлімінен Wi-Fi қоңырауларын қайта қосыңыз. (Қате коды: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Оператор арқылы тіркеліңіз (қате коды: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi арқылы қоңырау шалу"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Тым көп өтініштер қаралуда. Кейінірек қайта әрекеттеніп көріңіз."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> үшін кіру қателігі"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Синх"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Үйлестіру"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Тым көп <xliff:g id="CONTENT_TYPE">%s</xliff:g> жойылған."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Синхрондау мүмкін емес"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Көптеген <xliff:g id="CONTENT_TYPE">%s</xliff:g> мазмұнын жоюға әрекет жасалды."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Планшет жады толы. Орын босату үшін кейбір файлдарды жойыңыз."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Сағат жады толы. Орын босату үшін кейбір файлдарды жойыңыз."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ТД жады толы. Орынды босату үшін кейбір файлдарды жойыңыз."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Жұмыс профиліңіздің әкімшісі"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> арқылы"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Жұмыс профилі жойылды"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Әкімші қолданбасы болмағандықтан жұмыс профилі жойылды"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Жұмыс профилінің әкімші қолданбасы жоқ немесе бүлінген. Нәтижесінде жұмыс профиліңіз және қатысты деректер жойылды. Көмек алу үшін әкімшіге хабарласыңыз."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Жұмыс профиліңіз осы құрылғыда енді қолжетімді емес"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Құпия сөз көп рет қате енгізілді"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Құрылғы басқарылады"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Ұйымыңыз осы құрылғыны басқарады және желі трафигін бақылауы мүмкін. Мәліметтер алу үшін түртіңіз."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Құрылғыңыздағы деректер өшіріледі"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Әкімші қолданбасын пайдалану мүмкін емес. Қазір құрылғыдағы деректер өшіріледі.\n\nСұрақтарыңыз болса, ұйым әкімшісіне хабарласыңыз."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Әкімші қолданбасын пайдалану мүмкін емес. Қазір құрылғыдағы деректер өшіріледі\n\nСұрақтарыңыз болса, ұйым әкімшісіне хабарласыңыз."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Басып шығаруды <xliff:g id="OWNER_APP">%s</xliff:g> өшірді."</string>
<string name="me" msgid="6545696007631404292">"Мен"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Планшет опциялары"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Ұшақ режимі"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Ұшақ режимі ҚОСУЛЫ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Ұшақ режимі ӨШІРУЛІ"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver ӨШІРУЛІ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver ҚОСУЛЫ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Параметрлер"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Көмек"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Дауыс көмекшісі"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Жұмыс профиліне ауысу"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контактілер"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"контактілерге кіру"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына контактілерге кіруге рұқсат беріңіз"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына контактілерге кіруге рұқсат берілсін бе?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Орын"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"бұл құрылғының орналасқан жерін көру"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына құрылғының орналасқан жері мәліметтерін пайдалануға рұқсат беріңіз"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына құрылғының орналасқан жері туралы мәліметтерді пайдалануға рұқсат берілсін бе?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Күнтізбе"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"күнтізбеге кіру"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына күнтізбеге кіруге рұқсат беріңіз"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына күнтізбеге кіруге рұқсат берілсін бе?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS хабарларын жіберу және көру"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына SMS хабарларын жіберуге және көруге рұқсат беріңіз"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына SMS хабарларын жіберуге және көруге рұқсат берілсін бе?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Жад"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"құрылғыдағы фотосуреттерге, мультимедиаға және файлдарға қол жеткізу"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына құрылғыдағы кіруге рұқсат беріңіз"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына құрылғыдағы суреттерге, медиафайлдарға және файлдарға кіруге рұқсат берілсін бе?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"аудио жазу"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына аудио жазуға рұқсат беріңіз"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына аудиомазмұн жазуға рұқсат берілсін бе?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"суретке түсіріп, бейне жазу"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына сурет түсіруге және бейне жазуға рұқсат беріңіз"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына суретке түсіруге және бейне жазуға рұқсат берілсін бе?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"қоңырау шалу және телефон қоңырауларын басқару"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына телефон қоңырауларын шалуға және басқаруға рұқсат беріңіз"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына қоңыраулар шалуға және басқаруға рұқсат берілсін бе?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Дене датчиктері"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ағза күйінің көрсеткіштері туралы сенсор деректеріне қатынасу"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" қолданбасына сіздің тіршілік белгілеріңіз туралы сенсорлық деректеріңізді пайдалануға рұқсат беріңіз"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына негізгі физиологиялық көрсеткіштерді көрсететін сенсорлық деректерді пайдалануға рұқсат берілсін бе?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезе мазмұнын оқып отыру."</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ашық тұрған терезе мазмұнын тексеру."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Түртілген элементтерді дыбыстау функциясын қосу"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Қимылдарды орындау"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Түртуге, сырғытуға, қысуға және басқа қимылдарды орындауға болады."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Саусақ ізі датчигіндегі қимылдар"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Құрылғының саусақ ізі датчигінде орындалған қимылдарды сақтайды"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Құрылғының саусақ ізі сенсорында орындалған қимылдарды сақтайды."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"күйін көрсету тақтасын өшіру немесе өзгерту"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Қолданбаға күй жолағын өшіруге немесе жүйелік белгішелерді қосуға және жоюға рұқсат береді."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"күй жолағы болу"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Қолданбаға өзінің бөліктерін жадта бекіндіру мүмкіндігін береді. Бұл басқа қолданбалардың жадқа қол жетімділігін шектеп, планшетті баяулатуы мүмкін."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Қолданбаға өзінің бөліктерін жадта тұрақты етуге рұқсат етеді. Бұл басқа қолданбаларға қол жетімді жадты шектеп, ТД баяулатуы мүмкін."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Қолданбаға өзінің бөліктерін жадта бекіндіру мүмкіндігін береді. Бұл басқа қолданбалардың жадқа қол жетімділігін шектеп, телефонды баяулатуы мүмкін."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"басымдылығы жоғары қызметті іске қосу"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Қолданбаға басымдылығы жоғары қызметтерді пайдалануға рұқсат береді."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"қолданба жадындағы бос орынды өлшеу"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Қолданбаға оның кодын, деректерін және кэш өлшемдерін шығарып алуға рұқсат береді"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"жүйе параметрлерін өзгерту"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Кескін арқылы ашу."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Бет-әлпет арқылы ашу."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin арқылы ашу."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM құлпын PIN кодымен ашу"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM құлпын PUK кодымен ашу"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Құпия сөз арқылы ашу."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Кескін арқылы ашу аймағы."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Сырғыту аймағы."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Мәтін ақпарат алмастыру қорына сақталды."</string>
<string name="more_item_label" msgid="4650918923083320495">"Көбірек"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Mәзір+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"бос орын"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"eнгізу"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"жою"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Жаңартуды тексеру"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> қолданбасы (<xliff:g id="PROCESS">%2$s</xliff:g> процесі) өзі қолданған StrictMode саясатын бұзды."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> үрдісі өздігінен күшіне енген ҚатаңРежим ережесін бұзды."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android жаңартылуда…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android іске қосылуда…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Телефон жаңартылуда…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Планшет жаңартылуда…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Құрылғы жаңартылуда…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Телефон іске қосылуда…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Планшет іске қосылуда…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Құрылғы іске қосылуда…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Қойманы оңтайландыру."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android жүйесін жаңарту аяқталуда…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Жаңарту аяқталғанға дейін кейбір қолданбалар дұрыс жұмыс істемеуі мүмкін"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Жүйелік жаңарту аяқталуда…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> жаңартылуда…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ішінен <xliff:g id="NUMBER_0">%1$d</xliff:g> қолданба оңтайландырылуда."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> дайындалуда."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Қолданбалар іске қосылуда."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Қосуды аяқтауда."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> қосылған"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Ойынды жалғастыру үшін түртіңіз"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Ойынды таңдаңыз"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Жақсырақ жұмыс істеуі үшін, бір уақытта тек бір ойынды ашуға болады."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> қолданбасына оралу"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> қолданбасын ашу"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> қолданбасының жұмысы сақталмай жабылады"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> жад шегінен асты"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Үйінді дамп жиналды; бөлісу үшін түртіңіз"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Үйінді дамп жиналды. Бөлісу үшін түртіңіз."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Үйінді дамппен бөлісу қажет пе?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> процесі <xliff:g id="SIZE">%2$s</xliff:g> процесс жады шегінен асып кетті. Үйінді дамп оның әзірлеушісімен ​​бөлісуге қолжетімді. Абай болыңыз: бұл үйінді дампта бағдарлама кіре алатын кейбір жеке ақпараттарыңыз болуы мүмкін."</string>
<string name="sendText" msgid="5209874571959469142">"Мәтін үшін әрекет таңдау"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ашық Wi‑Fi желісіне қосылу"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Оператордың Wi‑Fi желісіне қосылу"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ашық Wi‑Fi желісіне қосылуда"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi желісіне қосылды"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi желісіне қосылмады"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Барлық желілерді көру үшін түртіңіз"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Қосылу"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Барлық желілер"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Барлық желілер"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматты түрде қосылады"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Сақталған жоғары сапалы желіге жақын болғанда"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Қайта қоспау"</string>
@@ -1205,6 +1214,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Қайта бастау"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Мобильдік қызметті іске қосыңыз"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Жаңа SIM картасын іске қосу үшін оператор қолданбасын жүктеп алыңыз"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Жаңа SIM картасын іске қосу үшін <xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасын жүктеп алыңыз"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Қолданбаны жүктеп алу"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Жаңа SIM салынды"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Оны орнату үшін түртіңіз"</string>
@@ -1223,13 +1233,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP режимі USB арқылы қосылды"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB тетеринг режимі қосылды"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI режимі USB арқылы қосылды"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB жабдығы режимі қосылды"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB жабдығы жалғанған"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Қосымша опциялар үшін түртіңіз."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Жалғанған құрылғы зарядталуда. Қосымша параметрлер үшін түртіңіз."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Аналогтық аудиожабдық анықталды"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Жалғанған құрылғы бұл телефонмен үйлесімсіз. Қосымша ақпарат алу үшін түртіңіз."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB түзетуі қосылған"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB түзетуін өшіру үшін түртіңіз."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB арқылы түзетуді өшіру үшін түртіңіз"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB түзетуін өшіру үшін таңдаңыз."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Қате туралы есеп алынуда…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Қате туралы есепті бөлісу керек пе?"</string>
@@ -1248,7 +1258,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен шықты"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен көрсетіледі"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> деген пайдаланушының бұл функцияны пайдалануына жол бермеу үшін параметрлерді түртіп ашыңыз да, оларды өшіріңіз."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ӨШІРУ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Өшіру"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> дайындалуда"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Қателер тексерілуде"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Жаңа <xliff:g id="NAME">%s</xliff:g> анықталды"</string>
@@ -1334,14 +1344,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Әрқашан қосылған ВЖЖ жалғануда…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Әрқашан қосылған ВЖЖ жалғанған"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Әрқашан қосулы VPN желісінен ажырады"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Әрқашан қосылған ВЖЖ қателігі"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Әрқашан қосулы VPN желісіне қосылу мүмкін емес"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Желіні не VPN параметрлерін өзгерту"</string>
<string name="upload_file" msgid="2897957172366730416">"Файлды таңдау"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ешқандай файл таңдалмаған"</string>
<string name="reset" msgid="2448168080964209908">"Қайта реттеу"</string>
<string name="submit" msgid="1602335572089911941">"Жіберу"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Автокөлік режимі қосылған"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Автокөлік режимінен шығу үшін түртіңіз."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Көлік жүргізу қолданбасы қосулы"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Көлік жүргізу қолданбасынан шығу үшін түртіңіз."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Тетеринг немесе хотспот қосулы"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Реттеу үшін түртіңіз."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Тетеринг өшірілді"</string>
@@ -1419,22 +1429,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB дискі"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB жады"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Өзгерту"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Деректер трафигі туралы ескерту"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Трафик пен параметрлерді көру үшін түртіңіз."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G деректер шегіне жеттіңіз"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G деректер шегіне жеттіңіз"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Деректердің пайдаланылуы туралы ескерту"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Деректің <xliff:g id="APP">%s</xliff:g> пайдаландыңыз"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Мобильдік деректер шегіне жетті"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi деректер шегіне жеттіңіз"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Дерек тасымалы кідіртілді"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2Г-3Г дерекқор шектеуінен асып кетті"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4Ш дерекқор шектеуінен асып кетті"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Ұялы дерекқор шектеуінен асып кетті"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi дерекқор шектеуінен асып кетті"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Анықталған уақтыттан <xliff:g id="SIZE">%s</xliff:g> асты."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Деректер жіберу қалған цикл үшін тоқтатылды"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Мобильдік дерек шегінен астыңыз"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi деректер шегінен астыңыз"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Сіз <xliff:g id="SIZE">%s</xliff:g> шегінен асып кеттіңіз"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Фондық деректер шектелген"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Шектеуді жою үшін түртіңіз."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Шамадан тыс деректер трафигі"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Соңғы бірнеше күнде деректер трафигі әдеттегіден көп. Оның пайдаланылуы мен параметрлерін көру үшін түртіңіз."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Мобильдік деректер көп жұмсалды"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Қолданбаларыңыз деректерді әдеттегіден көбірек пайдаланды"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> қолданбасы деректерді әдеттегіден көбірек пайдаланды"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Қауіпсіздік сертификаты"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Бұл сертификат жарамды."</string>
<string name="issued_to" msgid="454239480274921032">"Кімге берілген:"</string>
@@ -1670,7 +1677,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Әкімші орнатқан"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Әкімші жаңартқан"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Әкімші жойған"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Батареяның қызмет көрсету мерзімін жақсарту үшін Battery Saver функциясы құрылғының жұмыс өнімділігін төмендетеді, сондай-ақ дірілді, орынды анықтау қызметтерін және фондық деректердің көбін шектейді. Электрондық пошта, хабар алмасу және синхрондауға негізделген басқа қолданбалар ашқанша жаңартылмауы мүмкін.\n\nҚұрылғы зарядталып жатқанда, Battery Saver функциясы автоматты түрде өшеді."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Деректердің пайдаланылуын азайту үшін Трафикті үнемдеу функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге немесе қабылдауға жол бермейді. Қазір қолданылып жатқан қолданба деректерді пайдалануы мүмкін, бірақ жиі емес. Мысалы, кескіндер оларды түрткенге дейін көрсетілмейді."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Data Saver функциясын қосу керек пе?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Қосу"</string>
@@ -1682,9 +1690,9 @@
<item quantity="other">%1$d минут (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> дейін)</item>
<item quantity="one">1 минут (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> дейін)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d сағат бойы (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> дейін)</item>
- <item quantity="one">Бір сағат бойы (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> дейін)</item>
+ <item quantity="one">1 сағат бойы (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> дейін)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d сағат (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> дейін)</item>
@@ -1698,9 +1706,9 @@
<item quantity="other">%d минут</item>
<item quantity="one">1 минут</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d сағат бойы</item>
- <item quantity="one">Бір сағат бойы</item>
+ <item quantity="one">1 сағат бойы</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d сағат</item>
@@ -1721,14 +1729,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> үнін өшірген"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD сұрауы DIAL сұрауына өзгертілді."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD сұрауы SS сұрауына өзгертілді."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD сұрауы жаңа USSD сұрауына өзгертілді."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD сұрауы бейне DIAL сұрауына өзгертілді."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS сұрауы DIAL сұрауына өзгертілді."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS сұрауы бейне DIAL сұрауына өзгертілді."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS сұрауы USSD сұрауына өзгертілді."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS сұрауы жаңа SS сұрауына өзгертілді."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Жұмыс профилі"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Жаю"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Жию"</string>
@@ -1838,7 +1854,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Зиянды қолданба анықталды"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> қолданбасы <xliff:g id="APP_2">%2$s</xliff:g> қолданбасының үзінділерін көрсеткісі келеді"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Өзгерту"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Қоңыраулар мен хабарландырулардың вибрациясы болады"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Қоңыраулар мен хабарландырулардың дыбыстық сигналы өшіріледі"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Жүйе өзгерістері"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"\"Мазаламау\" режимі"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Көңіліңізді бөлмеу үшін \"Мазаламау\" режимі хабарландыруларды жасырады"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Бұл – жаңа параметр. Оны өзгерту үшін түртіңіз."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Мазаламау\" режимі өзгерді"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Түймені түртіп, кедергі жасалған кезде орындалатын әрекет параметрлерін тексеріңіз"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Түймені түртіп, неге тыйым салынатынын көріңіз."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Жүйе"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Параметрлер"</string>
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 1e65a76157d3..0754b2f3ca4c 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"មិន​បាន​ដាក់កម្រិត​លំនាំដើម​លេខ​សម្គាល់​អ្នក​ហៅ។ ការ​ហៅ​បន្ទាប់៖ មិន​បាន​ដាក់​កម្រិត។"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"មិន​បាន​ផ្ដល់​សេវាកម្ម។"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"អ្នក​មិន​អាច​ប្ដូរ​ការ​កំណត់​លេខ​សម្គាល់​អ្នក​ហៅ​បានទេ។"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"គ្មាន​សេវាកម្ម​ទិន្នន័យ​ទេ"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"មិនមាន​ការហៅបន្ទាន់ទេ"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"គ្មាន​​សេវាកម្ម​ទិន្នន័យ​ចល័ត​ទេ"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"ការ​ហៅ​បន្ទាន់​មិន​អាច​ប្រើ​បាន​ទេ"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"គ្មាន​សេវាកម្ម​ជា​សំឡេង​ទេ"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"គ្មាន​សេវាកម្ម​សំឡេង/សង្រ្គោះបន្ទាន់​ទេ"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"​មិន​បាន​ផ្តល់​ជូន​ដោយ​បណ្តាញចល័តនៅ​ទីកន្លែងរបស់អ្នកជា​បណ្តោះ​អាសន្ន"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"មិន​អាច​ភ្ជាប់​ទៅ​បណ្តាញ​បានទេ​"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"ដើម្បី​ធ្វើ​ឱ្យ​ការ​ទទួល​រលក​សញ្ញា​ប្រសើរ​ជាងមុន សូម​សាកល្បង​ប្តូរ​ប្រភេទ​ដែល​បាន​ជ្រើសរើស​នៅការ​កំណត់ &gt; បណ្តាញ និង​អ៊ីនធឺណិត &gt; បណ្តាញ​ទូរសព្ទ​ចល័ត &gt; ប្រភេទ​បណ្តាញ​ដែល​ចង់​ប្រើ។"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"ការហៅតាម Wi-Fi បានបើក"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"ការហៅ​បន្ទាន់​តម្រូវឲ្យ​មានបណ្ដាញ​ទូរសព្ទ​ចល័ត។"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"គ្មាន​សេវាកម្ម​សំឡេង ឬការ​ហៅ​បន្ទាន់​ទេ"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"បិទ​ដោយ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​របស់អ្នក​ជាបណ្តោះ​អាសន្ន"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"មិន​អាច​ភ្ជាប់​បណ្ដាញ​ទូរសព្ទ​ចល័តបានទេ"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"សាកល្បង​ប្ដូរ​ទៅបណ្ដាញ​ដែល​ចង់ប្រើ។ សូមចុច​ដើម្បីផ្លាស់​ប្ដូរ។"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"មិន​អាច​ប្រើ​ការ​ហៅ​បន្ទាន់​បានទេ"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"មិន​អាចធ្វើការ​ហៅ​បន្ទាន់​តាម Wi‑Fi បានទេ"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ការជូនដំណឹង"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ការបញ្ជូន​ការហៅ​ទូរសព្ទ​បន្ត"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"មុខងារ​ហៅត្រឡប់​វិញ​បន្ទាន់"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"បើក​បដា​រ៉ូមីង"</string>
<string name="roamingText12" msgid="1189071119992726320">"បិទ​បដា​រ៉ូមីង"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"​ស្វែង​រក​សេវាកម្ម"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ការហៅតាម Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ដើម្បីហៅទូរសព្ទ និងផ្ញើសារតាម Wi-Fi អ្នកត្រូវស្នើឲ្យក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នកដំឡើងសេវាកម្មនេះជាមុនសិន។ បន្ទាប់មកបើកការហៅតាម Wi-Fi ម្តងទៀតនៅក្នុងការកំណត់។ (លេខកូដបញ្ហា៖ <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"ចុះឈ្មោះ​ជាមួយ​ក្រុមហ៊ុន​បម្រើសេវា​ទូរសព្ទរបស់អ្នក (លេខកូដ​មានបញ្ហា៖ <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"ការហៅតាមរយៈ Wi-Fi %s"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"កំពុង​ដំណើរការ​សំណើ​​​ច្រើន​ពេក។ ព្យាយាម​ម្ដង​ទៀត​ពេល​ក្រោយ។"</string>
<string name="notification_title" msgid="8967710025036163822">"កំហុស​ក្នុង​ការ​ចូល​សម្រាប់ <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ធ្វើ​សម​កាល​កម្ម"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ធ្វើ​សម​កាល​កម្ម"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"មាន​ការ​លុប <xliff:g id="CONTENT_TYPE">%s</xliff:g> ច្រើន​ពេក។"</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ឧបករណ៍​ផ្ទុក​នៃ​​កុំព្យូទ័រ​បន្ទះ​ពេញ។ លុប​ឯកសារ​មួយ​ចំនួន​។"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ឧបករណ៍​របស់​នាឡិកា​ពេញ។ លុប​ឯកសារ​មួយ​ចំនួន​។"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ឧបករណ៍ផ្ទុកទិន្នន័យទូរទស្សន៍ពេញហើយ។ លុបឯកសារមួយចំនួនដើម្បីឲ្យមានចន្លោះទំនេរ។"</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"ដោយអ្នក​គ្រប់គ្រង​កម្រងព័ត៌មាន​ការងារ​របស់​អ្នក"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"ដោយ <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ប្រវត្តិរូបការងារត្រូវបានលុប"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"កម្រងព័ត៌មាន​ការងារ​ត្រូវបាន​លុប​ដោយសារ​បាត់​កម្មវិធី​អ្នកគ្រប់គ្រង"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"កម្មវិធី​អ្នកគ្រប់គ្រង​កម្រងព័ត៌មាន​ការងារនេះ​អាច​បាត់ ឬ​មាន​បញ្ហា។ ដូច្នេះហើយ​ទើប​កម្រងព័ត៌មាន​ការងារ​របស់អ្នក និង​ទិន្នន័យ​ដែល​ពាក់ព័ន្ធត្រូវ​បានលុប។ សូមទាក់ទង​ទៅអ្នក​គ្រប់គ្រង​របស់អ្នក ដើម្បី​ទទួល​បាន​ជំនួយ។"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"កម្រងព័ត៌មាន​ការងារ​របស់អ្នក​លែងមាន​នៅលើ​ឧបករណ៍​នេះទៀត​ហើយ"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"ការព្យាយាមបញ្ចូលពាក្យសម្ងាត់ច្រើនដងពេកហើយ"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"ឧបករណ៍ស្ថិតក្រោមការគ្រប់គ្រង"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"ស្ថាប័នរបស់អ្នកគ្រប់គ្រងឧបករណ៍នេះ ហើយអាចនឹងតាមដានចរាចរណ៍បណ្តាញ។ ចុចដើម្បីទទួលបានព័ត៌មានលម្អិត។"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"ឧបករណ៍របស់អ្នកនឹងត្រូវបានលុប"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"​មិនអាច​ប្រើ​កម្មវិធី​អ្នកគ្រប់គ្រង​បានទេ។ ឧបករណ៍​របស់អ្នក​នឹងត្រូវ​បានលុប​ឥឡូវនេះ។\n\nប្រសិនបើ​អ្នកមាន​សំណួរ សូមទាក់ទង​ទៅអ្នក​គ្រប់គ្រង​ស្ថាប័ន​របស់​អ្នក។"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"មិនអាច​ប្រើ​កម្មវិធី​អ្នកគ្រប់គ្រង​បានទេ។ ឧបករណ៍​របស់អ្នក​នឹងលុប​ឥឡូវនេះ។\n\nប្រសិនបើ​អ្នកមាន​សំណួរផ្សេងៗ​ សូមទាក់ទង​ទៅអ្នក​គ្រប់គ្រង​ស្ថាប័ន​របស់​អ្នក។"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"ការបោះពុម្ព​ត្រូវបាន​បិទ​ដោយ <xliff:g id="OWNER_APP">%s</xliff:g> ។"</string>
<string name="me" msgid="6545696007631404292">"ខ្ញុំ"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ជម្រើស​កុំព្យូទ័រ​បន្ទះ"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ពេល​ជិះ​យន្តហោះ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"បាន​បើក​របៀប​ពេល​ជិះ​យន្ត​ហោះ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បាន​បិទ​របៀបពេលជិះ​យន្តហោះ​"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"កម្មវិធី​សន្សំ​ថ្ម"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"កម្មវិធី​សន្សំ​ថ្ម​បាន​បិទ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"កម្មវិធី​សន្សំថ្មបាន​បើក"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ការ​កំណត់"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ជំនួយ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ជំនួយសម្លេង"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ប្តូរ​ទៅ​កម្រង​ព័ត៌មាន​ការងារ"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ទំនាក់ទំនង"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ចូលប្រើទំនាក់ទំនងរបស់អ្នក"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"អនុញ្ញាតឲ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​ទំនាក់ទំនង​របស់អ្នក"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"ទីតាំង"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ចូលដំណើរការទីតាំងរបស់ឧបករណ៍នេះ"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"អនុញ្ញាតឲ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​ទីតាំងនៃឧបករណ៍នេះ"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ប្រតិទិន"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ចូលប្រើប្រិតិទិនរបស់អ្នក"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"អនុញ្ញាតឲ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​ប្រតិទិនរបស់អ្នក"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"សារ SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"ផ្ញើ និងមើលសារ SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"អនុញ្ញាតឲ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ផ្ញើ និង​មើលសារ SMS"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"ការ​ផ្ទុក"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ចូលដំណើការរូបភាព មេឌៀ និងឯកសារនៅលើឧបករណ៍របស់អ្នក"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"អនុញ្ញាតឲ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​រូបថត មេឌៀ និងឯកសារនៅលើ​ឧបករណ៍របស់អ្នក"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"មីក្រូ​ហ្វូន"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ថតសំឡេង"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"អនុញ្ញាតឲ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ថតសំឡេង"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"កាមេរ៉ា"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ថតរូប និងថតវីដេអូ"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"អនុញ្ញាតឲ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ថតរូប និងថត​វីដេអូ"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"ទូរសព្ទ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ហៅទូរស័ព្ទ និងគ្រប់គ្រងការហៅទូរស័ព្ទ"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"អនុញ្ញាតឲ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ធ្វើការហៅ និង​គ្រប់គ្រងការហៅ​ទូរសព្ទ"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"ឧបករណ៍ចាប់សញ្ញារាងកាយ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ចូលដំណើរការទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"អនុញ្ញាតឲ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​ទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីសញ្ញាសំខាន់ៗរបស់អ្នក"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ទាញយក​មាតិកា​វិនដូ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ពិនិត្យ​មាតិកាវិនដូ​ដែល​អ្នក​កំពុង​ទាក់ទង​ជា​មួយ។"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"បើក​ការ​រក​មើល​​ដោយ​ប៉ះ"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ធ្វើកាយវិការ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"អាចប៉ះ អូស ច្បិច និងធ្វើកាយវិការផ្សេងទៀត"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ចលនា​ស្នាមម្រាមដៃ"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"អាចថត​ចលនា​ដែលមាន​សកម្មភាព​នៅលើ​ឧបករណ៍​ចាប់​ស្នាម​ម្រាមដៃ​របស់ឧបករណ៍។"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"អាចថត​ចលនា​ដែលមាន​សកម្មភាព​នៅលើ​ឧបករណ៍​ចាប់​ស្នាម​ម្រាមដៃ​របស់ឧបករណ៍បាន។"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"បិទ ឬ​កែ​របារ​ស្ថានភាព"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ឲ្យ​កម្មវិធី​បិទ​របារ​ស្ថានភាព ឬ​បន្ថែម និង​លុប​រូប​តំណាង​ប្រព័ន្ធ។"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ធ្វើជារបារស្ថានភាព"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ឲ្យ​កម្មវិធី​ធ្វើជា​ផ្នែក​​ស្ថិតស្ថេរ​ដោយ​ខ្លួន​ឯង​ក្នុង​អង្គ​ចងចាំ។ វា​អាច​កំណត់​អង្គ​ចងចាំ​ដែល​អាច​ប្រើ​បាន​ចំពោះ​កម្មវិធី​ផ្សេងៗ​ ដោយ​ធ្វើឲ្យ​កុំព្យូទ័រ​បន្ទះ​យឺត។"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"អនុញ្ញាតឲ្យកម្មវិធីធ្វើឲ្យផ្នែកមួយចំនួនរបស់វាបន្តនៅក្នុងមេម៉ូរី។ វាអាចកម្រិតមេម៉ូរីដែលមានសម្រាប់កម្មវិធីផ្សេងទៀត ដែលធ្វើឲ្យទូរទស្សន៍ដើរយឺត។"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ឲ្យ​កម្មវិធី ធ្វើជា​ផ្នែក​អចិន្ត្រៃយ៍​នៃ​ខ្លួន​ក្នុង​អង្គ​ចងចាំ។ វា​អាច​កម្រិត​អង្គ​ចងចាំ​អាច​ប្រើ​បាន​ ដើម្បី​ធ្វើ​ឲ្យ​កម្មវិធី​ផ្សេង​ធ្វើ​ឲ្យ​ទូរស័ព្ទ​របស់​អ្នក​យឺត។​"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ដំណើរ​ការ​សេវាកម្ម​ផ្ទៃ​ខាង​មុខ"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"អនុញ្ញាត​ឱ្យ​កម្មវិធី​ប្រើ​ប្រាស់​សេវាកម្ម​ផ្ទៃខាង​មុខ។"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"វាស់​ទំហំ​ការ​ផ្ទុក​​កម្មវិធី"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"ឲ្យ​កម្មវិធី​ទៅ​យក​កូដ ទិន្នន័យ និង​ទំហំ​ឃ្លាំង​សម្ងាត់​របស់​វា"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"កែ​​ការ​កំណត់​ប្រព័ន្ធ"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"លំនាំ​ដោះ​សោ​។"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ដោះ​សោ​តាម​​ទម្រង់​មុខ។"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"កូដ PIN ដោះ​សោ។"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"ដោះ​កូដ Pin របស់​សីុម។"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"ដោះ​កូដ Puk របស់​សីុម។"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ពាក្យ​សម្ងាត់​ដោះ​សោ​។"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ផ្ទៃ​លំនាំ។"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ផ្ទៃ​រុញ។"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"បាន​ចម្លង​អត្ថបទ​ទៅ​ក្ដារ​តម្បៀត​ខ្ទាស់។"</string>
<string name="more_item_label" msgid="4650918923083320495">"ច្រើន​ទៀត"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"ម៉ឺនុយ +"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"ដកឃ្លា"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"លុប​"</string>
@@ -1076,31 +1098,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"រក​មើល​កំណែ​ថ្មី"</string>
<string name="smv_application" msgid="3307209192155442829">"កម្មវិធី <xliff:g id="APPLICATION">%1$s</xliff:g> (ដំណើរការ <xliff:g id="PROCESS">%2$s</xliff:g>) បាន​បំពាន​គោលនយោបាយ​របៀប​តឹងរ៉ឹង​អនុវត្ត​ដោយ​ខ្លួន​​ឯង។"</string>
<string name="smv_process" msgid="5120397012047462446">"ដំណើរការ <xliff:g id="PROCESS">%1$s</xliff:g> បាន​បំពាន​គោលនយោបាយ​​របៀប​​តឹង​រឹង​​​បង្ខំ​ដោយ​ខ្លួន​ឯង"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android កំពុង​ធ្វើ​បច្ចុប្បន្នភាព..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android កំពុង​ចាប់ផ្ដើម…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ទូរសព្ទ​កំពុង​ដំឡើងជំនាន់…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ថេប្លេត​កំពុង​ដំឡើងជំនាន់…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"ឧបករណ៍​កំពុង​ដំឡើងជំនាន់…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ទូរសព្ទ​កំពុង​ចាប់ផ្ដើម…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ថេប្លេត​កំពុង​ចាប់ផ្ដើម…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"ឧបករណ៍​កំពុង​ចាប់ផ្ដើម…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"កំពុងធ្វើឲ្យឧបករណ៍ផ្ទុកមានប្រសិទ្ធភាព។"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"កំពុងបញ្ចប់ការអាប់ដេត Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"កម្មវិធីមួយចំនួនអាចនឹងមិនដំណើរការប្រក្រតីនោះទេ រហូតដល់ការអាប់គ្រេតបញ្ចប់"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"កំពុងបញ្ចប់​បច្ចុប្បន្នភាព​ប្រព័ន្ធ…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> អាប់គ្រេត…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"ធ្វើ​ឲ្យ​កម្មវិធី​ប្រសើរ​ឡើង <xliff:g id="NUMBER_0">%1$d</xliff:g> នៃ <xliff:g id="NUMBER_1">%2$d</xliff:g> ។"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"កំពុងរៀបចំ <xliff:g id="APPNAME">%1$s</xliff:g>។"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ចាប់ផ្ដើម​កម្មវិធី។"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"បញ្ចប់​ការ​ចាប់ផ្ដើម។"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> កំពុង​ដំណើរការ"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"ចុច​ដើម្បី​ត្រឡប់​ទៅ​ហ្គេមវិញ"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ជ្រើសរើស​ហ្គេម"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"ដើម្បី​ធ្វើឱ្យ​ប្រតិបត្តិការ​ប្រសើរជាងមុន អ្នក​អាចបើក​ហ្គេម​​បាន​​ម្តង​មួយ​តែប៉ុណ្ណោះ។"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"ត្រឡប់​ទៅ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"បើក <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> នឹង​បិទ​ដោយ​មិន​រក្សាទុក"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> លើសពីកម្រិតកំណត់មេម៉ូរី"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump ត្រូវបានប្រមូល សូមប៉ះដើម្បីចែករំលែក"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"ចែករំលែក heap dump?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"ដំណើរការ <xliff:g id="PROC">%1$s</xliff:g> បានលើសកម្រិតកំណត់មេម៉ូរីរបស់វាដែលមានទំហំ <xliff:g id="SIZE">%2$s</xliff:g>។ Heap dump មានផ្តល់ជូនដល់អ្នកដើម្បីចែករំលែកជាមួយអ្នកអភិវឌ្ឍន៍របស់វា។ ត្រូវប្រុងប្រយ័ត្ន៖ Heap dump នេះអាចផ្ទុកព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នកណាមួយ ដែលកម្មវិធីអាចចូលប្រើបាន។"</string>
<string name="sendText" msgid="5209874571959469142">"ជ្រើស​សកម្មភាព​សម្រាប់​អត្ថបទ"</string>
@@ -1135,12 +1155,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ភ្ជាប់ទៅបណ្តាញ Wi‑Fi ចំហ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ភ្ជាប់​បណ្តាញ Wi‑Fi របស់​ក្រុមហ៊ុន​សេវាទូរសព្ទ"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"កំពុងភ្ជាប់ទៅបណ្តាញ Wi‑Fi ចំហ"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"បានភ្ជាប់ទៅបណ្តាញ Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"មិនអាចភ្ជាប់ទៅបណ្តាញ Wi‑Fi បានទេ"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ចុចដើម្បីមើលបណ្តាញទាំងអស់"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ភ្ជាប់"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"បណ្តាញទាំងអស់"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"បណ្ដាញ​ទាំងអស់"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi នឹង​បើក​ដោយ​ស្វ័យប្រវត្តិ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"នៅពេល​ដែល​អ្នក​នៅ​ជិត​បណ្តាញ​គុណភាព​ខ្ពស់​ដែល​បាន​រក្សាទុក"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"កុំ​បើក​ឡើង​វិញ"</string>
@@ -1206,6 +1227,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"ចាប់ផ្ដើម​ឡើងវិញ"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"បើក​ដំណើរការ​សេវាកម្ម​ទូរសព្ទ​ចល័ត"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ទាញយក​កម្មវិធី​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ ដើម្បី​បើក​ដំណើរការ​សីុមថ្មី​របស់អ្នក"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"ទាញយក​កម្មវិធី <xliff:g id="APP_NAME">%1$s</xliff:g> ដើម្បី​បើកដំណើរការ​សីុមថ្មី​របស់អ្នក"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ទាញយក​កម្មវិធី"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ស៊ីមកាតថ្មីត្រូវបានស៊កចូល"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ប៉ះដើម្បីដំឡើង"</string>
@@ -1224,13 +1246,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"មុខងារ PTP តាម​ USB ត្រូវបានបើក"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"ការភ្ជាប់តាម USB ត្រូវបានបើក"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"មុខងារ​ MIDI តាម USB ត្រូវបានបើក"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"មុខងារ​គ្រឿងបរិក្ខារ USB ត្រូវបានបើក"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"បាន​ភ្ជាប់​ជាមួយ​គ្រឿង​បរិក្ខារ USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ប៉ះសម្រាប់ជម្រើសជាច្រើនទៀត"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"កំពុងសាកថ្ម​ឧបករណ៍​ដែលបានភ្ជាប់។ សូមចុចសម្រាប់​ជម្រើសបន្ថែម។"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"បាន​រកឃើញ​គ្រឿង​បរិក្ខារ​សំឡេង​អាណាឡូក"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ឧបករណ៍​ដែលភ្ជាប់​មក​ជាមួយ​មិនត្រូវគ្នា​ជាមួយ​ទូរសព្ទ​នេះទេ។ ចុច​ដើម្បី​ស្វែងយល់​បន្ថែម។"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"បាន​ភ្ជាប់​ការ​កែ​កំហុស​ USB"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"ប៉ះដើម្បីបិទដំណើរការកែកំហុស USB"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"សូមចុច​ដើម្បី​បិទ​ការជួសជុល ​USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ជ្រើស​ ដើម្បី​បិទ​ការ​កែ​កំហុស​យូអេសប៊ី។"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"កំពុងទទួលយករបាយការណ៍កំហុស…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ចែករំលែករបាយការណ៍កំហុសឬ?"</string>
@@ -1249,7 +1271,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> កំពុង​បង្ហាញពីលើ​កម្មវិធី​ផ្សេង​ទៀត"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> កំពុង​បង្ហាញ​ពីលើ​កម្មវិធី​ផ្សេង​ទៀត"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ប្រសិនបើ​អ្នក​មិន​ចង់​ឲ្យ <xliff:g id="NAME">%s</xliff:g> ប្រើ​មុខងារ​នេះ​ទេ សូមចុច​ដើម្បី​បើក​ការកំណត់ រួច​បិទ​វា។"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"បិទ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"បិទ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"កំពុងរៀបចំ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"កំពុងពិនិត្យរកកំហុស"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"បានរកឃើញ <xliff:g id="NAME">%s</xliff:g> ថ្មី"</string>
@@ -1335,14 +1357,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"បើក​ការ​តភ្ជាប់ VPN ជា​និច្ច..។"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ភ្ជាប់ VPN ជា​និច្ច"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"បានផ្ដាច់ពី VPN បើកជានិច្ច"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"បើក​កំហុស VPN ជា​និច្ច"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"ប្ដូរការកំណត់បណ្ដាញ ឬការកំណត់ VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"ជ្រើស​​ឯកសារ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"គ្មាន​ឯកសារ​បាន​ជ្រើស"</string>
<string name="reset" msgid="2448168080964209908">"កំណត់​ឡើងវិញ"</string>
<string name="submit" msgid="1602335572089911941">"ដាក់​ស្នើ"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"បាន​បើក​របៀប​រថយន្ត​"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"ប៉ះដើម្បីចាកចេញពីរបៀបរថយន្ត"</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"ភ្ជាប់ ឬ​ហតស្ពត​សកម្ម"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ប៉ះដើម្បីកំណត់"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ការភ្ជាប់​ត្រូវបានបិទ"</string>
@@ -1420,22 +1445,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"ឧបករណ៍ផ្ទុក USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"ឧបករណ៍​ផ្ទុក​យូអេសប៊ី"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"កែសម្រួល​"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"ការព្រមានអំពីការប្រើទិន្នន័យ"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"ប៉ះដើម្បីមើលការប្រើប្រាស់ និងការកំណត់"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"បាន​ដល់​ដែន​កំណត់​ទិន្នន័យ 2G-3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"បាន​ដល់​ដែន​កំណត់​ទិន្នន័យ 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ការព្រមានពីការប្រើទិន្នន័យ"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"អ្នកបានប្រើ​ទិន្នន័យអស់ <xliff:g id="APP">%s</xliff:g>"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"បានឈានដល់ចំនួនកម្រិតនៃទិន្នន័យទូរសព្ទចល័តហើយ"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"បានដល់ដែន​កំណត់ទិន្នន័យវ៉ាយហ្វាយ"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"ផ្អាកទិន្នន័យសម្រាប់រយៈពេលនៅសល់"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"លើស​ដែន​កំណត់​ទិន្នន័យ 2G​-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"បាន​លើស​ដែន​កំណត់​ទិន្នន័យ 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"បាន​លើស​ដែន​កំណត់​ទិន្នន័យ​ចល័ត"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"លើស​ដែន​កំណត់​ទិន្នន័យ​វ៉ាយហ្វាយ"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> លើ​ដែន​កំណត់​បាន​បញ្ជាក់។"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"ទិន្នន័យ​បានផ្អាកសម្រាប់​ផ្នែកដែលនៅ​សល់នៃ​វដ្តរបស់អ្នក"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"លើសកម្រិតកំណត់​ទិន្នន័យ​ទូរសព្ទ​របស់អ្នក"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"លើស​កម្រិត​កំណត់​ទិន្នន័យ Wi-Fi របស់អ្នក"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"អ្នកបាន​ប្រើទិន្នន័យ​ <xliff:g id="SIZE">%s</xliff:g> លើសកម្រិត​កំណត់​របស់អ្នក"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"បាន​ដាក់​កម្រិត​ទិន្នន័យ​ផ្ទៃ​ខាង​ក្រោយ"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"ប៉ះដើម្បីយកការរឹតបន្តឹងចេញ"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"ការប្រើ​ទិន្នន័យ​ច្រើន"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"ការប្រើ​ទិន្នន័យ​របស់អ្នក​ក្នុងរយៈពេល​ពីរបី​ថ្ងៃ​ចុងក្រោយ​គឺច្រើន​ជាង​ធម្មតា។ សូមចុចដើម្បី​មើល​ការប្រើប្រាស់ និង​ការកំណត់។"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ការប្រើទិន្នន័យ​ទូរសព្ទ​ចល័តច្រើន"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"កម្មវិធី​របស់អ្នក​បានប្រើ​ទិន្នន័យ​ច្រើនជាង​ធម្មតា"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> បានប្រើ​ទិន្នន័យ​ច្រើនជាង​ធម្មតា"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"វិញ្ញាបនបត្រ​សុវត្ថិភាព"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"វិញ្ញាបនបត្រ​នេះ​​​​ត្រឹមត្រូវ​។"</string>
<string name="issued_to" msgid="454239480274921032">"បាន​ចេញ​ឲ្យ​៖"</string>
@@ -1671,7 +1693,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"​ដំឡើង​ដោយ​អ្នកគ្រប់គ្រង​របស់​អ្នក"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ធ្វើ​បច្ចុប្បន្នភាព​ដោយ​អ្នកគ្រប់គ្រង​របស់​អ្នក"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"លុប​ដោយ​អ្នកគ្រប់គ្រង​របស់​អ្នក"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"ដើម្បី​ជួយ​ឱ្យ​កម្រិត​ថាមពល​ថ្ម​ប្រសើរឡើង កម្មវិធី​សន្សំថ្ម​កាត់បន្ថយ​ប្រតិបត្តិការ​ឧបករណ៍​របស់អ្នក និងកម្រិត​ការញ័រ សេវាកម្មទីតាំង និងទិន្នន័យ​ផ្ទៃខាងក្រោយ​ភាគច្រើន។ អ៊ីមែល ការផ្ញើសារ និងកម្មវិធី​ផ្សេងទៀត​ដែលពឹងផ្អែក​លើការ​ធ្វើ​សមកាលកម្ម​មិនអាច​​ដំឡើង​ជំនាន់បានទេ ប្រសិនបើ​អ្នក​មិនបើក​ពួកវា។\n\nកម្មវិធី​សន្សំ​ថ្ម​បិទ​ដោយ​ស្វ័យប្រវត្តិ នៅពេលដែល​ឧបករណ៍​របស់អ្នក​កំពុងសាកថ្ម។"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ដើម្បីជួយកាត់បន្ថយការប្រើប្រាស់ទិន្នន័យ កម្មវិធីសន្សំសំចៃទិន្នន័យរារាំងកម្មវិធីមួយចំនួនមិនឲ្យបញ្ជូន ឬទទួលទិន្នន័យនៅផ្ទៃខាងក្រោយទេ។ កម្មវិធីដែលអ្នកកំពុងប្រើនាពេលបច្ចុប្បន្នអាចចូលប្រើប្រាស់​ទិន្នន័យបាន ប៉ុន្តែអាចនឹងមិនញឹកញាប់ដូចមុនទេ។ ឧទាហរណ៍ រូបភាពមិនបង្ហាញទេ លុះត្រាតែអ្នកប៉ះរូបភាពទាំងនោះ។"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"បើកកម្មវិធីសន្សំសំចៃទិន្នន័យឬ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"បើក"</string>
@@ -1683,9 +1706,9 @@
<item quantity="other">អស់រយៈពេល %1$d នាទី (រហូតដល់ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">អស់រយៈពេល 1 នាទី (រហូតដល់ <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">រយៈពេល %1$d ម៉ោង (រហូតដល់ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">រយៈពេលមួយម៉ោង (រហូតដល់ <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">រយៈ​ពេល %1$d ម៉ោង (រហូត​ដល់ម៉ោង <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">រយៈ​ពេល 1 ម៉ោង (រហូត​ដល់ម៉ោង <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">អស់រយៈពេល %1$d ម៉ោង (រហូតដល់ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1699,9 +1722,9 @@
<item quantity="other">អស់រយៈពេល %d នាទី</item>
<item quantity="one">អស់រយៈពេល 1 នាទី</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">រយៈពេល %d ម៉ោង</item>
- <item quantity="one">រយៈពេលមួយម៉ោង</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">រយៈ​ពេល %d ម៉ោង</item>
+ <item quantity="one">រយៈ​ពេល 1 ម៉ោង</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">អស់រយៈពេល %d ម៉ោង</item>
@@ -1722,14 +1745,22 @@
<string name="muted_by" msgid="6147073845094180001">"បាន​បិទ​សំឡេង​ដោយ <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ហើយវាអ្នកមិនមានស្ថេរភាព រហូតទាល់តែអ្នកកំណត់ដូចដើមវិញទាំងស្រុង។"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ទំនាក់ទំនងក្រុមហ៊ុនផលិតឧបករណ៍របស់អ្នកសម្រាប់ព័ត៌មានបន្ថែម។"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"សំណើរ USSD ត្រូវបានកែសម្រួលទៅតាមសំណើរការហៅទូរស័ព្ទ។"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"សំណើរ USSD ត្រូវបានកែសម្រួលទៅតាមសំណើរ SS។"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"សំណើរ USSD ត្រូវបានកែសម្រួលទៅតាមសំណើរ USSD ថ្មី។្"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"សំណើ USSD ត្រូវបានកែប្រែទៅជាសំណើ DIAL ជាវីដេអូ។"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"សំណើរ SS ត្រូវបានកែសម្រួលទៅតាមសំណើរការហៅទូរស័ព្ទ។"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"សំណើ SS ត្រូវបានកែប្រែទៅជាសំណើ DIAL ជាវីដេអូ។"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"សំណើរ SS ត្រូវបានកែសម្រួលទៅតាមសំណើរ USSD។"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"សំណើរ SS ត្រូវបានកែសម្រួលទៅតាមសំណើរ SS ថ្មី។"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ប្រវត្តិរូបការងារ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ពង្រីក"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"លាក់"</string>
@@ -1839,10 +1870,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"បាន​រកឃើញ​កម្មវិធី​ដែលបង្ក​គ្រោះថ្នាក់"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ចង់​បង្ហាញ​ស្ថិតិ​ប្រើប្រាស់​របស់ <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"កែសម្រួល"</string>
- <!-- no translation found for notification_channel_system_changes (5072715579030948646) -->
- <skip />
- <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) -->
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"ការហៅ​ទូរសព្ទ និងការជូន​ដំណឹងនឹងញ័រ"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ការហៅ​ទូរសព្ទ និងការជូន​ដំណឹងនឹង​បិទសំឡេង"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"ការផ្លាស់ប្ដូរ​ប្រព័ន្ធ"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"កុំ​រំខាន"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"មុខងារ​កុំរំខាន​កំពុងលាក់​ការជូនដំណឹង​ដើម្បីជួយ​អ្នកផ្តោត​អារម្មណ៍"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"នេះ​គឺជា​សកម្មភាព​ថ្មី។ សូមចុច​ដើម្បីផ្លាស់​ប្ដូរ។"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"មុខងារ​កុំ​រំខាន​ត្រូវ​បាន​ប្ដូរ"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"សូមចុច​ដើម្បី​មើល​ថា​​បានទប់ស្កាត់អ្វីខ្លះ។"</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
<skip />
- <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) -->
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
<skip />
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 1adc210df343..e5fde53a42f6 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ಕರೆಮಾಡುವವರ ID ಅನ್ನು ನಿರ್ಬಂಧಿಸದಿರುವಂತೆ ಡಿಫಾಲ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಮುಂದಿನ ಕರೆ: ನಿರ್ಬಂಧಿಸಲಾಗಿಲ್ಲ"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"ಸೇವೆಯನ್ನು ಪೂರೈಸಲಾಗಿಲ್ಲ."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"ನೀವು ಕಾಲರ್‌ ID ಸೆಟ್ಟಿಂಗ್‌ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ಡೇಟಾ ಸೇವೆ ಲಭ್ಯವಿಲ್ಲ"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"ಯಾವುದೇ ತುರ್ತು ಕರೆ ಮಾಡಲಾಗುವುದಿಲ್ಲ"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"ಮೊಬೈಲ್ ಡೇಟಾ ಸೇವೆಯಿಲ್ಲ"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"ತುರ್ತು ಕರೆ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ಧ್ವನಿ ಸೇವೆಯಿಲ್ಲ"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ಧ್ವನಿ/ತುರ್ತು ಸೇವೆ ಇಲ್ಲ"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"ತಾತ್ಕಾಲಿಕವಾಗಿ ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ನಿಂದ ನಿಮ್ಮ ಸ್ಥಳದಲ್ಲಿ ಒದಗಿಸುತ್ತಿಲ್ಲ"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ನೆಟ್‌ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕ ಪಡೆಯುವುದನ್ನು ಸುಧಾರಿಸಲು, ಆಯ್ಕೆ ಮಾಡಿರುವ ವಿಧವನ್ನು ಸೆಟ್ಟಿಂಗ್‌ಗಳು &gt; ನೆಟ್‌ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್ &gt; ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು &gt; ಆದ್ಯತೆಯ ನೆಟ್‌ವರ್ಕ್ ವಿಧದಲ್ಲಿ ಬದಲಿಸಿ ನೋಡಿ."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"ವೈ‑ಫೈ ಕರೆಮಾಡುವಿಕೆ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"ತುರ್ತು ಕರೆಗಳನ್ನು ಮಾಡಲು ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್ ಅಗತ್ಯವಿದೆ."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ಯಾವುದೇ ಧ್ವನಿ ಸೇವೆ ಅಥವಾ ತುರ್ತು ಕರೆಗಳಿಲ್ಲ"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"ನಿಮ್ಮ ವಾಹಕದ ಮೂಲಕ ತಾತ್ಕಾಲಿಕವಾಗಿ ಆಫ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ಮೊಬೈಲ್‌ ನೆಟ್‌ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ಆದ್ಯತೆಗೊಳಿಸಿದ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಪ್ರಯತ್ನಿಸಿ. ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ತುರ್ತು ಕರೆ ಮಾಡುವಿಕೆ ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"ವೈ-ಫೈ ಮೂಲಕ ತುರ್ತು ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ಎಚ್ಚರಿಕೆಗಳು"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ಕರೆ ಫಾರ್ವರ್ಡ್‌ ಮಾಡುವಿಕೆ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ತುರ್ತು ಕಾಲ್‌ಬ್ಯಾಕ್‌ ಮೋಡ್‌"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"ರೋಮಿಂಗ್ ಬ್ಯಾನರ್ ಆನ್ ಆಗಿದೆ"</string>
<string name="roamingText12" msgid="1189071119992726320">"ರೋಮಿಂಗ್ ಬ್ಯಾನರ್ ಆಫ್ ಆಗಿದೆ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ಸೇವೆ ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ವೈ-ಫೈ ಮೂಲಕ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು, ಈ ಸೇವೆಯನ್ನು ಹೊಂದಿಸಲು ಮೊದಲು ನಿಮ್ಮ ವಾಹಕವನ್ನು ಕೇಳಿ. ಆ ನಂತರ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ ವೈ-ಫೈ ಕರೆಮಾಡುವಿಕೆಯನ್ನು ಅನ್ನು ಆನ್ ಮಾಡಿ. (ದೋಷ ಕೋಡ್: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"ನಿಮ್ಮ ವಾಹಕದ ಜೊತೆಗೆ ನೋಂದಾಯಿಸಿಕೊಳ್ಳಿ (ದೋಷ ಕೋಡ್: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ಹಲವಾರು ವಿನಂತಿಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತಿದೆ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> ಗಾಗಿ ಸೈನ್ ಇನ್ ದೋಷವಿದೆ"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ಸಿಂಕ್ ಮಾಡು"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ಸಿಂಕ್ ಮಾಡು"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"ಹಲವಾರು <xliff:g id="CONTENT_TYPE">%s</xliff:g> ಅಳಿಸುವಿಕೆಗಳು."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ಟ್ಯಾಬ್ಲೆಟ್ ಸಂಗ್ರಹಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ. ಸ್ಥಳವನ್ನು ಖಾಲಿಯಾಗಿಸಲು ಕೆಲವು ಫೈಲ್‍‍ಗಳನ್ನು ಅಳಿಸಿ."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ವಾಚ್‌ ಸಂಗ್ರಹಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ. ಸ್ಥಳವನ್ನು ಖಾಲಿಯಾಗಿಸಲು ಕೆಲವು ಫೈಲ್‍‍ಗಳನ್ನು ಅಳಿಸಿ."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ಟಿವಿ ಸಂಗ್ರಹಣೆ ತುಂಬಿದೆ. ಸ್ಥಳವನ್ನು ಮುಕ್ತಗೊಳಿಸಲು ಕೆಲವು ಫೈಲ್‌ಗಳನ್ನು ಅಳಿಸಿ."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ನಿರ್ವಾಹಕರಿಂದ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ಪ್ರಕಾರ"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"ನಿರ್ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್‌ ತಪ್ಪಿಹೋಗಿರುವುದರಿಂದ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ನಿರ್ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ ಕಳೆದು ಹೋಗಿದೆ ಅಥವಾ ಹಾಳಾಗಿದೆ. ಇದರ ಪರಿಣಾಮವಾಗಿ ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಮತ್ತು ಅದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗಿದೆ. ಸಹಾಯಕ್ಕಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ಈ ಸಾಧನದಲ್ಲಿ ಈಗ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"ಹಲವಾರು ಪಾಸ್‌ವರ್ಡ್ ಪ್ರಯತ್ನಗಳು"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"ಸಾಧನವನ್ನು ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಈ ಸಾಧನವನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ ಮತ್ತು ಅದು ನೆಟ್‌ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಮೇಲೆ ಗಮನವಿರಿಸಬಹುದು. ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಇದೀಗ ಅಳಿಸಲಾಗುತ್ತದೆ.\n\nನಿಮ್ಮಲ್ಲಿ ಪ್ರಶ್ನೆಗಳಿದ್ದರೆ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಇದೀಗ ಅಳಿಸಲಾಗುತ್ತದೆ.\n\nನಿಮ್ಮಲ್ಲಿ ಪ್ರಶ್ನೆಗಳಿದ್ದರೆ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> ಮೂಲಕ ಪ್ರಿಂಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
<string name="me" msgid="6545696007631404292">"ನಾನು"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ಟ್ಯಾಬ್ಲೆಟ್ ಆಯ್ಕೆಗಳು"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ಏರ್‌ಪ್ಲೇನ್ ಮೋಡ್"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ಎರ್‌ಪ್ಲೇನ್ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ಎರ್‌ಪ್ಲೇನ್ ಮೋಡ್ ಆಫ್ ಆಗಿದೆ"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ಬ್ಯಾಟರಿ ಸೇವರ್‌‌"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಆಫ್ ಆಗಿದೆ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ಬ್ಯಾಟರಿ ಸೇವರ್‌ ಆನ್ ಆಗಿದೆ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ಸಹಾಯ ಮಾಡು"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ಧ್ವನಿ ಸಹಾಯಕ"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ಗೆ ಬದಲಿಸಿ"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ಸಂಪರ್ಕಗಳು"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಪ್ರವೇಶಿಸಲು"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಪ್ರವೇಶಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"ಸ್ಥಳ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ಈ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"ಈ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ಕ್ಯಾಲೆಂಡರ್"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಲು"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"ಎಸ್‌ಎಂಎಸ್‌ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ವೀಕ್ಷಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"ಸಂಗ್ರಹಣೆ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ಸಾಧನದಲ್ಲಿ ಫೋಟೋಗಳು, ಮಾಧ್ಯಮ ಮತ್ತು ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಫೋಟೋಗಳು, ಮಾಧ್ಯಮ ಮತ್ತು ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"ಮೈಕ್ರೋಫೋನ್‌"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ಆಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"ಆಡಿಯೋ ರೆಕಾರ್ಡ್‌ ಮಾಡಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"ಕ್ಯಾಮರಾ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ಚಿತ್ರಗಳನ್ನು ತೆಗೆಯಲು, ವೀಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಲು"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"ಚಿತ್ರಗಳನ್ನು ಸೆರೆಹಿಡಿಯಲು ಮತ್ತು ವೀಡಿಯೊ ರೆಕಾರ್ಡ್‌ ಮಾಡಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"ಫೋನ್"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ಫೋನ್ ಕರೆ ಮಾಡಲು ಹಾಗೂ ನಿರ್ವಹಿಸಲು"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"ದೇಹ ಸೆನ್ಸರ್‌ಗಳು"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸಾರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ನೀವು ಬಳಸುತ್ತಿರುವ ವಿಂಡೋದ ವಿಷಯ ಪರೀಕ್ಷಿಸುತ್ತದೆ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ಸ್ಪರ್ಶ-ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಆನ್ ಮಾಡುತ್ತದೆ"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ಗೆಸ್ಚರ್‌ಗಳನ್ನು ಮಾಡಿ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"ಟ್ಯಾಪ್ ಮಾಡಬಹುದು, ಸ್ವೈಪ್ ಮಾಡಬಹುದು, ಪಿಂಚ್ ಮಾಡಬಹುದು ಮತ್ತು ಇತರ ಗೆಸ್ಚರ್‌ಗಳನ್ನು ಮಾಡಬಹುದು."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ ಸೂಚಕಗಳು"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"ಸಾಧನದ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್‌ನಲ್ಲಿ ನಡೆಸಿದ ಸೂಚಕಗಳನ್ನು ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"ಸಾಧನದ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್‌ನಲ್ಲಿ ನಡೆಸಿದ ಸೂಚಕಗಳನ್ನು ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಇಲ್ಲವೇ ಮಾರ್ಪಡಿಸಿ"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅಥವಾ ಸೇರಿಸಲು ಮತ್ತು ಸಿಸ್ಟಂ ಐಕಾನ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯಾಗಿರಲು"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ಸ್ಮರಣೆಯಲ್ಲಿ ನಿರಂತರವಾಗಿ ತನ್ನದೇ ಭಾಗಗಳನ್ನು ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಟ್ಯಾಬ್ಲೆಟ್ ಕಾರ್ಯವನ್ನು ನಿಧಾನಗೊಳಿಸುವುದರ ಮೂಲಕ ಇತರ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳಿಗೆ ಲಭ್ಯವಿರುವ ಸ್ಮರಣೆಯನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"ಮೆಮೊರಿಯಲ್ಲಿ ಅದರ ಭಾಗಗಳನ್ನು ತಾನಾಗಿಯೇ ಮಾಡಿಕೊಳ್ಳಲು ಅನುಮತಿಸುತ್ತದೆ. ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಲಭ್ಯವಿರುವ ಮೆಮೊರಿಯನ್ನು ಮಿತಿಗೊಳಿಸಿ ಟಿವಿಯನ್ನು ಇದು ನಿಧಾನಗೊಳಿಸಬಹುದು."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ಸ್ಮರಣೆಯಲ್ಲಿ ನಿರಂತರವಾಗಿ ತನ್ನದೇ ಭಾಗಗಳನ್ನು ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದು ಫೋನ್ ಕಾರ್ಯವನ್ನು ನಿಧಾನಗೊಳಿಸುವುದರ ಮೂಲಕ ಇತರ ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳಿಗೆ ಲಭ್ಯವಿರುವ ಸ್ಮರಣೆಯನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ಮುನ್ನೆಲೆ ಸೇವೆಯನ್ನು ರನ್‌ ಮಾಡಿ"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"ಮುನ್ನೆಲೆ ಸೇವೆಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡಿ."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"ಅಪ್ಲಿಕೇಶನ್‌ ಸಂಗ್ರಹ ಸ್ಥಳವನ್ನು ಅಳೆಯಿರಿ"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"ಅದರ ಕೋಡ್‌‌, ಡೇಟಾ, ಮತ್ತು ಕ್ಯಾಷ್‌ ಗಾತ್ರಗಳನ್ನು ಹಿಂಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‍ಗಳನ್ನು ಮಾರ್ಪಡಿಸಿ"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ಪ್ಯಾಟರ್ನ್ ಅನ್‌ಲಾಕ್."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ಮುಖದ ಅನ್‌ಲಾಕ್."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ಪಿನ್ ಅನ್‌ಲಾಕ್."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"ಸಿಮ್‌ ಪಿನ್‌ ಅನ್‌ಲಾಕ್ ಮಾಡಿ."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"ಸಿಮ್‌ PUK ಅನ್‌ಲಾಕ್ ಮಾಡಿ."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ಪಾಸ್‌ವರ್ಡ್ ಅನ್‌ಲಾಕ್."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ಪ್ಯಾಟರ್ನ್ ಪ್ರದೇಶ."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ಸ್ಲೈಡ್ ಪ್ರದೇಶ."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"ಪಠ್ಯವನ್ನು ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಲಾಗಿದೆ."</string>
<string name="more_item_label" msgid="4650918923083320495">"ಇನ್ನಷ್ಟು"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"ಮೆನು+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ಅಳಿಸಿ"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"ಅಪ್‌ಡೇಟ್‌ಗಾಗಿ ಪರಿಶೀಲಿಸಿ"</string>
<string name="smv_application" msgid="3307209192155442829">"ಅಪ್ಲಿಕೇಶನ್‌‌ <xliff:g id="APPLICATION">%1$s</xliff:g> (ಪ್ರಕ್ರಿಯೆಯು <xliff:g id="PROCESS">%2$s</xliff:g>) ತನ್ನ ಸ್ವಯಂ-ಜಾರಿ ಕಠಿಣ ಮೋಡ್ ನೀತಿಯನ್ನು ಉಲ್ಲಂಘನೆ ಮಾಡಿದೆ."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> ಪ್ರಕ್ರಿಯೆಯು ತನ್ನ ಸ್ವಯಂ-ಜಾರಿ ಕಠಿಣ ಮೋಡ್ ನೀತಿಯನ್ನು ಉಲ್ಲಂಘನೆ ಮಾಡಿದೆ."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android ಅಪ್‌ಗ್ರೇಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ಫೋನ್ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"ಸಾಧನವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ಫೋನ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ಟ್ಯಾಬ್ಲೆಟ್ ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"ಸಾಧನವನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ಸಂಗ್ರಹಣೆಯನ್ನು ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android ಅಪ್‌ಡೇಟ್‌ ಮುಗಿಸಲಾಗುತ್ತಿದೆ…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ಅಪ್‌ಗ್ರೇಡ್ ಮುಗಿಯುವ ತನಕ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡದಿರಬಹುದು"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"ಸಿಸ್ಟಮ್ ಅಪ್‌ಡೇಟ್ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತಿದೆ…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ಅಪ್‌ಗ್ರೇಡ್ ಆಗುತ್ತಿದೆ..."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="NUMBER_0">%1$d</xliff:g> ಅಪ್ಲಿಕೇಶನ್‌ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ಬೂಟ್ ಪೂರ್ಣಗೊಳಿಸಲಾಗುತ್ತಿದೆ."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ರನ್ ಆಗುತ್ತಿದೆ"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"ಆಟಕ್ಕೆ ಹಿಂತಿರುಗಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ಆಟವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"ಉತ್ತಮ ಕಾರ್ಯಕ್ಷಮತೆಗಾಗಿ, ಈ ಆಟಗಳಲ್ಲಿ ಒಂದನ್ನು ಮಾತ್ರ ಒಂದು ಸಮಯದಲ್ಲಿ ತೆರೆಯಬಹುದಾಗಿದೆ."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> ಗೆ ಹಿಂತಿರುಗಿ"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> ಅನ್ನು ತೆರೆಯಿರಿ"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ಅನ್ನು ಉಳಿಸದೆಯೇ ಮುಚ್ಚಲಾಗುತ್ತದೆ"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ಮೆಮೊರಿ ಮಿತಿಯನ್ನು ಮೀರಿದೆ"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ಹೀಪ್ ಡಂಪ್ ಅನ್ನು ಸಂಗ್ರಹಿಸಲಾಗಿದೆ; ಹಂಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"ಹೀಪ್ ಡಂಪ್ ಹಂಚಿಕೊಳ್ಳುವುದೇ?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> ಪ್ರಕ್ರಿಯೆಯು <xliff:g id="SIZE">%2$s</xliff:g> ರ ಪ್ರಕ್ರಿಯೆ ಮೆಮೊರಿ ಮಿತಿಯನ್ನು ಮೀರಿದೆ. ನೀವು ಅದರ ಡೆವಲಪರ್ ಜೊತೆ ಹಂಚಿಕೊಳ್ಳಲು ಹೀಪ್ ಡಂಪ್ ಲಭ್ಯವಿದೆ. ಎಚ್ಚರಿಕೆ: ಈ ಹೀಪ್ ಡಂಪ್ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರವೇಶ ಹೊಂದಿರುವ ನಿಮ್ಮ ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಹೊಂದಿರಬಹುದು."</string>
<string name="sendText" msgid="5209874571959469142">"ಪಠ್ಯಕ್ಕೆ ಕ್ರಿಯೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಿ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ವಾಹಕ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಿ"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ಎಲ್ಲಾ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ಸಂಪರ್ಕಿಸಿ"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ಎಲ್ಲಾ ನೆಟ್‌ವರ್ಕ್‌ಗಳು"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ಎಲ್ಲಾ ನೆಟ್‌ವರ್ಕ್‌ಗಳು"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ವೈ‑ಫೈ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್ ಆಗುತ್ತದೆ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ನೀವು ಉಳಿಸಿದ ಅಧಿಕ ಗುಣಮಟ್ಟದ ನೆಟ್‌ವರ್ಕ್‌ ಸಮೀಪದಲ್ಲಿದ್ದಾಗ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ಮತ್ತೆ ಆನ್ ಮಾಡಲು ಹಿಂತಿರುಗಬೇಡಿ"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"ಮರುಪ್ರಾರಂಭಿಸು"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ಮೊಬೈಲ್ ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸಿ"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ಅಪ್ಲಿಕೇಶನ್ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ಹೊಸ ಸಿಮ್ ಸೇರಿಸಲಾಗಿದೆ"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ಇದನ್ನು ಸ್ಥಾಪಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB ಮೂಲಕ PTP ಆನ್‌ ಆಗಿದೆ"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ಟೆಥರಿಂಗ್ ಆನ್ ಆಗಿದೆ"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB ಮೂಲಕ MIDI ಆನ್‌ ಆಗಿದೆ"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ಪರಿಕರದ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB ಪರಿಕರವನ್ನು ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ. ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ಅನ್‌ಲಾಗ್ ಆಡಿಯೋ ಪರಿಕರ ಪತ್ತೆಯಾಗಿದೆ"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ಲಗತ್ತಿಸಲಾದ ಸಾಧನವು ಈ ಫೋನಿನೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ಡೀಬಗಿಂಗ್‌‌ ಸಂಪರ್ಕ"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB ಡೀಬಗ್‌ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB ಡೀಬಗ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಆಫ್‌ ಮಾಡಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ಡೀಬಗ್‌ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಆಯ್ಕೆ ಮಾಡಿ."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ದೋಷದ ವರದಿಯನ್ನು ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ಬಗ್ ವರದಿಯನ್ನು ಹಂಚುವುದೇ?"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಮೂಲಕ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ಇತರವುಗಳ ಮೇಲೆ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆದು, ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ಆಫ್ ಮಾಡಿ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ಆಫ್ ಮಾಡಿ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ದೋಷಗಳನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"ಹೊಸ <xliff:g id="NAME">%s</xliff:g> ಪತ್ತೆಯಾಗಿದೆ"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕಗೊಳ್ಳುತ್ತಿದೆ…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ಯಾವಾಗಲೂ ಆನ್ ಆಗಿರುವ VPN ನಿಂದ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"ಯಾವಾಗಲೂ-ಆನ್ VPN ದೋಷ"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"ನೆಟ್‌ವರ್ಕ್‌ ಅಥವಾ VPN ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string>
<string name="upload_file" msgid="2897957172366730416">"ಫೈಲ್ ಆಯ್ಕೆಮಾಡು"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ಯಾವುದೇ ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ"</string>
<string name="reset" msgid="2448168080964209908">"ಮರುಹೊಂದಿಸು"</string>
<string name="submit" msgid="1602335572089911941">"ಸಲ್ಲಿಸು"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"ಕಾರು ಮೋಡ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"ಕಾರು ಮೋಡ್‍ನಿಂದ ನಿರ್ಗಮಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"ಟೆಥರಿಂಗ್ ಅಥವಾ ಹಾಟ್‌ಸ್ಪಾಟ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ಟೆಥರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ಡ್ರೈವ್"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB ಸಂಗ್ರಹಣೆ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ಎಡಿಟ್"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"ಡೇಟಾ ಬಳಕೆ ಎಚ್ಚರಿಕೆ"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"ಬಳಕೆ ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‍ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ಡೇಟಾ ಮೀತಿಯನ್ನು ತಲುಪಿದೆ"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ಡೇಟಾ ಮೀತಿಯನ್ನು ತಲುಪಿದೆ"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ಡೇಟಾ ಎಚ್ಚರಿಕೆ"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"ನೀವು ಡೇಟಾದ <xliff:g id="APP">%s</xliff:g> ಅನ್ನು ಬಳಸಿದ್ದೀರಿ"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"ಮೊಬೈಲ್ ಡೇಟಾ ಮಿತಿಯನ್ನು ತಲುಪಲಾಗಿದೆ"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ವೈ-ಫೈ ಡೇಟಾ ಮಿತಿಯನ್ನು ತಲುಪಿದೆ"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"ಉಳಿದಿರುವ ಆವರ್ತನೆಗೆ ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G ಡೇಟಾ ಮಿತಿ ಮೀರಿದೆ"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ಡೇಟಾ ಮಿತಿ ಮೀರಿದೆ"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"ಮೊಬೈಲ್ ಡೇಟಾ ಮಿತಿ ಮೀರಿದೆ"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"ವೈ-ಫೈ ಡೇಟಾ ಮಿತಿ ಮೀರಿದೆ"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಮಿತಿ ಮೀರಿದೆ."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"ಉಳಿದಿರುವ ನಿಮ್ಮ ಆವರ್ತನೆಗೆ ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"ನಿಮ್ಮ ಮೊಬೈಲ್‌ ಡೇಟಾ ಮಿತಿಗಿಂತಲೂ ಹೆಚ್ಚಿನ ಬಳಕೆಯಾಗಿದೆ"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"ನಿಮ್ಮ ವೈ-ಫೈ ಡೇಟಾ ಮಿತಿಗಿಂತಲೂ ಹೆಚ್ಚಿನ ಬಳಕೆಯಾಗಿದೆ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"ನೀವು ಹೊಂದಿಸಿದ <xliff:g id="SIZE">%s</xliff:g> ಮಿತಿಗಿಂತಲೂ ಹೆಚ್ಚಿನ ಬಳಕೆಯಾಗಿದೆ"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"ನಿರ್ಬಂಧವನ್ನು ತೆಗೆದುಹಾಕಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"ಹೆಚ್ಚು ಡೇಟಾ ಬಳಕೆ"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"ಕಳೆದ ಕೆಲವು ದಿನಗಳಿಂದ ನಿಮ್ಮ ಡೇಟಾ ಬಳಕೆಯು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚಾಗಿದೆ. ಬಳಕೆ ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ಅಧಿಕ ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಕೆ"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಡೇಟಾವನ್ನು ಬಳಸಿಕೊಂಡಿವೆ"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಡೇಟಾವನ್ನು ಬಳಸಿಕೊಂಡಿದೆ"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"ಭದ್ರತಾ ಪ್ರಮಾಣಪತ್ರ"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ಈ ಪ್ರಮಾಣಪತ್ರವು ಮಾನ್ಯವಾಗಿದೆ."</string>
<string name="issued_to" msgid="454239480274921032">"ಇವರಿಗೆ ನೀಡಲಾಗಿದೆ:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸ್ಥಾಪಿಸಿದ್ದಾರೆ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಅಪ್‌ಡೇಟ್ ಮಾಡಲ್ಪಟ್ಟಿದೆ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಳಿಸಿದ್ದಾರೆ"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"ನಿಮ್ಮ ಬ್ಯಾಟರಿಯ ಬಾಳಿಕೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡಲು, ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ವೈಬ್ರೇಷನ್, ಸ್ಥಳ ಸೇವೆಗಳು ಹಾಗೂ ಹೆಚ್ಚಿನ ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ. ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಅವಲಂಬಿಸಿರುವ ಇಮೇಲ್, ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ, ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ನೀವು ತೆರೆಯದ ಹೊರತು ನವೀಕರಣಗೊಳ್ಳುವುದಿಲ್ಲ.\n\nನಿಮ್ಮ ಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವ ಸಮಯದಲ್ಲಿ ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ಆಫ್ ಆಗುತ್ತದೆ."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ಡೇಟಾ ಉಳಿಸುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ಆನ್‌ ಮಾಡಿ"</string>
@@ -1682,7 +1705,7 @@
<item quantity="one">%1$d ನಿಮಿಷಗಳವರೆಗೆ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ವರೆಗೆ)</item>
<item quantity="other">%1$d ನಿಮಿಷಗಳವರೆಗೆ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ವರೆಗೆ)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">%1$d ಗಂಟೆಗಳವರೆಗೆ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ವರೆಗೆ)</item>
<item quantity="other">%1$d ಗಂಟೆಗಳವರೆಗೆ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ವರೆಗೆ)</item>
</plurals>
@@ -1698,7 +1721,7 @@
<item quantity="one">%d ನಿಮಿಷಕ್ಕೆ</item>
<item quantity="other">%d ನಿಮಿಷಕ್ಕೆ</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">%d ಗಂಟೆಗಳವರೆಗೆ</item>
<item quantity="other">%d ಗಂಟೆಗಳವರೆಗೆ</item>
</plurals>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ಅವರಿಂದ ಮ್ಯೂಟ್‌ ಮಾಡಲಾಗಿದೆ"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ ಹಾಗೂ ನೀವು ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾವನ್ನು ಮರುಹೊಂದಿಸುವರೆಗೂ ಅದು ಅಸ್ಥಿರವಾಗಬಹುದು."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ. ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ತಯಾರಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD ವಿನಂತಿಯನ್ನು DIAL ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD ವಿನಂತಿಯನ್ನು SS ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD ವಿನಂತಿಯನ್ನು ಹೊಸ USSD ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD ವಿನಂತಿಯನ್ನು ವೀಡಿಯೊ DIAL ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ವಿನಂತಿಯನ್ನು DIAL ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS ವಿನಂತಿಯನ್ನು ವೀಡಿಯೊ DIAL ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ವಿನಂತಿಯನ್ನು USSD ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ವಿನಂತಿಯನ್ನು ಹೊಸ SS ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ವಿಸ್ತೃತಗೊಳಿಸಿ"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ಕುಗ್ಗಿಸಿ"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ಅಪಾಯಕಾರಿ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿದೆ"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್‌ಗಳನ್ನು <xliff:g id="APP_0">%1$s</xliff:g> ತೋರಿಸಲು ಬಯಸಿದೆ"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ಎಡಿಟ್"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು ವೈಬ್ರೇಟ್‌ ಆಗುತ್ತವೆ"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಲಾಗುತ್ತದೆ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ಸಿಸ್ಟಂ ಬದಲಾವಣೆಗಳು"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"ಗಮನವನ್ನು ಕೇಂದ್ರೀಕರಿಸಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡಲು \"ಅಡಚಣೆ ಮಾಡಬೇಡ\" ಮೋಡ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮರೆಮಾಡುತ್ತಿದೆ"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ಇದು ವೈಶಿಷ್ಟ್ಯದ ಹೊಸ ಬದಲಾವಣೆಯ ಸೆಟ್ಟಿಂಗ್‌ ಆಗಿದೆ. ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಬದಲಾಗಿದೆ"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ಅಡಚಣೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ವರ್ತನೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ಏನನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಪರೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 2eb5bcf13878..d378c673df05 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"발신자 번호가 기본적으로 제한되지 않음으로 설정됩니다. 다음 통화: 제한되지 않음"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"서비스가 준비되지 않았습니다."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"발신자 번호 설정을 변경할 수 없습니다."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"데이터 서비스를 이용할 수 없음"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"긴급 전화 차단됨"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"모바일 데이터 서비스가 차단됨"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"긴급 전화를 사용할 수 없음"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"음성 서비스를 이용할 수 없음"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"음성/긴급 서비스를 이용할 수 없음"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"현재 위치에서 모바일 네트워크가 서비스 제공을 일시적으로 중단했습니다."</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"네트워크에 연결할 수 없습니다."</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"수신 상태를 개선하려면 설정 &gt; 네트워크 및 인터넷 &gt; 모바일 네트워크 &gt; 기본 네트워크 유형에서 선택된 유형을 변경해 보세요."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi 통화가 활성화됨"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"긴급 전화를 걸려면 모바일 네트워크에 연결되어 있어야 합니다."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"음성 서비스 및 긴급 전화가 차단됨"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"이동통신사에서 서비스를 일시적으로 사용 중지했습니다."</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"모바일 네트워크에 연결할 수 없습니다."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"기본 네트워크를 변경해 보세요. 탭하여 변경할 수 있습니다."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"긴급 전화를 사용할 수 없습니다."</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi‑Fi로는 긴급 전화를 걸 수 없습니다."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"알림"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"착신전환"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"긴급 콜백 모드"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"로밍 배너 사용"</string>
<string name="roamingText12" msgid="1189071119992726320">"로밍 배너 사용 안함"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"서비스 검색 중"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi 통화"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi를 사용하여 전화를 걸고 메시지를 보내려면 먼저 이동통신사에 문의하여 서비스를 설정해야 합니다. 그런 다음 설정에서 Wi-Fi 통화를 사용 설정하시기 바랍니다. (오류 코드: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"이동통신사에 등록하세요(오류 코드: <xliff:g id="CODE">%1$s</xliff:g>)."</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi 통화"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"처리 중인 요청이 너무 많습니다. 잠시 후에 다시 시도해 주세요."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>에 로그인 오류 발생"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"동기화"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"동기화"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> 삭제가 너무 많습니다."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"동기화할 수 없음"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> 콘텐츠를 너무 많이 삭제하려고 했습니다."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"태블릿 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 늘리세요."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"시계 저장공간이 가득 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 늘리세요."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 확보하세요."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"직장 프로필 관리자가 수행함"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>에서 모니터링"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"직장 프로필 삭제됨"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"관리 앱이 없어서 직장 프로필이 삭제되었습니다."</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"직장 프로필 관리 앱이 없거나 손상되어 직장 프로필 및 관련 데이터가 삭제되었습니다. 도움이 필요한 경우 관리자에게 문의하세요."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"직장 프로필을 이 기기에서 더 이상 사용할 수 없습니다."</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"비밀번호 입력을 너무 많이 시도함"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"관리되는 기기"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"조직에서 이 기기를 관리하며 네트워크 트래픽을 모니터링할 수도 있습니다. 자세한 내용을 보려면 탭하세요."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"기기가 삭제됩니다."</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"관리자 앱을 사용할 수 없습니다. 곧 기기가 삭제됩니다.\n\n궁금한 점이 있으면 조직의 관리자에게 문의하세요."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"관리자 앱을 사용할 수 없습니다. 곧 기기가 삭제됩니다.\n\n궁금한 점이 있으면 조직의 관리자에게 문의하세요."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g>에 의해 사용 중지되었습니다."</string>
<string name="me" msgid="6545696007631404292">"나"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"태블릿 옵션"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"비행기 모드"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"비행기 모드 사용중"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"비행기 모드 사용중이 아님"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"배터리 세이버"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"배터리 세이버 사용 안함"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"배터리 세이버 사용 중"</string>
<string name="global_action_settings" msgid="1756531602592545966">"설정"</string>
<string name="global_action_assist" msgid="3892832961594295030">"지원"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"음성 지원"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"직장 프로필로 전환"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"주소록"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"주소록에 액세스"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 연락처를 액세스하도록 허용합니다."</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 연락처에 액세스하도록 허용하시겠습니까?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"위치"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"이 기기의 위치정보에 액세스"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 이 기기의 위치를 액세스하도록 허용합니다."</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 기기 위치에 액세스하도록 허용하시겠습니까?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"캘린더"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"캘린더에 액세스"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 캘린더를 액세스하도록 허용합니다."</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 캘린더에 액세스하도록 허용하시겠습니까?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS 메시지 전송 및 보기"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 SMS 메시지를 전송하고 보도록 허용합니다."</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 SMS 메시지를 전송하고 보도록 허용하시겠습니까?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"저장용량"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"기기 사진, 미디어, 파일 액세스"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 기기의 사진, 미디어, 파일에 액세스하도록 허용합니다."</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 기기의 사진, 미디어, 파일에 액세스하도록 허용하시겠습니까.?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"마이크"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"오디오 녹음"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 오디오를 녹화하도록 허용합니다."</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 오디오를 녹음하도록 허용하시겠습니까?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"카메라"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"사진 및 동영상 촬영"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 사진을 촬영하고 동영상을 녹화하도록 허용합니다."</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 사진을 촬영하고 동영상을 녹화하도록 허용하시겠습니까?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"전화"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"전화 걸기 및 관리"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 전화를 걸고 관리하도록 허용합니다."</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 전화를 걸고 관리하도록 허용하시겠습니까?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"인체 감지 센서"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"생체 신호에 관한 센서 데이터에 액세스"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 생체 신호에 관한 센서 데이터에 액세스하도록 허용합니다."</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 생체 신호에 관한 센서 데이터에 액세스하도록 허용하시겠습니까?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"창 콘텐츠 가져오기"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"터치하여 탐색 사용"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"동작 실행"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"탭, 스와이프, 확대/축소 및 기타 동작을 실행할 수 있습니다."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"지문 동작"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"기기 지문 센서에서 동작을 캡처합니다."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"기기 지문 센서에서 동작을 캡처합니다."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"상태 표시줄 사용 중지 또는 수정"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"앱이 상태 표시줄을 사용중지하거나 시스템 아이콘을 추가 및 제거할 수 있도록 허용합니다."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"상태 표시줄에 위치"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"앱이 그 일부분을 영구적인 메모리로 만들 수 있도록 허용합니다. 이렇게 하면 다른 앱이 사용할 수 있는 메모리를 제한하여 태블릿의 속도를 저하시킬 수 있습니다."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"앱이 메모리를 지속적으로 사용할 수 있도록 허용합니다. 이는 TV의 속도를 늦춰 다른 앱에서 사용할 수 있는 메모리를 제한할 수 있습니다."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"앱이 그 일부분을 영구적인 메모리로 만들 수 있도록 허용합니다. 이렇게 하면 다른 앱이 사용할 수 있는 메모리를 제한하여 휴대전화의 속도를 저하시킬 수 있습니다."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"포그라운드 서비스 실행"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"앱에서 포그라운드 서비스를 사용하도록 허용합니다."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"앱 저장공간 계산"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"앱이 해당 코드, 데이터 및 캐시 크기를 검색할 수 있도록 허용합니다."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"시스템 설정 수정"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"패턴을 사용하여 잠금해제합니다."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"얼굴 인식을 사용하여 잠금해제합니다."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"핀을 사용하여 잠금해제합니다."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM PIN 잠금 해제"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM PUK 잠금 해제"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"비밀번호를 사용하여 잠금해제합니다."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"패턴을 그리는 부분입니다."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"슬라이드하는 부분입니다."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"텍스트가 클립보드에 복사되었습니다."</string>
<string name="more_item_label" msgid="4650918923083320495">"더보기"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"스페이스바"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"입력"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"삭제"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"업데이트 확인"</string>
<string name="smv_application" msgid="3307209192155442829">"앱 <xliff:g id="APPLICATION">%1$s</xliff:g>(프로세스 <xliff:g id="PROCESS">%2$s</xliff:g>)이(가) 자체 시행 StrictMode 정책을 위반했습니다."</string>
<string name="smv_process" msgid="5120397012047462446">"프로세스(<xliff:g id="PROCESS">%1$s</xliff:g>)가 자체 시행 StrictMode 정책을 위반했습니다."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android 업그레이드 중.."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android가 시작되는 중…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"휴대전화를 업데이트하는 중…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"태블릿을 업데이트하는 중…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"기기를 업데이트하는 중…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"휴대전화를 시작하는 중…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"태블릿을 시작하는 중…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"기기를 시작하는 중…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"저장소 최적화 중"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android 업데이트 완료 중…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"특정 앱은 업그레이드가 완료될 때까지 제대로 작동하지 않을 수 있습니다."</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"시스템 업데이트를 완료하는 중…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> 업그레이드 중…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"앱 <xliff:g id="NUMBER_1">%2$d</xliff:g>개 중 <xliff:g id="NUMBER_0">%1$d</xliff:g>개 최적화 중"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> 준비 중..."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"앱을 시작하는 중입니다."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"부팅 완료"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> 실행 중"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"게임으로 돌아가려면 탭하세요."</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"게임 선택"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"성능 최적화를 위해 한 번에 하나의 게임만 열 수 있습니다."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g>(으)로 돌아가기"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> 열기"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g>이(가) 저장되지 않고 종료됩니다."</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>에서 메모리 제한을 초과했습니다."</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"힙 덤프가 수집되었습니다. 공유하려면 탭하세요."</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"힙 덤프가 수집되었습니다. 공유하려면 탭하세요."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"힙 덤프를 공유할까요?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"프로세스 <xliff:g id="PROC">%1$s</xliff:g>에서 프로세스 메모리 한도(<xliff:g id="SIZE">%2$s</xliff:g>)를 초과했습니다. 힙 덤프를 개발자와 공유할 수 있습니다. 주의: 애플리케이션이 액세스할 수 있는 개인 정보가 이 힙 덤프에 포함되어 있을 수 있습니다."</string>
<string name="sendText" msgid="5209874571959469142">"텍스트에 대한 작업 선택"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"공개 Wi‑Fi 네트워크에 연결"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"이동통신사 Wi‑Fi 네트워크에 연결"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"공개 Wi‑Fi 네트워크에 연결 중"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi 네트워크에 연결됨"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi 네트워크에 연결할 수 없음"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"모든 네트워크를 보려면 탭하세요."</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"연결"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"모든 네트워크"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"모든 네트워크"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi가 자동으로 사용 설정됨"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"저장된 고품질 네트워크가 가까이 있는 경우"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"다시 사용 설정하지 않음"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"다시 시작"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"모바일 서비스 활성화"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"이동통신사 앱을 다운로드하여 새로운 SIM 활성화"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 다운로드하여 새로운 앱을 활성화하세요."</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"앱 다운로드"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"새 SIM이 삽입됨"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"탭하여 설정"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB를 통해 PTP 사용 설정됨"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB 테더링 사용 설정됨"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB를 통해 MIDI 사용 설정됨"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB 액세서리 모드 사용 설정됨"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB 액세서리 연결됨"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"옵션을 더 보려면 탭하세요."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"연결된 기기를 충전합니다. 옵션을 더 보려면 탭하세요."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"아날로그 오디오 액세서리가 감지됨"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"연결된 기기가 이 휴대전화와 호환되지 않습니다. 자세히 알아보려면 탭하세요."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB 디버깅 연결됨"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB 디버깅을 사용하지 않으려면 탭하세요."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB 디버깅을 사용 중지하려면 탭하세요."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB 디버깅을 사용하지 않으려면 선택합니다."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"버그 보고서 가져오는 중..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"버그 보고서를 공유하시겠습니까?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"사용 중지"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"사용 중지"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> 준비 중"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"오류 확인 중"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"새로운 <xliff:g id="NAME">%s</xliff:g> 감지됨"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"연결 유지 VPN에 연결하는 중…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"연결 유지 VPN에 연결됨"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"연결 유지 VPN 연결이 해제됨"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"연결 유지 VPN 오류"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"연결 유지 VPN에 연결할 수 없음"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"네트워크 또는 VPN 설정 변경"</string>
<string name="upload_file" msgid="2897957172366730416">"파일 선택"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"파일을 선택하지 않았습니다."</string>
<string name="reset" msgid="2448168080964209908">"초기화"</string>
<string name="submit" msgid="1602335572089911941">"제출"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"운전모드 사용"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"운전 모드를 종료하려면 탭하세요."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"운전 앱 실행 중"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"운전 앱을 종료하려면 탭하세요."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"테더링 또는 핫스팟 사용"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"설정하려면 탭하세요."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"테더링이 사용 중지됨"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB 드라이브"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB 저장소"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"수정"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"데이터 사용 알림"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"사용량 및 설정을 보려면 탭하세요."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G 데이터 한도에 도달함"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G 데이터 한도에 도달함"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"데이터 경고"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"데이터 <xliff:g id="APP">%s</xliff:g>을(를) 사용했습니다."</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"모바일 데이터 제한 도달"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi 데이터 한도에 도달함"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"나머지 주기 동안 데이터 일시중지됨"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G - 3G 데이터 제한 초과됨"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4GB의 데이터 제한 초과됨"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"모바일 데이터 제한 초과됨"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi 데이터 한도 초과됨"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> - 지정된 한도 초과"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"남은 주기 동안 데이터가 일시중지되었습니다."</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"모바일 데이터 한도 초과"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi 데이터 한도 초과"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"설정된 한도를 <xliff:g id="SIZE">%s</xliff:g> 초과했습니다."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"백그라운드 데이터 사용이 제한됨"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"제한을 삭제하려면 탭하세요."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"데이터 사용량 많음"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"지난 며칠 동안의 데이터 사용량이 평소보다 많습니다. 사용량 및 설정을 보려면 탭하세요."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"모바일 데이터 사용량 많음"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"앱에서 평소보다 데이터를 많이 사용했습니다."</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g>에서 평소보다 데이터를 많이 사용했습니다."</string>
<string name="ssl_certificate" msgid="6510040486049237639">"보안 인증서"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"유효한 인증서입니다."</string>
<string name="issued_to" msgid="454239480274921032">"발급 대상:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"관리자에 의해 설치되었습니다."</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"관리자에 의해 업데이트되었습니다."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"관리자에 의해 삭제되었습니다."</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"배터리 세이버는 배터리 수명 개선을 위해 기기 성능을 줄이고 진동, 위치 서비스 및 대부분의 백그라운드 데이터를 제한합니다. 이메일, 메시지 및 동기화에 의존하는 기타 앱은 앱을 열 때까지 업데이트되지 않을 수 있습니다.\n\n배터리 세이버는 기기가 충전 중일 때는 자동으로 사용 중지됩니다."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"데이터 사용량을 줄이기 위해 데이터 절약 모드는 일부 앱이 백그라운드에서 데이터를 전송하거나 수신하지 못하도록 합니다. 현재 사용 중인 앱에서 데이터에 액세스할 수 있지만 빈도가 줄어듭니다. 예를 들면, 이미지를 탭하기 전에는 이미지가 표시되지 않습니다."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"데이터 절약 모드를 사용할까요?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"사용 설정"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d분 동안(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>까지)</item>
<item quantity="one">1분 동안(<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>까지)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d시간 동안(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>까지)</item>
- <item quantity="one">1시간 동안(<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>까지)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d시간(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">1시간(<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>까지)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d시간 동안(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>까지)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">%d분 동안</item>
<item quantity="one">1분 동안</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">%d시간 동안</item>
- <item quantity="one">1시간 동안</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d시간</item>
+ <item quantity="one">1시간</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d시간 동안</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>에서 알림음 음소거"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"사용 중인 기기 내부에 문제가 발생했습니다. 초기화할 때까지 불안정할 수 있습니다."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"사용 중인 기기 내부에 문제가 발생했습니다. 자세한 내용은 제조업체에 문의하세요."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD 요청이 DIAL 요청으로 수정됩니다."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD 요청이 SS 요청으로 수정됩니다."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD 요청이 새로운 USSD 요청으로 수정됩니다."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD 요청이 동영상 DIAL 요청으로 수정됩니다."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 요청이 DIAL 요청으로 수정됩니다."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS 요청이 동영상 DIAL 요청으로 수정됩니다."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 요청이 USSD 요청으로 수정됩니다."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 요청이 새로운 SS 요청으로 수정됩니다."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"직장 프로필"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"펼치기"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"접기"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"유해한 앱 감지됨"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>에서 <xliff:g id="APP_2">%2$s</xliff:g>의 슬라이스를 표시하려고 합니다"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"수정"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"전화 및 알림이 오면 진동이 사용됩니다."</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"전화 및 알림 소리가 음소거됩니다."</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"시스템 변경사항"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"알림 일시중지"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"집중할 수 있도록 알림 일시중지 기능으로 알림 숨김"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"새로운 동작입니다. 변경하려면 탭하세요."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"알림 일시중지 변경"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"알림 일시중지 설정을 확인하려면 탭하세요."</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"차단된 항목을 확인하려면 탭하세요."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"시스템"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"설정"</string>
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 84abf19c2b31..7c8029e51abc 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Номурду аныктоонун демейки абалы \"чектелбейт\" деп коюлган. Кийинки чалуу: Чектелбейт"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Кызмат камсыздалган эмес."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Чалуучунун далдаштырма дайындары жөндөөлөрүн өзгөртө албайсыз."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Мобилдик туташуу кызматы жок"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Шашылыш чалуу бөгөттөлгөн"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Мобилдик Интернет кызматы жок"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Шашылыш чалуу бөгөттөлгөн"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Аудио чалуу кызматы бөгөттөлгөн"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Бардык чалуулар жана кызматтар бөгөттөлгөн"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Өзгөчө кырдаалдагы кызматтар сиз жайгашкан жердеги мобилдик тармак тарабынан убактылуу бөгөттөлгөн"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Тармакка туташпай жатат"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Кабыл алуу мүмкүнчүлүгүн жакшыртуу үчүн Жөндөөлөр &gt; Тармак жана Интернет &gt; Мобилдик тармактар &gt; Тандалган тармак бөлүмүнөн тармактын түрүн өзгөртүп көрүңүз."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi аркылуу чалуу жүрүп жатат"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Шашылыш чалуу үчүн мобилдик тармак талап кылынат."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Чалуу жана шашылыш чалуу кызматы бөгөттөлгөн"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Байланыш оператору убактылуу бөгөттөп койгон"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобилдик тармакка туташпай жатат"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Тандалган тармакты өзгөртүп көрүңүз. Өзгөртүү үчүн таптаңыз."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Шашылыш чалуу жеткиликсиз"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi-Fi аркылуу шашылыш чалуулар иштетилген жок"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Эскертүүлөр"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Чалууну башка номерге багыттоо"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шашылыш кайра чалуу режими"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Роуминг баннери күйгүзүлгөн"</string>
<string name="roamingText12" msgid="1189071119992726320">"Роуминг баннери өчүрүлгөн"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Кызмат изделүүдө"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Чалуу"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi аркылуу чалууларды аткарып жана билдирүүлөрдү жөнөтүү үчүн адегенде байланыш операторуңуздан бул кызматты орнотушун сураныңыз. Андан соң, Жөндөөлөрдөн Wi-Fi чалууну кайра күйгүзүңүз. (Ката коду: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Операторуңузга катталыңыз (Ката коду: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Чалуу"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Өтө көп талаптар иштетилүүдө. Кайта аракеттениңиз."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> менен кирүүдө ката кетти"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Шайкештирүү"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Шайкештирүү"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Өтө көп <xliff:g id="CONTENT_TYPE">%s</xliff:g> жок кылынды."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Планшеттин сактагычы толуп калды. Орун бошотуш үчүн кээ бир файлдарды өчүрүңүз."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Саат сактагычы толуп калды. Орун бошотуу үчүн айрым файлдарды жок кылыңыз."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Сыналгынын сактагычы толуп калды. Айрым файлдарды жок кылып орун бошотуңуз."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Жумуш профилиңиздин администратору тарабынан"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> тарабынан"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Жумуш профили жок кылынды"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Башкаруучу колдонмосу болбогондуктан, жумуш профили жок кылынды"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Жумуш профилинин башкаруучу колдонмосу жок же бузулгандыктан, жумуш профилиңиз жана ага байланыштуу дайындар жок кылынды. Жардам алуу үчүн администраторуңузга кайрылыңыз."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Жумуш профилиңиз бул түзмөктөн жок кылынды"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Өтө көп жолу сырсөздү киргизүү аракети жасалды"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Түзмөктү ишкана башкарат"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Ишканаңыз бул түзмөктү башкарат жана тармак трафигин көзөмөлдөшү мүмкүн. Чоо-жайын көрүү үчүн таптап коюңуз."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Түзмөгүңүз тазаланат"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Түзмөктү башкаруучу колдонмо жараксыз. Түзмөгүңүз азыр тазаланат.\n\nСуроолоруңуз болсо, ишканаңыздын администраторуна кайрылыңыз."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Түзмөктү башкаруучу колдонмо жараксыз. Түзмөгүңүз азыр тазаланат.\n\nСуроолоруңуз болсо, ишканаңыздын администраторуна кайрылыңыз."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Басып чыгаруу <xliff:g id="OWNER_APP">%s</xliff:g> тарабынан өчүрүлдү."</string>
<string name="me" msgid="6545696007631404292">"Мен"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Планшет мүмкүнчүлүктөрү"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Учак режими"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Учак режими КҮЙҮК"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Учак режими ӨЧҮК"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Батареяны үнөмдөгүч"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Батареяны үнөмдөгүч ӨЧҮК"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Батареяны үнөмдөгүч КҮЙҮК"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Жөндөөлөр"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Жардам"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Үн жардамчысы"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Жумуш профилине которулуу"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Байланыштар"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"байланыштарыңызды көрүүгө"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна байланыштарыңызды пайдалануу мүмкүнчүлүгүн бериңиз"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Жайгашкан жер"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"түзмөктүн жайгашкан жерин аныктоого"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна бул түзмөктүн жайгашкан жерин пайдалануу мүмкүнчүлүгүн бериңиз"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Жылнаама"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"жылнаамаңызды пайдалануу"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна календарыңызды пайдалануу мүмкүнчүлүгүн бериңиз"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS билдирүүлөрдү жиберүү жана көрсөтүү"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна SMS билдирүүлөрдү жөнөтүүгө жана окууга уруксат бериңиз"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Сактагыч"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"түзмөгүңүздөгү сүрөттөрдү жана башка мультимедиа файлдарын пайдаланууга"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна түзмөгүңүздөгү сүрөттөрдү жана башка мультимедиа файлдарын пайдаланууга уруксат бериңиз"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"аудио жаздыруу"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна аудио файлдарды жаздырууга уруксат бериңиз"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"сүрөт жана видео тартууга"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна сүрөттөрдү жана видеолорду тартууга уруксат бериңиз"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"телефон чалуу жана аларды башкаруу"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна телефон чалууларын аткарууга жана башкарууга уруксат бериңиз"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Дене сенсорлору"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"организмдин абалына көз салган сенсордун дайындарына мүмкүнчүлүк алуу"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна организмдин абалына көз салган сенсордун дайындарын пайдалануу мүмкүнчүлүгүн бериңиз"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезедеги мазмунду алып турат"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Учурда ачылып турган терезедеги маалыматты талдайт."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Сыйпалап изилдөө\" мүмкүнчүлүгүн иштетет"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Жаңсоолорду аткаруу"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Таптап, серпип, чымчып жана башка жаңсоолорду аткара алат."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Манжа изинин жаңсоолору"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Түзмөктөрдөгү манжа изинин сенсорунда жасалган жаңсоолорду жаздырып алат."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Түзмөктөгү манжа изинин сенсорунда жасалган жаңсоолорду жаздырып алат."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"абал тилкесин өчүрүү же өзгөртүү"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Колдонмого абал тилкесин өчүрүү же тутум сүрөтчөлөрүн кошуу же алып салуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"абал тилкесинин милдетин аткаруу"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Колдонмого өзүнүн бөлүктөрүн эстутумда туруктуу кармоого уруксат берет.Бул эстутумдун башка колдонмолорго жетиштүүлүгүн чектеши жана телефондун иштешин жайлатышы мүмкүн."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Колдонмого эстутумдагы өз бөлүктөрүн туруктуу кылуу мүмкүнчүлүгүн берет. Ушуну менен сыналгы жай иштеп, башка колдонмолорго жеткиликтүү эстутум чектелиши мүмкүн."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Колдонмого өзүнүн бөлүктөрүн эстутумда туруктуу кармоого уруксат берет. Бул эстутумдун башка колдонмолорго жетиштүүлүгүн чектеши жана телефондун иштешин жайлатышы мүмкүн."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"алдыңкы пландагы кызматты аткаруу"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Колдонмолорго алдынкы пландагы кызматтарды колдонууга уруксат берет."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"колдонмо сактагычынын мейкиндигин өлчөө"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Колдонмого өз кодун, дайындарын жана кэш өлчөмдөрүн түшүрүп алуу мүмкүнчүлүгүн берет"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"система тууралоолорун өзгөртүү"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Үлгү менен ачуу."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Жүзүнөн таануу"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Пин код менен ачуу."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM-картанын кулпусун PIN-код менен ачуу."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM-картанын кулпусун PUK-код менен ачуу."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Сырсөз менен ачуу."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Үлгү аймагы."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Жылмыштыруу аймагы."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Текст алмашуу буферине көчүрүлдү."</string>
<string name="more_item_label" msgid="4650918923083320495">"Дагы"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Меню+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"боштук"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"жок кылуу"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Жаңыртууну издөө"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> колдонмосу (<xliff:g id="PROCESS">%2$s</xliff:g> процесси) өз алдынча иштеткен StrictMode саясатын бузду."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> процесси өзүнүн мажбурланган StrictMode саясатын бузуп койду."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android жаңыртылууда…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android жүргүзүлүүдө…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Телефон жаңыртылууда…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Планшет жаңыртылууда…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Түзмөк жаңыртылууда…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Телефон күйгүзүлүүдө…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Планшет күйгүзүлүүдө…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Түзмөк күйүгүзүлүүдө…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Сактагыч ыңгайлаштырылууда."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android\'ди жаңыртуу аякталууда..."</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Жаңыртуу аягына чыкмайынча айрым колдонмолор талаптагыдай иштебей калышы мүмкүн"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Тутумду жаңыртуу аяктоодо…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> жаңыртылууда..."</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ичинен <xliff:g id="NUMBER_0">%1$d</xliff:g> колдонмо ыңгайлаштырылууда."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> даярдалууда."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Колдонмолорду иштетип баштоо"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Жүктөө аякталууда."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> иштеп жатат"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Оюнга кайтуу үчүн таптаңыз"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Оюн тандоо"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Жакшыраак иштеши үчүн, бир убакта бул оюндардын бири гана ачык болушу керек."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> колдонмосуна кайтуу"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> колдонмосун ачуу"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> сакталбастан жабылат"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> эстутум чегинен ашып кетти"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Үймө дамп топтолду; бөлүшүү үчүн таптап коюңуз"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Үймө дамп бөлүшүлсүнбү?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> процесси өзүнүн <xliff:g id="SIZE">%2$s</xliff:g> процесс чегинен ашып кетти. Үймө дамп сиз үчүн иштеп чыгуучу менен бөлүшүүгө даяр. Абайлаңыз: бул үймө дампта колдонмонун уруксаты бар жеке маалыматыңыз камтылышы мүмкүн."</string>
<string name="sendText" msgid="5209874571959469142">"Текст үчүн аракет тандаңыз"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ачык Wi‑Fi тармагына туташуу"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Байланыш операторунун Wi‑Fi тармагына туташуу"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ачык Wi‑Fi тармагына туташууда"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ачык Wi‑Fi тармагына туташты"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi тармагына туташпай калды"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бардык тармактарды көрүү үчүн басыңыз"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Туташуу"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Бардык тармактар"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Бардык тармактар"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматтык түрдө күйгүзүлөт"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Байланыш сигналы жакшы болгон тармактарга жакындаганда"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Өзү кайра күйбөйт"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Кайра баштоо"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Мобилдик кызматты жандыруу"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Жаңы SIM-картаны жандыруу үчүн байланыш операторунун колдонмосун жүктөп алыңыз"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Жаңы SIM-картаны жандыруу үчүн <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосун жүктөп алыңыз"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Колдонмону жүктөп алуу"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Жаңы SIM карта салынды"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Аны жөндөө үчүн таптап коюңуз"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB аркылуу PTP режими күйгүзүлдү"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB модем күйгүзүлдү"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB аркылуу MIDI режими күйгүзүлдү"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB шайманы режими күйгүзүлдү"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB шайманы туташты"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Кошумча параметрлерди ачуу үчүн таптап коюңуз."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Туташкан түзмөк кубатталууда. Дагы параметрлерди көрүү үчүн таптап коюңуз."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Аналогдук аудио жабдуу табылды"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Тиркелген түзмөк бул телефонго шайкеш келбейт. Көбүрөөк маалымат алуу үчүн таптап коюңуз."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Мүчүлүштүктөрдү USB аркылуу оңдоо иштетилген"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Мүчүлштктрдү USB аркл оңдну өчр үчн тийп коюңуз."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB аркылуу мүчүлүштүктөрдү оңдоону өчүрүү үчүн таптаңыз"</string>
<!-- no translation found for adb_active_notification_message (8470296818270110396) -->
<skip />
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Мүчүлүштүк тууралуу кабар алынууда…"</string>
@@ -1249,7 +1271,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> колдонмосун башка терезелердин үстүнөн көрсөтүү"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>: башка колдонмолордун үстүнөн"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Эгер <xliff:g id="NAME">%s</xliff:g> колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ӨЧҮРҮҮ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Өчүрүү"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> даярдалууда"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Каталар текшерилүүдө"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Жаңы <xliff:g id="NAME">%s</xliff:g> аныкталды"</string>
@@ -1335,14 +1357,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Дайым иштеген VPN туташууда…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Дайым иштеген VPN туташтырылды"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Ар дайым иштеген VPN\'ден ажыратуу"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Дайым иштеген VPN\'де ката кетти"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Тармакты же VPN жөндөөлөрүн өзгөртүү"</string>
<string name="upload_file" msgid="2897957172366730416">"Файл тандоо"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Эч файл тандалган жок"</string>
<string name="reset" msgid="2448168080964209908">"Баштапкы абалга келтирүү"</string>
<string name="submit" msgid="1602335572089911941">"Тапшыруу"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Унаа режими иштетилген"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Унаа режиминен чыгуу үчүн таптап коюңуз."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Жалгаштыруу же хотспот жандырылган"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Жөндөө үчүн таптап коюңуз."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Жалгаштыруу функциясы өчүрүлгөн"</string>
@@ -1420,22 +1445,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB түзмөгү"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB эстутуму"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Өзгөртүү"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Трафикти чектөө"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Колдонулушун жана жөндөөлөрүн көрүү үчүн таптаңыз."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G дайындар чегине жетти"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G дайындар чегине жетти"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Трафик тууралуу эскертүү"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Трафиктин <xliff:g id="APP">%s</xliff:g> колдондуңуз"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Мобилдик трафик чегине жетти"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi дайындар чегине жетти"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Маалымат алмашуу токтотулду"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G трафик чектен ашты"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G трафик чектен ашты"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Мобилдик трафик чегинен ашты"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi трафик чегинен ашты"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Орнотулган чектөөдөн <xliff:g id="SIZE">%s</xliff:g> ашты."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Трафикти колдонуу циклдин аягына чейин тындырылды"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Мобилдик трафиктин чегинен ашты"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi трафигинин чегинен ашты"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Коюлган чектен <xliff:g id="SIZE">%s</xliff:g> ашып кеттиңиз"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Фондук трафик чектелген"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Чектөөнү алыш үчүн таптаңыз."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Трафик көп колдонулду"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Акыркы бир нече күндүн ичинде трафикти адаттагыдан көп колдондуңуз. Трафиктин колдонулушун жана жөндөөлөрүн көрүү үчүн таптаңыз."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Мобилдик трафик көп колдонулду"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Колдонмолор адаттагыдан көбүрөөк трафик колдонду"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> колдонмосу адаттагыдан көбүрөөк трафик колдонду"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Коопсуздук тастыктамасы"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Бул тастыктама жарактуу."</string>
<string name="issued_to" msgid="454239480274921032">"Берилди:"</string>
@@ -1671,7 +1693,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Администраторуңуз орнотуп койгон"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Администраторуңуз жаңыртып койгон"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Администраторуңуз жок кылып салган"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Батареянын өмүрүн узартуу үчүн Батареяны үнөмдөгүч режиминде түзмөгүңүздүн ишинин майнаптуулугу азайып, дирилдөө, жайгашкан жерди аныктоо кызматтары жана фондук дайындардын көпчүлүгү чектелип калат. Электрондук почта, жазышуу жана башка шайкештирилүүчү колдонмолор ачылмайынча, жаңыртылбай калышы мүмкүн.\n\nБатареяны үнөмдөгүч режими түзмөгүңүз кубатталып жатканда автоматтык түрдө өчүп калат."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Трафикти үнөмдөө режиминде айрым колдонмолор дайындарды фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайындарды жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Дайындарды үнөмдөгүч күйсүнбү?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Күйгүзүү"</string>
@@ -1683,9 +1706,9 @@
<item quantity="other">%1$d мүнөткө (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> чейин)</item>
<item quantity="one">1 мүнөткө (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> чейин)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d саатка (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> чейин)</item>
- <item quantity="one">Бир саатка (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> чейин)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d саатка күйгүзүлдү (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> чейин)</item>
+ <item quantity="one">1 саатка күйгүзүлдү (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> чейин)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d саатка (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> чейин)</item>
@@ -1699,9 +1722,9 @@
<item quantity="other">%d мүнөткө</item>
<item quantity="one">1 мүнөткө</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">%d саатка</item>
- <item quantity="one">Бир саатка</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d саатка күйгүзүлдү</item>
+ <item quantity="one">1 саатка күйгүзүлдү</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d саатка</item>
@@ -1722,14 +1745,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> тарабынан үнсүздөлдү"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Түзмөгүңүздө ички көйгөй бар жана ал баштапкы абалга кайтарылмайынча туруктуу иштебей коюшу мүмкүн."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Түзмөгүңүздө ички көйгөй бар. Анын чоо-жайын билүү үчүн өндүрүүчүңүзгө кайрылыңыз."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD сурамы DIAL сурамына өзгөртүлдү."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD сурамы SS сурамына өзгөртүлдү."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD сурамы жаңы USSD сурамына өзгөртүлдү."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD сурамы Видео DIAL сурамына өзгөртүлдү."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS сурамы DIAL сурамына өзгөртүлдү."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS сурамы Видео DIAL сурамына өзгөртүлдү."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS сурамы USSD сурамына өзгөртүлдү."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS сурамы жаңы SS сурамына өзгөртүлдү."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Жумуш профили"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Жайып көрсөтүү"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Жыйыштыруу"</string>
@@ -1839,7 +1870,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Зыянкеч колдонмо аныкталды"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> колдонмосу <xliff:g id="APP_2">%2$s</xliff:g> үлгүлөрүн көрсөткөнү жатат"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Түзөтүү"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Чалуулар менен эскертмелер дирилдөө режиминде иштейт"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Чалуулар менен эскертмелердин үнү өчүрүлөт"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Тутум өзгөрүүлөрү"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Тынчымды алба"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Сизди алаксытпоо үчүн \"Тынчымды алба\" режими эскертмелерди жашырууда"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Бул жаңы тартип. Өзгөртүү үчүн таптаңыз."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Тынчымды алба\" режими өзгөрдү"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"\"Тынчымды алба\" режиминин жөндөөлөрүн текшерүү үчүн таптаңыз"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Бөгөттөлгөн нерселерди көрүү үчүн таптаңыз."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 86c317dbf066..08ab0cc84824 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ໝາຍເລກຜູ່ໂທ ໄດ້ຮັບການຕັ້ງຄ່າເລີ່ມຕົ້ນເປັນ ບໍ່ຖືກຈຳກັດ. ການໂທຄັ້ງຕໍ່ໄປ: ບໍ່ຖືກຈຳກັດ."</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"ບໍ່ໄດ້ເປີດໃຊ້ບໍລິການ."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"ທ່ານບໍ່ສາມາດປ່ຽນແປງການຕັ້ງຄ່າ Caller ID"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ບໍ່ມີບໍລິການອິນເຕີເນັດ"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"ບໍ່ສາມາດໂທສຸກເສີນໄດ້"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"ບໍ່ມີບໍລິການອິນເຕີເນັດມືຖື"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"ບໍ່ສາມາດໃຊ້ການໂທສຸກເສີນໄດ້"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ບໍ່ມີບໍລິການໂທສຽງ"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ບໍ່ມີບໍລິການສຽງ/ສຸກເສີນ"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"ເຄືອຂ່າຍຂອງທ່ານບໍ່ໄດ້ໃຫ້ບໍລິການຢູ່ສະຖານທີ່ນີ້ເປັນການຊົ່ວຄາວ"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t reach network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"ເພື່ອປັບປຸງການຮັບສັນຍານ, ໃຫ້ລອງປ່ຽນປະເພດທີ່ເລືອກໄວ້ຢູ່ທີ່ ການຕັ້ງຄ່າ &gt; ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ &gt; ເຄືອຂ່າຍມືຖື &gt; ປະເພດເຄືອຂ່າຍທີ່ຕ້ອງການ."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"ການໂທ Wi‑Fi ເຮັດວຽກຢູ່"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"ການໂທສຸກເສີນຕ້ອງໃຊ້ການເຊື່ອມຕໍ່ເຄືອຂ່າຍ."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ບໍ່ມີບໍລິການສຽງ ຫຼື ການໂທສຸກເສີນ"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"ຖືກປິດໄວ້ຊົ່ວຄາວໂດຍຜູ້ໃຫ້ບໍລິການຂອງທ່ານ"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ບໍ່ສາມາດຕິດຕໍ່ເຄືອຂ່າຍມືຖືໄດ້"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ໃຫ້ລອງປ່ຽນເຄືອຂ່າຍທີ່ຕ້ອງການ. ແຕະເພື່ອປ່ຽນ."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ບໍ່ສາມາດໃຊ້ການໂທສຸກເສີນໄດ້"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"ບໍ່ສາມາດໂທສຸກເສີນຜ່ານ Wi‑Fi ໄດ້"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ການເຕືອນ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ການໂອນສາຍ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ໂໝດໂທກັບສຸກເສີນ"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"ເປີດໂຣມມິງແບນເນີ"</string>
<string name="roamingText12" msgid="1189071119992726320">"ປິດໂຣມມິງແບນເນີ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ຊອກຫາບໍລິການ"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ການ​ໂທ Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ເພື່ອໂທ ແລະ ສົ່ງຂໍ້ຄວາມຜ່ານ Wi-Fi, ໃຫ້ແຈ້ງໃຫ້ຜູ້ໃຫ້ບໍລິການຂອງທ່ານຕັ້ງບໍລິການນີ້. ຈາກນັ້ນເປີດໃຊ້ການໂທ Wi-Fi ອີກຄັ້ງຈາກການຕັ້ງຄ່າ. (ລະຫັດຂໍ້ຜິດພາດ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"ລົງທະບຽນກັບຜູ້ໃຫ້ບໍລິການຂອງທ່ານ (ລະຫັດຂໍ້ຜິດພາດ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"ການ​ໂທ %s Wi-Fi"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ມີການຮ້ອງຂໍຫຼາຍເກີນໄປ, ກະລຸນາລອງໃໝ່ພາຍຫຼັງ."</string>
<string name="notification_title" msgid="8967710025036163822">"ການເຂົ້າສູ່ລະບົບຂອງ <xliff:g id="ACCOUNT">%1$s</xliff:g> ຜິດພາດ"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ການຊິ້ງຂໍ້ມູນ"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ຊິ້ງຂໍ້ມູນ"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"ມີການລຶບ <xliff:g id="CONTENT_TYPE">%s</xliff:g> ຫຼາຍເກີນໄປ."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"ບໍ່ສາມາດຊິ້ງຂໍ້ມູນໄດ້"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"ພະຍາຍາມລຶບ <xliff:g id="CONTENT_TYPE">%s</xliff:g> ຫຼາຍເກີນໄປ."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ພື້ນທີ່ຈັດເກັບຂໍ້ມູນໃນແທັບເລັດເຕັມ. ລຶບບາງໄຟລ໌ອອກເພື່ອເພີ່ມພື້ນທີ່ຫວ່າງ."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ບ່ອນ​ຈັດ​ເກັບ​ຂໍ້​ມູນ​ໃນ​ໂມງ​ເຕັມ​ແລ້ວ. ໃຫ້​ລຶບ​ໄຟ​ລ໌​ບາງ​ອັນ​ທີ່ບໍ່​ໄດ້​ໃຊ້​ອອກ​ເພື່ອ​ເພີ່ມ​ເນື້ອ​ທີ່​ຫວ່າງ."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ບ່ອນ​ເກັບ​ຂໍ້​ມູນໂທລະພາບເຕັມ. ລຶບ​ບາງ​ໄຟ​ລ໌ ເພື່ອ​ໃຫ້​ມີ​ຊ່ອງ​ຫວ່າງ​."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"ໂດຍຜູ້ເບິ່ງແຍງໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"ໂດຍ <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ລຶບ​ໂປ​ຣ​ໄຟ​ລ໌​ບ່ອນ​ເຮັດ​ວຽກ​ແລ້ວ"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"ລຶບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກແລ້ວເນື່ອງຈາກບໍ່ມີແອັບຜູ້ເບິ່ງແຍງລະບົບ"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"ບໍ່ມີແອັບຜູ້ເບິ່ງແຍງລະບົບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ ຫຼື ເສຍຫາຍ. ຜົນກໍຄື, ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ ແລະ ຂໍ້ມູນທີ່ກ່ຽວຂ້ອງຂອງທ່ານຖືກລຶບອອກແລ້ວ. ໃຫ້ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບສຳລັບການຊ່ວຍເຫຼືອ."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານບໍ່ສາມາດໃຊ້ໄດ້ໃນອຸປະກອນນີ້ອີກຕໍ່ໄປ"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"ລອງໃສ່ລະຫັດຜ່ານຫຼາຍເທື່ອເກີນໄປ"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"ອຸປະກອນມີການຈັດການ"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"ອົງກອນຂອງທ່ານຈັດການອຸປະກອນນີ້ ແລະ ອາດກວດສອບທຣາບຟິກເຄືອຂ່າຍນຳ. ແຕະເພື່ອເບິ່ງລາຍລະອຽດ."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ຈະ​ຖືກ​ລຶບ"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"ບໍ່ສາມາດໃຊ້ແອັບຜູ້ເບິ່ງແຍງລະບົບໄດ້. ອຸປະກອນຂອງທ່ານຈະຖືກລຶບຂໍ້ມູນໃນຕອນນີ້.\n\nຫາກທ່ານມີຄຳຖາມ, ໃຫ້ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບອົງກອນຂອງທ່ານ."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"ບໍ່ສາມາດໃຊ້ແອັບຜູ້ເບິ່ງແຍງລະບົບໄດ້. ອຸປະກອນຂອງທ່ານຈະຖືກລຶບຂໍ້ມູນໃນຕອນນີ້.\n\nຫາກທ່ານມີຄຳຖາມ, ໃຫ້ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບອົງກອນຂອງທ່ານ."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"ການພິມຖືກປິດໄວ້ໂດຍ <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"ຂ້າພະເຈົ້າ"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ໂຕເລືອກແທັບເລັດ"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ໂໝດໃນຍົນ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ເປີດໂໝດຢູ່ໃນຍົນແລ້ວ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ປິດໂໝດໃນຍົນແລ້ວ"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ຕົວປະຢັດແບັດເຕີຣີ"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ຕົວປະຢັດແບັດເຕີຣີປິດຢູ່"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ຕົວປະຢັດແບັດເຕີຣີເປີດຢູ່"</string>
<string name="global_action_settings" msgid="1756531602592545966">"​ການ​ຕັ້ງ​ຄ່າ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ຕົວຊ່ວຍ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ຊ່ວຍ​ເຫຼືອ​ທາງ​ສຽງ"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ສະຫຼັບໄປໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ລາຍຊື່"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ເຂົ້າ​ຫາ​ລາຍ​ຊື່​ຂອງ​ທ່ານ"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງລາຍຊື່ຜູ້ຕິດຕໍ່ຂອງທ່ານ"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງລາຍຊື່ຜູ້ຕິດຕໍ່ຂອງທ່ານບໍ?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ສະ​ຖານ​ທີ່"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ເຂົ້າເຖິງຂໍ້ມູນສະຖານທີ່ຂອງອຸປະກອນນີ້"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງສະຖານທີ່ຂອງອຸປະກອນ"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງສະຖານທີ່ຂອງອຸປະກອນບໍ?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ປະຕິທິນ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ເຂົ້າ​ຫາ​ປະ​ຕິ​ທິນ​ຂອງ​ທ່ານ"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງປະຕິທິນຂອງທ່ານ"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງປະຕິທິນຂອງທ່ານບໍ?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"ສົ່ງ ແລະ​ເບິ່ງ​ຂໍ້​ຄວາມ SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ສົ່ງ ແລະ ອ່ານຂໍ້ຄວາມ SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ສົ່ງ ແລະ ອ່ານຂໍ້ຄວາມ SMS ບໍ?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ພື້ນທີ່ຈັດເກັບຂໍ້ມູນ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ເຂົ້າເຖິງຮູບຖ່າຍ, ສື່ ແລະໄຟລ໌ຢູ່ເທິງອຸປະກອນຂອງທ່ານ"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງຮູບພາບ, ມີເດຍ ແລະ ໄຟລ໌ຢູ່ອຸປະກອນຂອງທ່ານ"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງຮູບພາບ, ມີເດຍ ແລະ ໄຟລ໌ຢູ່ອຸປະກອນຂອງທ່ານບໍ?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"ໄມໂຄຣໂຟນ"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ບັນທຶກສຽງ"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ບັນທຶກສຽງ"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ບັນທຶກສຽງບໍ?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ກ້ອງ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ຖ່າຍ​ຮູບ ແລະ​ບັນ​ທຶກວິ​ດີ​ໂອ"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ຖ່າຍຮູບ ແລະ ບັນທຶກວິດີໂອ"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ຖ່າຍຮູບ ແລະ ບັນທຶກວິດີໂອບໍ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ໂທລະສັບ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ໂທ ແລະ​ຈັດ​ການ​ການ​ໂທ​ລະ​ສັບ"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ໂທ ແລະ ຈັດການການໂທ"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ໂທ ແລະ ຈັດການການໂທບໍ?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ເຊັນ​ເຊີ​ຮ່າງ​ກາຍ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ເຂົ້າ​ຫາ​ຂໍ້​ມູນ​ເຊັນ​ເຊີ​ກ່ຽວ​ກັບ​ສັນ​ຍານ​ຊີບ​ຂອງ​ທ່ານ"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນເຊັນເຊີກ່ຽວກັບສັນຍານຊີບຂອງທ່ານ"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນເຊັນເຊີກ່ຽວກັບສັນຍານຊີບຂອງທ່ານບໍ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ດຶງຂໍ້ມູນເນື້ອຫາໃນໜ້າຈໍ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ກວດກາເນື້ອຫາຂອງໜ້າຈໍທີ່ທ່ານກຳລັງມີປະຕິສຳພັນນຳ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ເປີດໃຊ້ \"ການສຳຫຼວດໂດຍສຳພັດ\""</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ດຳເນີນທ່າທາງຕ່າງໆ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"ສາມາດແຕະ, ປັດນີ້ວມື, ຢິບນິ້ວມື ແລະ ດຳເນີນທ່າທາງອື່ນ."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ທ່າທາງລາຍນິ້ວມື"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"ສາມາດບັນທຶກທ່າທາງທີ່ເກີດຂຶ້ນໃນອຸປະກອນເຊັນເຊີລາຍນິ້ວມືໄດ້."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"ສາມາດບັນທຶກທ່າທາງທີ່ເກີດຂຶ້ນໃນອຸປະກອນເຊັນເຊີລາຍນິ້ວມືໄດ້."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ປິດການນນຳໃຊ້ ຫຼື ແກ້ໄຂແຖບສະຖານະ"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ອະນຸຍາດໃຫ້ແອັບຯປິດການເຮັດວຽກຂອງແຖບສະຖານະ ຫຼືເພີ່ມ ແລະລຶບໄອຄອນລະບົບອອກໄດ້."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ເປັນ​ແຖບ​ສະ​ຖາ​ນະ"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ອະນຸຍາດໃຫ້ແອັບຯ ສາມາດເຮັດໃຫ້ບາງພາກສ່ວນຂອງມັນເອັງ ຄົງໂຕໃນໜ່ວຍຄວາມຈຳ. ສິ່ງນີ້ສາມາດຈຳກັດໜ່ວຍຄວາມຈຳທີ່ສາມາດໃຊ້ໄດ້ໂດຍແອັບຯອື່ນ ເຮັດໃຫ້ແທັບເລັດຊ້າລົງ."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"ອະ​ນຸ​ຍາດ​ໃຫ້​ແອັບ​ເຮັດ​ສ່ວນ​ຕ່າງໆ​ຂອງ​ມັນ​ເອງ​ໃຫ້ຕໍ່ເນື່ອງຢູ່​ໃນ​ຄວາມ​ຈຳ. ອັນ​ນີ້​ສາ​ມາດ​ຈຳ​ກັດ​ຄວາມ​ຈຳ​ທີ່​ມີ​ຢູ່​ໃຫ້​ກັບ​ແອັບ​ອື່ນ​ທີ​ເຮັດ​ໃຫ້ໂທລະພາບຊ້າ​ລົງ."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ອະນຸຍາດໃຫ້ແອັບຯເຮັດໃຫ້ສ່ວນນຶ່ງຂອງຕົນເອງ ຄົງຢູ່ຖາວອນໃນໜ່ວຍຄວາມຈຳ ເຊິ່ງອາດສາມາດ ເຮັດໃຫ້ການນຳໃຊ້ໜ່ວຍຄວາມຈຳຂອງແອັບຯ ອື່ນຖືກຈຳກັດ ສົ່ງຜົນເຮັດໃຫ້ມືຖືຂອງທ່ານເຮັດວຽກຊ້າລົງໄດ້."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ໃຊ້ບໍລິການພື້ນໜ້າ"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"ອະນຸຍາດໃຫ້ແອັບໃຊ້ບໍລິການພື້ນໜ້າ."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"ກວດສອບພື້ນທີ່ຈັດເກັບຂໍ້ມູນແອັບຯ"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"ອະນຸຍາດໃຫ້ແອັບຯດຶງໂຄດ, ຂໍ້ມູນ ແລະຂະໜາດ cache ຂອງມັນໄດ້."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ແກ້ໄຂການຕັ້ງຄ່າລະບົບ"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ປົດລັອກດ້ວຍຮູບແບບ."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ປົດລັອກດ້ວຍໜ້າ."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ປົດລັອກດ້ວຍ PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"ປົດລັອກ Sim Pin."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"ປົດລັອກ Sim Puk."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ການປົດລັອກດ້ວຍລະຫັດຜ່ານ."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ພື້ນທີ່ຮູບແບບ."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ເລື່ອນພື້ນທີ່."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"ສຳເນົາຂໍ້ຄວາມໃສ່ຄລິບບອດແລ້ວ."</string>
<string name="more_item_label" msgid="4650918923083320495">"ເພີ່ມເຕີມ"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"ເມນູ+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"Space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ລຶບ"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"ກວດເບິ່ງອັບເດດ"</string>
<string name="smv_application" msgid="3307209192155442829">"ແອັບຯ <xliff:g id="APPLICATION">%1$s</xliff:g> (ໂປຣເຊສ <xliff:g id="PROCESS">%2$s</xliff:g>) ໄດ້ລະເມີດນະໂຍບາຍ StrictMode ທີ່ບັງຄັບໃຊ້ດ້ວຍໂຕເອງ."</string>
<string name="smv_process" msgid="5120397012047462446">"ໂປຣເຊສ <xliff:g id="PROCESS">%1$s</xliff:g> ລະເມີດນະໂຍບາຍບັງຄັບໃຊ້ເອງ StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"ກຳລັງອັບເກຣດ Android..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"ກຳ​ລັງ​ເລີ່ມລະ​ບົບ​ Android …"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ກຳລັງອັບເດດໂທລະສັບ…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ກຳລັງອັບເດດແທັບເລັດ…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"ກຳລັງອັບເດດອຸປະກອນ…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ກຳລັງເລີ່ມໂທລະສັບ…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ກຳລັງເລີ່ມແທັບເລັດ…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"ກຳລັງເລີ່ມອຸປະກອນ…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ການ​ປັບ​ບ່ອນ​ເກັບ​ຂໍ້​ມູນ​ໃຫ້​ເໝາະ​ສົມ."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"ກຳລັງສຳເລັດຂັ້ນຕອນການອັບເດດ Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ບາງແອັບອາດບໍ່ສາມາດເຮັດວຽກໄດ້ປົກກະຕິຈົນກວ່າຈະອັບເກຣດສຳເລັດ"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"ກຳລັງສຳເລັດການອັບເດດລະບົບ…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"ກຳລັງອັບເກຣດ<xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"ກຳລັງ​ປັບປຸງ​ປະສິດທິພາບ​ແອັບຯ​ທີ <xliff:g id="NUMBER_0">%1$d</xliff:g> ຈາກ​ທັງ​ໝົດ <xliff:g id="NUMBER_1">%2$d</xliff:g> ແອັບຯ."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"ກຳ​ລັງ​ກຽມ <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ກຳລັງເປີດແອັບຯ."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ກຳລັງສຳເລັດການເປີດລະບົບ."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກ"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tap to return to game"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Choose game"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"For better performance, only one of these games can be open at a time."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Go back to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Open <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> will close without saving"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ເກີນ​ຂີດ​ຄວາມ​ຈຳ​ແລ້ວ"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ເກັບກຳຂໍ້ມູນ Head dump ແລ້ວ; ແຕະເພື່ອແບ່ງປັນ"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"ກວດພົບ Heap dump. ແຕະເພື່ອແບ່ງປັນ."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ແບ່ງ​ປັນ​ການ​ເທກອງ​ບໍ?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"ຂະ​ບວນ​ການ <xliff:g id="PROC">%1$s</xliff:g> ເກີນ​ຂີດ​ຈຳ​ກັດ​ຄວາມ​ຈຳ​ຂະ​ບວນ​ການ​ຂອງ​ມັນ​ຂອງ <xliff:g id="SIZE">%2$s</xliff:g> ແລ້ວ. ການ​ເທກອງ​ມີ​ໃຫ້​ສຳ​ລັບ​ທ່ານ ເພື່ອ​ແບ່ງ​ປັນ​ກັບ​ຜູ້​ພ​ັດ​ທະ​ນາ​ຂອງ​ມັນ. ລະ​ວັງ: ການ​ເທກອງ​ນີ້​ສາ​ມາດ​ມີ​ຂໍ້​ມູນ​ສ່ວນ​ຕົວ​ໃດ​ໜຶ່ງ​ຂອງ​ທ່ານ ທີ່​ແອັບ​ພ​ລິ​ເຄ​ຊັນ​ມີ​ການ​ເຂົ້າ​ຫາ."</string>
<string name="sendText" msgid="5209874571959469142">"ເລືອກການເຮັດວຽກຂອງຂໍ້ຄວາມ"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ແບບເປີດ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ຜູ້ໃຫ້ບໍລິການ"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ກຳລັງເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ແລ້ວ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ບໍ່ສາມາດເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ໄດ້"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ແຕະເພື່ອເບິ່ງເຄືອຂ່າຍທັງໝົດ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ເຊື່ອມ​ຕໍ່"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ເຄືອຂ່າຍທັງໝົດ"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ເຄືອຂ່າຍທັງໝົດ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ຈະມີການເປີດໃຊ້ Wi‑Fi ອັດຕະໂນມັດ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ເມື່ອທ່ານຢູ່ໃກ້ເຄືອຂ່າຍຄຸນນະພາບສູງທີ່ບັນທຶກໄວ້"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ບໍ່ຕ້ອງເປີດໃຊ້ຄືນໃໝ່"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"ຣີສະຕາດ"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ເປີດໃຊ້ບໍລິການມືຖື"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ກະລຸນາດາວໂຫລດແອັບຜູ້ໃຫ້ບໍລິການເພື່ອເປີດໃຊ້ SIM ໃໝ່ຂອງທ່ານ"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"ດາວໂຫລດແອັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ເພື່ອເປີດນຳໃຊ້ SIM ໃໝ່ຂອງທ່ານ"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ດາວໂຫລດແອັບ"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ໃສ່ SIM ໃໝ່ແລ້ວ"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ແຕະເພື່ອຕັ້ງມັນ"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"ເປີດໂໝດ PTP ຜ່ານ USB ແລ້ວ"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"ເປີດໂໝດ USB tethering ແລ້ວ"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"ເປີດໃຊ້ MIDI ຜ່ານ USB ແລ້ວ"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"ເປີດໂໝດອຸປະກອນເສີມ USB ແລ້ວ"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"ເຊື່ອມຕໍ່ອຸປະກອນເສີມ USB ແລ້ວ"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ແຕະເພື່ອເບິ່ງຕົວເລືອກເພີ່ມເຕີມ."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"ກຳລັງສາກອຸປະກອນທີ່ເຊື່ອມຕໍ່. ແຕະເພື່ອເບິ່ງຕົວເລືອກເພີ່ມເຕີມ."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ກວດພົບອຸປະກອນເສີມສຽງ"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ອຸປະກອນທີ່ເຊື່ອມຕໍ່ນັ້ນບໍ່ສາມາດໃຊ້ຮ່ວມກັບໂທລະສັບນີ້ໄດ້. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕໍ່ການດີບັກຜ່ານ USB ແລ້ວ"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"ແຕະເພື່ອປິດການດີບັກຜ່ານ USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"ແຕະເພື່ອປິດການດີບັກ USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"ເລືອກເພື່ອປິດການດີບັ໊ກຜ່ານ USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ກຳລັງຂໍລາຍງານຂໍ້ຜິດພາດ…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ແບ່ງປັນລາຍງານບັນຫາບໍ?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຜົນຢູເທິງແອັບອື່ນຢູ່"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຜົນບັງແອັບອື່ນຢູ່"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ຫາກທ່ານບໍ່ຕ້ອງການ <xliff:g id="NAME">%s</xliff:g> ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ປິດໄວ້"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ປິດ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"ກຳ​ລັງ​ກຽມ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ກຳລັງກວດຫາຂໍ້ຜິດພາດ"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"ກວດ​ພົບ <xliff:g id="NAME">%s</xliff:g> ໃໝ່​ແລ້ວ"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ກຳລັງເຊື່ອມຕໍ່ Always-on VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ເຊື່ອມຕໍ່ VPN ແບບເປີດຕະຫຼອດເວລາແລ້ວ"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ຕັດການເຊື່ອມຕໍ່ຈາກ VPN ແບບເປີດຕະຫຼອດແລ້ວ"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"VPN ແບບເປີດຕະຫຼອດເກີດຄວາມຜິດພາດ"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"ບໍ່ສາມາດເຊື່ອມຕໍ່ຫາ VPN ແບບເປີດຕະຫຼອດໄດ້"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"ປ່ຽນການຕັ້ງຄ່າເຄືອຂ່າຍ ຫຼື ການຕັ້ງຄ່າ VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"ເລືອກໄຟລ໌"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ບໍ່ໄດ້ເລືອກໄຟລ໌ເທື່ອ"</string>
<string name="reset" msgid="2448168080964209908">"ຣີເຊັດ"</string>
<string name="submit" msgid="1602335572089911941">"ສົ່ງຂໍ້ມູນ"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"ໂຫມດຂັບລົດຖືກເປີດແລ້ວ"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"ແຕະເພື່ອອອກຈາກໂໝດລົດ."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ແອັບຂັບລົດກຳລັງເຮັດວຽກຢູ່"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ແຕະເພື່ອອອກຈາກແອັບຂັບລົດ."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ເປີດ​ການ​ປ່ອຍ​ສັນຍານ ຫຼື​ຮັອດສະປອດ​ແລ້ວ"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ແຕະເພື່ອຕັ້ງຄ່າ."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ການປ່ອຍສັນຍານຖືກປິດໄວ້"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ດ​ຣ້າຍ"</string>
<string name="storage_usb" msgid="3017954059538517278">"ບ່ອນຈັດເກັບຂໍ້ມູນ USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ແກ້ໄຂ"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"ແຈ້ງເຕືອນການໃຊ້ອິນເຕີເນັດ"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"ແຕະເພື່ອເບິ່ງການນຳໃຊ້ ແລະ ການຕັ້ງຄ່າ."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"ໃຊ້​ຂໍ້​ມູນ 2G-3G ຮອດ​ຈຳ​ນວນ​ທີ່​ຈຳ​ກັດ​ແລ້ວ"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"ໃຊ້​ຂໍ້​ມູນ 4G ຮອດ​ຈຳ​ນວນ​ທີ່​ຈຳ​ກັດ​ແລ້ວ"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ຄຳເຕືອນຂໍ້ມູນ"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"ທ່ານໃຊ້ອິນເຕີເນັດໄປແລ້ວ <xliff:g id="APP">%s</xliff:g>"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"ຮອດຂີດຈຳກັດອິນເຕີເນັດມືຖືແລ້ວ"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ໃຊ້​ຂໍ້​ມູນ​ອິນ​ເຕີ​ເນັດ​ Wi-Fi ​ຮອດ​ຈຳ​ນວນ​ທີ່​ຈຳ​ກັດ​ແລ້ວ"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"ຂໍ້​ມູນ​ຖືກ​ຢຸດ​ຊົ່ວ​ຄາວ​ສຳ​ລັບ​ໄລ​ຍະ​ເວ​ລາ​ທີ່​ເຫຼືອ"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"ຂໍ້ມູນ 2G-3G ຮອດຂີດຈຳກັດແລ້ວ"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"ໝົດກຳນົດການນຳໃຊ້ຂໍ້ມູນ 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"ໝົດກຳນົດການນຳໃຊ້ຂໍ້ມູນໃນມືຖື"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"ໝົດກໍານົດການນຳໃຊ້ຂໍ້ມູນ Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> ເກີນທີ່ກໍາ​ນົດໄວ້."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"ຢຸດຂໍ້ມູນຊົ່ວຄາວສຳລັບຮອບທີ່ເຫຼືອຂອງທ່ານແລ້ວ"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"ເກີນຂີດຈຳກັດອິນເຕີເນັດມືຖືຂອງທ່ານ"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"ເກີນຂີດຈຳກັດອິນເຕີເນັດ Wi-Fi ຂອງທ່ານ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"ທ່ານໃຊ້ໄປ <xliff:g id="SIZE">%s</xliff:g> ເກີນທີ່ຕັ້ງຈຳກັດໄວ້"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"ຂໍ້ມູນແບັກກຣາວຖືກຈຳກັດແລ້ວ"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"ແຕະເພື່ອລຶບຂໍ້ຈຳກັດອອກ."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"ການນຳໃຊ້ຂໍ້ມູນຈຳນວນຫຼາຍ"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"ການນຳໃຊ້ຂໍ້ມູນຂອງທ່ານໃນສອງສາມມື້ທີ່ຜ່ານມານັ້ນຫຼາຍກວ່າປົກກະຕິ. ແຕະເພື່ອເບິ່ງການນຳໃຊ້ ແລະ ການຕັ້ງຄ່າ."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ໃຊ້ອິນເຕີເນັດຫຼາຍ"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"ແອັບຂອງທ່ານໃຊ້ອິນເຕີເນັດຫຼາຍກວ່າປົກກະຕິ"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ໃຊ້ອິນເຕີເນັດຫຼາຍກວ່າປົກກະຕິ"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"ໃບຮັບຮອງຄວາມປອດໄພ"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ໃບຮັບຮອງບໍ່ຖືກຕ້ອງ."</string>
<string name="issued_to" msgid="454239480274921032">"ອອກໃຫ້ແກ່:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ຖືກຕິດຕັ້ງໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ຖືກອັບໂຫລດໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ຖືກລຶບອອກໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"ເພື່ອຊ່ວຍເພີ່ມອາຍຸແບັດເຕີຣີ, ຕົວປະຢັດໄຟແບັດເຕີຣີຫຼຸດປະສິດທິພາບການເຮັດວຽກຂອງອຸປະກອນຂອງທ່ານລົງ ແລະຈຳກັດການສັ່ນ, ການບໍລິການຫາທີ່ຕັ້ງ, ແລະຂໍ້ມູນພື້ນຫຼັງເກືອບທັງໝົດ. ອີເມວ, ການສົ່ງຂໍ້ຄວາມ, ແລະແອັບອື່ນໆທີ່ອາໄສການຊິງຄ໌ອາດຈະບໍ່ອັບເດດ ນອກຈາກວ່າທ່ານເປີດມັນ.\n\nຕົວປະຢັດແບັດເຕີຣີຈະປິດອັດຕະໂນມັດ ເມື່ອອຸປະກອນຂອງທ່ານກຳລັງສາກຢູ່."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດຂໍ້ມູນຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ເປີດໃຊ້ຕົວປະຢັດຂໍ້ມູນບໍ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ເປີດໃຊ້"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">ເປັນ​ເວ​ລາ %1$d ນ​ທ (ຈົນ​ກ່​ວາ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">ເປັນ​ເວ​ລາ 1 ນ​ທ (ຈົນ​ກ່​ວາ <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">ເປັນ​ເວ​ລາ %1$d ຊົ່ວ​ໂມງ (ຈົນ​ຮອດ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">ເປັນ​ເວ​ລາ 1 ຊົ່ວ​ໂມງ (ຈົນ​ຮອດ <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">ເປັນເວລາ %1$d ຊົ່ວໂມງ (ຈົນຮອດ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">ເປັນເວລາ 1 ຊົ່ວໂມງ (ຈົນຮອດ <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">ເປັນ​ເວ​ລາ %1$d ຊມ (ຈົນ​ກ່​ວາ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">ເປັນ​ເວ​ລາ %d ນ​ທ</item>
<item quantity="one">ເປັນ​ເວ​ລາ 1 ນ​ທ</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">ເປັນ​ເວລາ​ %d ຊົ່ວ​ໂມງ</item>
- <item quantity="one">ເປັນ​ເວລາໜຶ່ງ​ຊົ່ວ​ໂມງ</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">ເປັນເວລາ %d ຊົ່ວໂມງ</item>
+ <item quantity="one">ເປັນເວລາ 1 ຊົ່ວໂມງ</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">ເປັນ​ເວ​ລາ %d ຊມ</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"ຖືກ​ປິດ​ສຽງ​ໂດຍ <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ມີ​ບັນ​ຫາ​ພາຍ​ໃນ​ກັບ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ, ແລະ​ມັນ​ອາດ​ຈະ​ບໍ່​ສະ​ຖຽນ​ຈົນ​ກວ່າ​ທ່ານ​ຕັ້ງ​ເປັນ​ຂໍ້​ມູນ​ໂຮງ​ງານ​ຄືນ​ແລ້ວ."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ມີ​ບັນ​ຫາ​ພາຍ​ໃນ​ກັບ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ. ຕິດ​ຕໍ່ຜູ້​ຜະ​ລິດ​ຂອງ​ທ່ານ​ສຳ​ລັບ​ລາຍ​ລະ​ອຽດ​ຕ່າງໆ."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"ການ​ຂໍ USSD ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ DIAL ແລ້ວ."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"ການ​ຂໍ USSD ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ SS ແລ້ວ."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"ການ​ຂໍ USSD ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ USSD ໃໝ່​ແລ້ວ."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"ການ​ຂໍ USSD ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ DIAL ວິດີໂອແລ້ວ."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"ການ​ຂໍ SS ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ DIAL ແລ້ວ."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"ການ​ຂໍ SS ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ DIAL ວິດີໂອແລ້ວ."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"ການ​ຂໍ SS ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ USSD ແລ້ວ."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"ການ​ຂໍ SS ຖືກ​ດັດ​ແປງ​ເປັນ​ການ​ຂໍ SS ໃໝ່​ແລ້ວ."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"​ໂປຣ​ໄຟລ໌​ບ່ອນ​ເຮັດ​ວຽກ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ຂະຫຍາຍ"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ຫຍໍ້ເຂົ້າ"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ກວດສອບແອັບທີ່ເປັນອັນຕະລາຍ"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ຕ້ອງການສະແດງ <xliff:g id="APP_2">%2$s</xliff:g> ສະໄລ້"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ແກ້ໄຂ"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະສັ່ນ"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະບໍ່ມີສຽງ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ການປ່ຽນແປງລະບົບ"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ຫ້າມລົບກວນ"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"ໂໝດຫ້າມລົບກວນຈະເຊື່ອງການແຈ້ງເຕືອນເພື່ອຊ່ວຍໃຫ້ທ່ານສຸມໃສ່ວຽກໄດ້"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ນີ້ເປັນພຶດຕິກຳໃໝ່. ແຕະເພື່ອປ່ຽນແປງ."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ປ່ຽນໂໝດຫ້າມລົບກວນແລ້ວ"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ແຕະເພື່ອກວດສອບການຕັ້ງຄ່າພຶດຕິກຳສຳລັບການລົບກວນ"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ແຕະເພື່ອກວດສອບວ່າມີຫຍັງຖືກບລັອກໄວ້ແດ່."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"ລະບົບ"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ການຕັ້ງຄ່າ"</string>
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 2bd910f8ef90..d91c7d3f2119 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Стандардно, повикувачот со овој ID не е ограничен. Следен повик: не е ограничен"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Услугата не е предвидена."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Не може да го промените поставувањето за ID на повикувач."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Нема услуга за интернет"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Нема итни повици"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Нема услуга за мобилен интернет"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Итните повици се недостапни"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Нема услуга за говорни повици"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Нема услуга за говорни/итни повици"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Привремено не се нуди од мобилната мрежа на вашата локација"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се дојде до мрежата"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"За подобрување на приемот, обидете се да го промените избраниот тип во „Поставки &gt; Мрежа и интернет &gt; Мобилни мрежи &gt; Претпочитан тип мрежа“."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"„Повикување преку Wi‑Fi“ е активна"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"За итните повици е потребна мобилна мрежа."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Нема говорна услуга или итни повици"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Вашиот оператор ја исклучил привремено"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобилната мрежа е недостапна"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Сменете ја претпочитаната мрежа. Допрете за промена."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Итните повици се недостапни"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Не може да остваруваат итни повици преку Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Предупредувања"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Проследување повик"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на итен повратен повик"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Банерот со роаминг е вклучен"</string>
<string name="roamingText12" msgid="1189071119992726320">"Банерот со роаминг е исклучен"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Пребарување за услуга"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Повикување преку Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"За да воспоставувате повици и да испраќате пораки преку Wi-Fi, прво побарајте од операторот да ја постави услугава. Потоа, вклучете ја повторно „Повикување преку Wi-Fi“ во „Поставки“. (Код за грешка: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Регистрирајте се кај операторот (Код на грешка: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Повикување преку Wi-Fi"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Се обработуваат премногу барања. Обидете се повторно подоцна."</string>
<string name="notification_title" msgid="8967710025036163822">"Грешка при пријавување за <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Синхронизирај"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синхронизирај"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Премногу бришења на <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Меморијата на таблетот е полна. Избришете некои датотеки за да ослободите простор."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Складот за гледање е полн. Избришете некои датотеки за да ослободите простор."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Складот на телевизорот е полн. Избришете некои датотеки за да ослободите простор."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Од администраторот на вашиот работен профил"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Од <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Работниот профил е избришан"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Работниот профил е избришан поради исчезнувањето на апликацијата на администратор"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Апликацијата на администраторот за работниот профил или исчезна или е оштетена. Како резултат на тоа, вашиот работен профил и поврзаните податоци ќе се избришат. За помош, контактирајте со администраторот."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Вашиот работен профил веќе не е достапен на уредов"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Премногу обиди за внесување лозинка"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Некој управува со уредот"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Вашата организација управува со уредов и можно е да го следи сообраќајот на мрежата. Допрете за детали."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Уредот ќе се избрише"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Апликацијата на администраторот не може да се користи. Вашиот уред сега ќе се избрише.\n\nАко имате прашања, контактирајте со администраторот на вашата организација."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Апликацијата на администраторот не може да се користи. Уредот ќе се избрише сега.\n\nАко имате прашања, контактирајте со администраторот на организацијата."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Печатењето е оневозможено од <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Јас"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Опции на таблет"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим на работа во авион"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режимот на работа во авион е вклучен"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режимот на работа во авион е исклучен"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Штедач на батерија"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Штедачот на батерија е ИСКЛУЧЕН"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Штедачот на батерија е ВКЛУЧЕН"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Поставки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Асистенција"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помош"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Префрли се на работен профил"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"пристапува до контактите"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до контактите"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Локација"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"пристапува до локацијата на овој уред"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до локацијата на уредот"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"пристапува до календарот"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до календарот"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"испраќа и прикажува SMS-пораки"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да испраќа и прегледува SMS-пораки"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Капацитет"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"пристапува до фотографии, аудио-видео и датотеки на уредот"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до фотографиите, аудио-визуелните содржини и датотеките на уредот"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"снима аудио"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да снима аудио"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"фотографира и снима видео"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да фотографира и да снима видео"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упатува и управува со телефонски повици"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да повикува и да управува со телефонските повици"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Телесни сензори"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"пристапува до податоците од сензорите за виталните знаци"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до податоците на сензорот за витални знаци"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Преземе содржина на прозорец"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ја следи содржината на прозорецот со кој се комуницира."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Вклучи „Истражувај со допир“"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Користете движења"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Може да допрете, повлечете, штипнете и да користите други движења."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Движења за отпечатоци"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Може да сними движења што се направени на сензорот за отпечатоци на уредите."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Може да сними движења што се направени на сензорот за отпечатоци на уредот."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"оневозможи или измени статусна лента"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Дозволува апликацијата да ја оневозможи статусната лента или да додава или отстранува системски икони."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"да стане статусна лента"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Овозможува апликацијата да прави трајни делови од себеси во меморијата. Ова може да ја ограничи расположливата меморија на други апликации што го забавува таблетот."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Дозволува апликацијата да направи нејзини делови да бидат постојани во меморијата. Ова може да ја ограничи меморијата достапна на другите апликации и да го забави телевизорот."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Овозможува апликацијата да прави трајни делови од себеси во меморијата. Ова може да ја ограничи расположливата меморија на други апликации што го забавува телефонот."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"извршување услуга во преден план"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Дозволува апликацијата да ги користи услугите во преден план."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"измери простор за складирање на апликацијата"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Дозволува апликацијата да ги обнови кодот, податоците и величините на кеш."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"менува системски поставки"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Отклучување со шема."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Отклучување со лик."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Отклучување со пин."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Отклучување со PIN на SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Отклучување со PUK на SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Отклучување со лозинка."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Област за шема."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Област за лизгање."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Текстот е копиран на таблата со исечоци."</string>
<string name="more_item_label" msgid="4650918923083320495">"Повеќе"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Мени+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"копче Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"копче Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"копче Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"копче Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"копче Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"копче Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"празен простор"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"внеси"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"избриши"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Провери за ажурирање"</string>
<string name="smv_application" msgid="3307209192155442829">"Апликацијата <xliff:g id="APPLICATION">%1$s</xliff:g> (процес <xliff:g id="PROCESS">%2$s</xliff:g>) ја прекрши политиката StrictMode што си ја наметна врз себеси."</string>
<string name="smv_process" msgid="5120397012047462446">"Процесот <xliff:g id="PROCESS">%1$s</xliff:g> ја прекрши својата самонаметната политика на строг режим."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android се ажурира…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android стартува…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Телефонот се ажурира…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Таблетот се ажурира…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Уредот се ажурира…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Телефонот стартува…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Таблетот стартува…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Уредот стартува…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Оптимизирање на складирањето."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Се завршува ажурирањето на Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Некои апликации може да не работат правилно додека не се заврши надградбата"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Завршува системската надградба…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> се надградува…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Се оптимизира апликација <xliff:g id="NUMBER_0">%1$d</xliff:g> од <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Се подготвува <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Се стартуваат апликациите."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Подигањето завршува."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> работи"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Допрете за да се вратите во играта"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Избор на игра"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"За подобра изведба, само една од игриве може да биде отворена."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Врати се назад во <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Отвори ја <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ќе се затвори без да се зачува"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> го надмина ограничувањето на меморијата"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Сликата од меморијата е собрана. Допрете за споделување"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Сподели слика од меморија?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Процесот <xliff:g id="PROC">%1$s</xliff:g> го надмина ограничувањето на меморијата на својот процес од <xliff:g id="SIZE">%2$s</xliff:g>. Достапна ви е слика од меморијата да ја споделите со неговиот програмер. Бидете внимателни: сликата од меморијата може да содржи кои било од вашите лични информации до кои апликацијата има пристап."</string>
<string name="sendText" msgid="5209874571959469142">"Избери дејство за текст"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Поврзете се на отворена Wi‑Fi-мрежа"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Поврзете се на Wi‑Fi-мрежа на оператор"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Поврзување на отворена Wi‑Fi-мрежа"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Се поврзавте на Wi‑Fi-мрежа"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не можеше да се поврзе на Wi‑Fi-мрежа"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Допрете за да ги видите сите мрежи"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Поврзете се"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Сите мрежи"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Сите мрежи"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ќе се вклучи автоматски"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Кога сте во близина на зачувана мрежа со висок квалитет"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не вклучувај повторно"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Рестартирај"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активирајте мобилна услуга"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Преземете ја апликацијата на операторот за да ја активирате новата SIM-картичка"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Преземете ја апликацијата <xliff:g id="APP_NAME">%1$s</xliff:g> за да ја активирате новата SIM-картичка"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Преземете апликација"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Вметната е нова SIM-картичка"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Допрете за да поставите"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Вклучен е PTP преку USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Вклучено е врзување преку USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Вклучен е MIDI преку USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Вклучен е режимот за USB-додаток"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Поврзан е USB-додаток"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Допрете за повеќе опции."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Се полни поврзаниот уред. Допрете за повеќе опции."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Откриен е аналоген аудиододаток"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Приложениот уред не е компатибилен со телефонов. Допрете за да дознаете повеќе."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Поврзано е отстранување грешки преку USB"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Допрете за да се оневозможи отстранувањето грешки преку USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Допрете за да го исклучите отстранувањето грешки преку USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Изберете за да се оневозможи отстранување грешки на USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Се зема извештајот за грешки…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Да се сподели извештајот за грешки?"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> се прикажува врз други апликации"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се прикажува врз апликации"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не сакате <xliff:g id="NAME">%s</xliff:g> да ја користи функцијава, допрете за да ги отворите поставките и исклучете ја."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИСКЛУЧИ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Исклучи"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Се подготвува <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Се проверува за грешки"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Откриена е нова <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Поврзување со секогаш вклучена VPN..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Поврзани со секогаш вклучена VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Исклучено од секогаш вклучената VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Грешка на секогаш вклучена VPN"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Променете ја мрежата или поставките за VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Избери датотека"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Не е избрана датотека"</string>
<string name="reset" msgid="2448168080964209908">"Ресетирај"</string>
<string name="submit" msgid="1602335572089911941">"Поднеси"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Овозможен е режим на автомобил"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Допрете за да излезете од автомобилски режим."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Поврзувањето или точката на пристап се активни"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Допрете за поставување."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Врзувањето е оневозможено"</string>
@@ -1421,22 +1446,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB-меморија"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB меморија"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Измени"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Известување за потрошен сообраќај"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Допрете за употреба и поставки."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Постигна лимит за 2G-3G податоци"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Постигнат лимит за 4G податоци"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Предупредување за интернет"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Потрошивте <xliff:g id="APP">%s</xliff:g> интернет"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Достигнат лимит за моб. интернет"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Постигна лимит за Wi-Fi податоци"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Паузирано до крај на циклус"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Надминат лимит од 2G-3G податоци"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Надминат лимит од 4G податоци"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Надминат лимит на подат. од моб."</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Надминат лимит на Wi-Fi податоци"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> над назначената граница."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Интернетот е паузиран за остатокот од циклусот"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Надминат мобилен интернет"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Надминат интернет преку Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Потрошивте <xliff:g id="SIZE">%s</xliff:g> над поставеното ограничување"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Подат. од заднина се ограничени"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Допрете за да се отст. огранич."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Голема потрошувачка на сообраќај"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Потрошениот сообраќај во изминативе неколку дена е поголем од нормално. Допрете за да ги видите сообраќајот и поставките."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Големо трошење мобилен интернет"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Апликациите потрошија повеќе интернет од вообичаено"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> потроши повеќе интернет од вообичаено"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Сертификат за безбедност"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Овој сертификат е важечки."</string>
<string name="issued_to" msgid="454239480274921032">"Издадено на:"</string>
@@ -1672,7 +1694,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Инсталирано од администраторот"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Ажурирано од администраторот"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Избришано од администраторот"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"За да ви помогне да ја подобрите трајноста на батеријата, штедачот на батеријата ја намалува изведбата на уредот и ги ограничува вибрациите, услугите за локација и повеќето податоци од заднина. Е-пошта, Пораки и другите апликации што користат синхронизација можеби нема да се ажурираат ако не ги отворите.\n\nШтедачот на батеријата автоматски се исклучува кога уредот се полни."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"За да се намали користењето интернет, Штедачот на интернет спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Апликацијата што ја користите во моментов можеби ќе пристапува до интернет, но тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажат додека не ги допрете."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Вклучете Штедач на интернет?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Вклучи"</string>
@@ -1684,9 +1707,9 @@
<item quantity="one">За %1$d мин. (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">За %1$d мин. (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">За %1$d час (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">За %1$d часа (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">%1$d час (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">%1$d часа (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">За %1$d ч. (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1700,9 +1723,9 @@
<item quantity="one">За %d мин.</item>
<item quantity="other">За %d мин.</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">За % d час</item>
- <item quantity="other">За % d часа</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">%d час</item>
+ <item quantity="other">%d часа</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">За %d ч.</item>
@@ -1723,14 +1746,22 @@
<string name="muted_by" msgid="6147073845094180001">"Звукот го исклучи <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Настана внатрешен проблем со уредот и може да биде нестабилен сè додека не ресетирате на фабричките податоци."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Настана внатрешен проблем со уредот. Контактирајте го производителот за детали."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Барањето USSD е изменето во барање DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Барањето USSD е изменето во барање SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Барањето USSD е изменето во ново барање USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Барањето USSD е изменето во барање видео DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Барањето SS е изменето во барање DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Барањето SS е изменето во барање видео DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Барањето SS е изменето во барање USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Барањето SS е изменето во ново барање SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Работен профил"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Прошири"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Собери"</string>
@@ -1840,7 +1871,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Откриена е штетна апликација"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> сака да прикажува делови од <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Измени"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Повиците и известувањата ќе вибрираат"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Повиците и известувањата нема да имаат звук"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системски промени"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Не вознемирувај"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"„Не вознемирувај“ ги крие известувањата за да ви помогне да се фокусирате"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Ова е ново однесување. Допрете за промена."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Поставките за „Не вознемирувај“ се изменија"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Допрете за да ги проверите поставките за однесување при прекини"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Допрете за да проверите што е блокирано."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 340d7f90db08..ca175d8a67a8 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"നിയന്ത്രിക്കേണ്ടതല്ലാത്ത സ്ഥിര കോളർ ഐഡികൾ. അടുത്ത കോൾ: നിയന്ത്രിച്ചിട്ടില്ല"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"സേവനം വ്യവസ്ഥ ചെയ്‌തിട്ടില്ല."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"വിളിച്ച നമ്പർ ക്രമീകരണം നിങ്ങൾക്ക് മാറ്റാനാവില്ല."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ഡാറ്റ ‌സേവനം ലഭ്യമല്ല"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"എമർജൻസി കോളിംഗ് സാധ്യമല്ല"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"മൊബൈൽ ഡാറ്റാ സേവനമില്ല"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"എമർജൻസി കോളിംഗ് ലഭ്യമല്ല"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"വോയ്സ് സേവനമില്ല"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"വോയ്സ്/അടിയന്തിര സേവനമില്ല"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"നിങ്ങളുടെ ലൊക്കേഷനിൽ മൊബൈൽ നെറ്റ്‌വര്‍ക്ക് താൽക്കാലികമായി ലഭ്യമല്ല"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനാവുന്നില്ല"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"റിസപ്‌ഷൻ മെച്ചപ്പെടുത്താൻ, ക്രമീകരണം &gt; നെറ്റ്‌വർക്കും ഇ‌ന്റർനെറ്റും &gt; മൊബൈൽ നെറ്റ്‌വർക്കുകൾ &gt; തിരഞ്ഞെടുത്ത നെറ്റ്‌വർക്ക് തരം എന്നതിൽ തിരഞ്ഞെടുത്തിരിക്കുന്ന തരം മാറ്റുന്നത് പരീക്ഷിക്കുക."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"വൈ-ഫൈ കോളിംഗ് സജീവമാണ്"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"എമർജൻസി കോളുകൾ ചെയ്യാൻ ഒരു മൊബൈൽ നെറ്റ്‌വർക്ക് ആവശ്യമാണ്."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ശബ്‌ദ സേവനമോ എമർജൻസി കോളിംഗോ ഇല്ല"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"നിങ്ങളുടെ കാരിയർ താൽക്കാലികമായി ഓഫാക്കി"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"മൊബൈൽ നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യാനാവുന്നില്ല"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"തിര‌ഞ്ഞെടുത്ത നെറ്റ്‌വർക്ക് മാറ്റുന്നത് പരീക്ഷിക്കുക. മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"എമർജൻസി കോളിംഗ് ലഭ്യമല്ല"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"വൈഫൈ വഴി എമർജൻസി കോളുകൾ ചെയ്യാനാകില്ല"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"അലേർട്ടുകൾ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"കോൾ ഫോർവേഡിംഗ്"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"അടിയന്തര കോൾബാക്ക് മോഡ്"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"റോമിംഗ് ബാനർ ഓണാക്കുക"</string>
<string name="roamingText12" msgid="1189071119992726320">"റോമിംഗ് ബാനർ ഓഫാക്കുക"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"സേവനത്തിനായി തിരയുന്നു"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"വൈഫൈ കോളിംഗ്"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"വൈഫൈ വഴി കോളുകൾ ചെയ്യാനും സന്ദേശങ്ങൾ അയയ്‌ക്കാനും ആദ്യം നിങ്ങളുടെ കാരിയറോട് ഈ സേവനം സജ്ജമാക്കാൻ ആവശ്യപ്പെടുക. ക്രമീകരണത്തിൽ നിന്ന് വീണ്ടും വൈഫൈ കോളിംഗ് ഓണാക്കുക. (പിശക് കോഡ്: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"നിങ്ങളുടെ കാരിയറുമായി രജിസ്‌റ്റർ ചെയ്യുക (പിശക് കോഡ്: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s വൈഫൈ കോളിംഗ്"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"നിരവധി അഭ്യർത്ഥനകൾ പ്രോസസ്സ് ചെയ്യുന്നു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> എന്നതിൽ സൈൻ ഇൻ ചെയ്യുന്നതിൽ പിശക്"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"സമന്വയിപ്പിക്കുക"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"സമന്വയിപ്പിക്കുക"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"വളരെയധികം <xliff:g id="CONTENT_TYPE">%s</xliff:g> ഇല്ലാതാക്കുന്നു."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ടാബ്‌ലെറ്റ് സ്റ്റോറേജ് കഴിഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ ചില ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"വാച്ചിലെ സ്റ്റോറേജ് നിറഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ കുറച്ച് ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ടിവി സ്റ്റോറേജ് നിറഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ കുറച്ച് ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ അഡ്‌മിൻ മുഖേന"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> നിരീക്ഷിക്കാം"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ഔദ്യോഗിക പ്രൊഫൈൽ ഇല്ലാതാക്കി"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"അഡ്‌മിൻ ആപ്പ് വിട്ടുപോയിരിക്കുന്നതിനാൽ ഔദ്യോഗിക പ്രൊഫൈൽ ഇല്ലാതാക്കി"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"ഔദ്യോഗിക പ്രൊഫൈൽ അഡ്‌മിൻ ആപ്പ് വിട്ടുപോയിരിക്കുന്നു അല്ലെങ്കിൽ കേടായിരിക്കുന്നു. ഫലമായി, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലും ബന്ധപ്പെട്ട വിവരങ്ങളും ഇല്ലാതാക്കിയിരിക്കുന്നു. സഹായത്തിന് അഡ്‌മിനെ ബന്ധപ്പെടുക."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"ഈ ഉപകരണത്തിൽ തുടർന്നങ്ങോട്ട് നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ ലഭ്യമല്ല"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"വളരെയധികം പാസ്‌വേഡ് ശ്രമങ്ങൾ"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"ഉപകരണം മാനേജുചെയ്യുന്നുണ്ട്"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"നിങ്ങളുടെ സ്ഥാപനമാണ് ഈ ഉപകരണം മാനേജുചെയ്യുന്നത്, നെറ്റ്‌വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കുകയും ചെയ്തേക്കാം, വിശദാംശങ്ങൾ അറിയാൻ ടാപ്പുചെയ്യുക."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"നിങ്ങളുടെ ഉപകരണം മായ്‌ക്കും"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"അഡ്‌മിൻ ആപ്പ് ഉപയോഗിക്കാൻ കഴിയില്ല. നിങ്ങളുടെ ഉപകരണം ഇപ്പോൾ മായ്ക്കപ്പെടും.\n\nനിങ്ങൾക്ക് ചോദ്യങ്ങൾ ഉണ്ടെങ്കിൽ, നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ അഡ്‌മിനെ ബന്ധപ്പെടുക."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"അഡ്‌മിൻ ആപ്പ് ഉപയോഗിക്കാനാകില്ല. നിങ്ങളുടെ ഉപകരണം ഇപ്പോൾ മായ്ക്കപ്പെടും.\n\nനിങ്ങൾക്ക് ചോദ്യങ്ങൾ ഉണ്ടെങ്കിൽ, നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ അഡ്‌മിനെ ബന്ധപ്പെടുക."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> പ്രിന്റിംഗ് പ്രവർത്തനരഹിതമാക്കി."</string>
<string name="me" msgid="6545696007631404292">"ഞാന്‍"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ടാബ്‌ലെറ്റ് ഓപ്‌ഷനുകൾ"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ഫ്ലൈറ്റ് മോഡ്"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ഫ്ലൈറ്റ് മോഡ് ഓണാണ്"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ഫ്ലൈറ്റ് മോഡ് ഓഫാണ്"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ബാറ്ററി ലാഭിക്കൽ"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ബാറ്ററി സേവർ ഓഫാണ്"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ബാറ്ററി ലാഭിക്കൽ ഓണാണ്"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ക്രമീകരണം"</string>
<string name="global_action_assist" msgid="3892832961594295030">"അസിസ്റ്റ്"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"വോയ്‌സ് സഹായം"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് മാറുക"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"കോൺടാക്റ്റുകൾ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ ആക്‌സസ്സ് ചെയ്യുക"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"നിങ്ങളുടെ കോണ്‍ടാക്റ്റുകള്‍ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"ലൊക്കേഷൻ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"കലണ്ടർ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"നിങ്ങളുടെ കലണ്ടർ ആക്‌സസ്സ് ചെയ്യുക"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"നിങ്ങളുടെ കലണ്ടർ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS സന്ദേശങ്ങൾ അയയ്‌ക്കുകയും കാണുകയും ചെയ്യുക"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"SMS സന്ദേശങ്ങൾ അയയ്ക്കാനും കാണാനും &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"സ്റ്റോറേജ്"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"നിങ്ങളുടെ ഉപകരണത്തിലെ ഫോട്ടോകളും മീഡിയയും ഫയലുകളും ആക്സസ് ചെയ്യുക"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"നിങ്ങളുടെ ഉപകരണത്തിലെ ഫോട്ടോകളും മീഡിയയും ഫയലുകളും ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"മൈക്രോഫോണ്‍"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ഓഡിയോ റെക്കോർഡ് ചെയ്യുക"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"ഓഡിയോ റെക്കോർഡുചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"ക്യാമറ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ചിത്രങ്ങളെടുത്ത് വീഡിയോ റെക്കോർഡുചെയ്യുക"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"ചിത്രം എടുക്കാനും വീഡിയോ റെക്കോർഡുചെയ്യാനും &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"ഫോണ്‍"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ഫോൺ വിളിക്കുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"ഫോൺ കോളുകൾ ചെയ്യാനും അവ മാനേജുചെയ്യാനും &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"ബോഡി സെൻസറുകൾ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"നിങ്ങളുടെ ജീവാധാര ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"നിങ്ങളുടെ ജീവധാരണ ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ വിവരങ്ങൾ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"വിൻഡോ ഉള്ളടക്കം വീണ്ടെടുക്കുക"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"നിങ്ങൾ സംവദിക്കുന്ന ഒരു വിൻഡോയുടെ ഉള്ളടക്കം പരിശോധിക്കുക."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"സ്‌പർശനം വഴി പര്യവേക്ഷണം ചെയ്യുക ഓൺ ചെയ്യുക"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ജെസ്‌റ്ററുകൾ നിർവഹിക്കുക"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"ടാപ്പുചെയ്യാനോ സ്വൈപ്പുചെയ്യാനോ പിഞ്ചുചെയ്യാനോ മറ്റ് ജെസ്‌റ്ററുകൾ നിർവഹിക്കാനോ കഴിയും."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ഫിംഗർപ്രിന്റ് ജെസ്‌റ്ററുകൾ"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"ഉപകരണത്തിന്റെ ഫിംഗർപ്രിന്റ് സെൻസറിൽ ചെയ്‌ത ജെസ്‌റ്ററുകൾ ക്യാപ്‌ചർ ചെയ്യാനാകും."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"ഉപകരണത്തിന്റെ വിരലടയാള സെൻസറിൽ ചെയ്‌ത ജെസ്‌റ്ററുകൾ ക്യാപ്‌ചർ ചെയ്യാനാകും."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"സ്റ്റാറ്റസ് ബാർ പ്രവർത്തനരഹിതമാക്കുക അല്ലെങ്കിൽ പരിഷ്‌ക്കരിക്കുക"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"നില ബാർ പ്രവർത്തരഹിതമാക്കുന്നതിന് അല്ലെങ്കിൽ സിസ്‌റ്റം ഐക്കണുകൾ ചേർക്കുന്നതിനും നീക്കംചെയ്യുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"സ്റ്റാറ്റസ് ബാർ ആയിരിക്കുക"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"മെമ്മറിയിൽ അപ്ലിക്കേഷനുകളുടെ ഭാഗങ്ങൾ നിലനിർത്താൻ സ്വയം അനുവദിക്കുന്നു. ഇത് ടാബ്‌ലെറ്റിനെ മന്ദഗതിയിലാക്കുന്ന വിധത്തിൽ മറ്റ് അപ്ലിക്കേഷനുകൾക്ക് ലഭ്യമായ മെമ്മറി പരിമിതപ്പെടുത്താനിടയുണ്ട്."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"മെമ്മറിയിൽ സ്ഥിരതയുള്ളതാക്കുന്നതിന് അപ്ലിക്കേഷൻ അനുവദിക്കുന്നു. ടിവിയെ സാവധാനത്തിലാക്കുന്ന മറ്റ് അപ്ലിക്കേഷനുകളിലേക്കുള്ള മെമ്മറി ലഭ്യതയെ ഇതിന് പരിമിതമാക്കാനാവും."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"മെമ്മറിയിൽ അപ്ലിക്കേഷനുകളുടെ ഭാഗങ്ങൾ നിലനിർത്താൻ സ്വയം അനുവദിക്കുന്നു. ഇത് ഫോണിനെ മന്ദഗതിയിലാക്കുന്ന വിധത്തിൽ മറ്റ് അപ്ലിക്കേഷനുകൾക്ക് ലഭ്യമായ മെമ്മറി പരിമിതപ്പെടുത്താനിടയുണ്ട്."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"മുൻവശത്തുള്ള സേവനം റൺ ചെയ്യുക"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"മുൻവശത്തുള്ള സേവനങ്ങൾ ഉപയോഗിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"അപ്ലിക്കേഷൻ സംഭരണയിടം അളക്കുക"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"അപ്ലിക്കേഷന്റെ കോഡ്, ഡാറ്റ, കാഷെ വലുപ്പങ്ങൾ എന്നിവ വീണ്ടെടുക്കുന്നതിന് അതിനെ അനുവദിക്കുക"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"സിസ്റ്റം ക്രമീകരണങ്ങൾ പരിഷ്‌ക്കരിക്കുക"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"പാറ്റേൺ അൺലോക്ക്."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക്."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"പിൻ അൺലോക്ക്."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"സിം പിൻ അൺലോക്ക്."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"സിം Puk അൺലോക്ക്."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"പാസ്‌വേഡ് അൺലോക്ക്."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"പാറ്റേൺ ഏരിയ."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"സ്ലൈഡ് ഏരിയ."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"ടെക്‌സ്റ്റ് ക്ലിപ്‍ബോർഡിലേക്ക് പകർത്തി."</string>
<string name="more_item_label" msgid="4650918923083320495">"കൂടുതൽ"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"മെനു+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"മെറ്റ+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"ഫംഗ്ഷന്‍+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"അപ്‌ഡേറ്റിനായി പരിശോധിക്കുക"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> എന്ന അപ്ലിക്കേഷൻ (<xliff:g id="PROCESS">%2$s</xliff:g> പ്രോസസ്സ്) അതിന്റെ സ്വയം നിർബന്ധിത StrictMode നയം ലംഘിച്ചു."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> എന്ന പ്രോസസ്സ് അതിന്റെ സ്വയം നടപ്പിലാക്കിയ StrictMode നയം ലംഘിച്ചു."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android അപ്ഗ്രേഡുചെയ്യുന്നു…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android ആരംഭിക്കുന്നു…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ഫോൺ അപ്‌ഡേറ്റ് ചെയ്യുന്നു…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ടാബ്‌ലെറ്റ് അപ്‌ഡേറ്റ് ചെയ്യുന്നു…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"ഉപകരണം അപ്‌ഡേറ്റ് ചെയ്യുന്നു…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ഫോൺ ആരംഭിക്കുന്നു…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ടാബ്‌ലെറ്റ് ആരംഭിക്കുന്നു…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"ഉപകരണം ആരംഭിക്കുന്നു…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"സ്റ്റോറേജ് ഒപ്‌റ്റിമൈസ് ചെയ്യുന്നു."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android അപ്ഡേറ്റ് പൂർത്തിയാക്കുന്നു…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"അപ്‌ഗ്രേഡ് പൂർത്തിയാകുന്നത് വരെ ചില ആപ്‌സ് ശരിയായി പ്രവർത്തിച്ചേക്കില്ല"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"സിസ്‌റ്റം അപ്‌ഡേറ്റ് പൂർത്തിയാക്കുന്നു…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> അപ്ഗ്രേഡ് ചെയ്യുന്നു…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g> അപ്ലിക്കേഷൻ ഓപ്റ്റിമൈസ് ചെയ്യുന്നു."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> തയ്യാറാക്കുന്നു."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"അപ്ലിക്കേഷനുകൾ ആരംഭിക്കുന്നു."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ബൂട്ട് ചെയ്യൽ പൂർത്തിയാകുന്നു."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> പ്രവർത്തിക്കുന്നു"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"ഗെയിമിലേക്ക് മടങ്ങാൻ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ഗെയിം തിരഞ്ഞെടുക്കുക"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"മികച്ച പ്രകടനത്തിനായി, ഈ ഗെയിമുകളിൽ ഒന്ന് മാത്രമേ ഒരു സമയത്ത് തുറക്കാനാവൂ."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g>-ലേക്ക് തിരികെ പോവുക"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> തുറക്കുക"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> സംരക്ഷിക്കാതെ അവസാനിപ്പിക്കും"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> മെമ്മറി പരിധി കവിഞ്ഞു"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ഹീപ്പ് ഡംപ് ശേഖരിച്ചു; പങ്കിടാൻ ടാപ്പുചെയ്യുക"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"ഹീപ്പ് ഡംപ് പങ്കിടണോ?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> പ്രോസസ്സ് അതിന്റെ മെമ്മറി പരിധിയായ <xliff:g id="SIZE">%2$s</xliff:g> കവിഞ്ഞു. അതിന്റെ ഡവലപ്പറുമായി പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് നിങ്ങൾക്ക് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: ഈ ഹീപ്പ് ഡംപിൽ അപ്ലിക്കേഷന് ആക്‌സസ്സുള്ള ഏതെങ്കിലും സ്വകാര്യ വിവരങ്ങൾ അടങ്ങിയിരിക്കാം."</string>
<string name="sendText" msgid="5209874571959469142">"വാചകസന്ദേശത്തിനായി ഒരു പ്രവർത്തനം തിരഞ്ഞെടുക്കുക"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ലഭ്യമായ വൈഫൈ നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"കാരിയർ വൈഫൈ നെറ്റ്‍വര്‍ക്കിലേക്ക് കണക്റ്റ് ചെയ്യുക"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ലഭ്യമായ വൈഫൈ നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യുന്നു"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"വൈഫൈ നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റു‌ചെയ്‌‌തു"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"വൈ-ഫൈ നെറ്റ്‌വർക്കിലേക്ക് കണക്‌റ്റുചെയ്യാനായില്ല"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"എല്ലാ നെറ്റ്‌വർക്കുകളും കാണാൻ ടാപ്പുചെയ്യുക"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"കണക്റ്റുചെയ്യുക"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"എല്ലാ നെറ്റ്‌വർക്കുകളും"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"എല്ലാ നെറ്റ്‌വർക്കുകളും"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"വൈഫൈ സ്വമേധയാ ഓണാകും"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"നിങ്ങൾ ഉയർന്ന നിലവാരമുള്ള സംരക്ഷിക്കപ്പെട്ട നെറ്റ്‌വർക്കിനരികിലെത്തുമ്പോൾ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"തിരികെ ഓണാക്കരുത്"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"പുനരാരംഭിക്കുക"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"മൊബൈൽ സേവനം സജീവമാക്കുക"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"പുതിയ സിം സജീവമാക്കാൻ കാരിയർ ആപ്പ് ഡൗൺലോഡ് ചെയ്യുക"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"പുതിയ സിം സജീവമാക്കാൻ <xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പ് ഡൗൺലോഡ് ചെയ്യുക"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ആപ്പ് ഡൗൺലോഡ് ചെയ്യുക"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"പുതിയ സിം ഇട്ടു"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ഇത് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB വഴിയുള്ള PTP ഓണാക്കി"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ടെതറിംഗ് ഓണാക്കി"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB വഴിയുള്ള MIDI ഓണാക്കി"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ആക്‌സസറി മോഡ് ഓണാക്കി"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB ആക്‌സസറി കണക്റ്റ് ചെയ്തു"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"കൂടുതൽ ഓപ്ഷനുകൾക്ക് ടാപ്പുചെയ്യുക."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"കണക്‌റ്റ് ചെയ്‌ത ഉപകരണം ചാർജ് ചെയ്യുന്നു. കൂടുതൽ ഓപ്ഷനുകൾക്ക് ടാപ്പ് ചെയ്യുക."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"അനലോഗ് ഓഡിയോ ആക്‌സസറി കണ്ടെത്തി"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"അറ്റാച്ചുചെയ്‌ത ഉപകരണം ഈ ഫോണിന് അനുയോജ്യമല്ല. കൂടുതലറിയാൻ ടാപ്പുചെയ്യുക."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ഡീബഗ്ഗിംഗ് കണക്റ്റ് ചെയ്തു"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB ഡീബഗ്ഗിംഗ് പ്രവർത്തനരഹിതമാക്കാൻ ടാപ്പുചെയ്യുക."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB ഡീബഗ്ഗിംഗ് ഓഫാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ഡീബഗ്ഗുചെയ്യൽ പ്രവർത്തനരഹിതമാക്കാൻ തിരഞ്ഞെടുക്കുക."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ബഗ് റിപ്പോർട്ട് എടുക്കുന്നു…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ബഗ് റിപ്പോർട്ട് പങ്കിടണോ?"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ഈ ഫീച്ചർ ഉപയോഗിക്കുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ടാപ്പുചെയ്‌ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ഓഫാക്കുക"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ഓഫാക്കുക"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> തയ്യാറാകുന്നു"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"പിശകുകളുണ്ടോയെന്നു പരിശോധിക്കുന്നു"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"പുതിയ <xliff:g id="NAME">%s</xliff:g> എന്നതിനെ തിരിച്ചറിഞ്ഞു"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"എല്ലായ്‌പ്പോഴും ഓണായിരിക്കുന്ന VPN കണക്റ്റുചെയ്യുന്നു…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"എല്ലായ്‌പ്പോഴും ഓണായിരിക്കുന്ന VPN കണക്റ്റുചെയ്‌തു"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"എപ്പോഴും ഓണായിരിക്കുന്ന VPN-ൽ നിന്ന് വിച്ഛേദിച്ചു"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"എല്ലായ്‌പ്പോഴും ഓണായിരിക്കുന്ന VPN പിശക്"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"നെറ്റ്‍വര്‍ക്ക് അല്ലെങ്കിൽ VPN ക്രമീകരണം മാറ്റുക"</string>
<string name="upload_file" msgid="2897957172366730416">"ഫയല്‍‌ തിരഞ്ഞെടുക്കുക"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ഫയലൊന്നും തിരഞ്ഞെടുത്തില്ല"</string>
<string name="reset" msgid="2448168080964209908">"പുനഃസജ്ജമാക്കുക"</string>
<string name="submit" msgid="1602335572089911941">"സമർപ്പിക്കുക"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"കാർ മോഡ് പ്രവർത്തനക്ഷമമാക്കി"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"കാർ മോഡിൽ നിന്ന് പുറത്തുകടക്കാൻ ടാപ്പുചെയ്യുക."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"ടെതറിംഗ് അല്ലെങ്കിൽ ഹോട്ട്സ്‌പോട്ട് സജീവമാണ്"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"സജ്ജമാക്കാൻ ടാപ്പുചെയ്യുക."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ടെതറിംഗ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ഡ്രൈവ്"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB സ്റ്റോറേജ്"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"എഡിറ്റുചെയ്യുക"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"ഡാറ്റാ ഉപയോഗ മുന്നറിയിപ്പ്"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"ഉപയോഗവും ക്രമീകരണവും കാണാൻ ടാപ്പുചെയ്യുക."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ഡാറ്റ പരിധിയിലെത്തി"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ഡാറ്റ പരിധിയിലെത്തി"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ഡാറ്റാ മുന്നറിയിപ്പ്"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"നിങ്ങൾ ഡാറ്റയുടെ <xliff:g id="APP">%s</xliff:g> ഉപയോഗിച്ചു"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"മൊബൈൽ ഡാറ്റ പരിധി എത്തി"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"വൈഫൈ ഡാറ്റ പരിധിയിലെത്തി"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"ശേഷിക്കുന്ന പ്രവർത്തനങ്ങൾക്കായി ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G ഡാറ്റ പരിധി കവിഞ്ഞു"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ഡാറ്റ പരിധി കവിഞ്ഞു"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"മൊബൈൽ ഡാറ്റ പരിധി കവിഞ്ഞു"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"വൈഫൈ ഡാറ്റ പരിധി കവിഞ്ഞു"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"നിശ്ചിത പരിധിയിലും <xliff:g id="SIZE">%s</xliff:g> കൂടുതലാണ്."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"ശേഷിക്കുന്ന കാലയളവിലേക്കുള്ള ഡാറ്റ താൽക്കാലികമായി നിർത്തിയിരിക്കുന്നു"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"മൊബൈൽ ഡാറ്റ പരിധി കവിഞ്ഞു"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"വൈഫൈ ഡാറ്റ പരിധി കവിഞ്ഞു"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"സജ്ജീകരിച്ച പരിധിയേക്കാൾ <xliff:g id="SIZE">%s</xliff:g> കവിഞ്ഞു"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"പശ്ചാത്തല ഡാറ്റ പരിമിതപ്പെടുത്തി"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"നിയന്ത്രണം നീക്കംചെയ്യാൻ ടാപ്പുചെയ്യുക."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"കൂടുതൽ ഡാറ്റ ഉപയോഗം"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"കഴിഞ്ഞ കുറച്ച് ദിവസത്തെ നിങ്ങളുടെ ഡാറ്റ ഉപയോഗം സാധാരണയേക്കാൾ കൂടുതലാണ്. ഉപയോഗവും ക്രമീകരണവും കാണാൻ ടാപ്പ് ചെയ്യുക."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ഉയർന്ന മൊബൈൽ ഡാറ്റ ഉപയോഗം"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"നിങ്ങളുടെ ആപ്പുകൾ സാധാരണയേക്കാൾ കൂടുതൽ ഡാറ്റ ഉപയോഗിച്ചു"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> സാധാരണയേക്കാൾ കൂടുതൽ ഡാറ്റ ഉപയോഗിച്ചു"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"സുരക്ഷ സർട്ടിഫിക്കറ്റ്"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ഈ സര്‍ട്ടിഫിക്കറ്റ് സാധുതയുള്ളതാണ്."</string>
<string name="issued_to" msgid="454239480274921032">"ഇതിലേക്ക് നൽകി:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"നിങ്ങളുടെ അഡ്‌മിൻ ഇൻസ്റ്റാൾ ചെയ്യുന്നത്"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"നിങ്ങളുടെ അഡ്‌മിൻ അപ്‌ഡേറ്റ് ചെയ്യുന്നത്"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"നിങ്ങളുടെ അഡ്‌മിൻ ഇല്ലാതാക്കുന്നത്"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"ബാറ്ററി ആയുസ്സ് മെച്ചപ്പെടുത്താൻ സഹായിക്കുന്നതിന്, ബാറ്ററി ലാഭിക്കൽ ഉപകരണത്തിന്‍റെ പ്രകടനത്തെ കുറയ്ക്കുകയും വൈബ്രേഷൻ, ലൊക്കേഷൻ സേവനങ്ങൾ, ഭൂരിഭാഗം പശ്ചാത്തല ഡാറ്റ എന്നിവയെ പരിമിതപ്പെടുത്തുകയും ചെയ്യുന്നു. സമന്വയത്തെ ആശ്രയിച്ചുള്ള ഇമെയിൽ, സന്ദേശമയയ്‌ക്കൽ, മറ്റ് ആപ്പുകൾ എന്നിവ തുറക്കാത്ത പക്ഷം അപ്ഡേറ്റാകാൻ സാധ്യതയില്ല.\n\nനിങ്ങളുടെ ഉപകരണം ചാർജ് ചെയ്യുമ്പോൾ ബാറ്ററി ലാഭിക്കൽ സ്വയം ഓഫാകും."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ഡാറ്റാ ഉപയോഗം കുറയ്ക്കാൻ സഹായിക്കുന്നതിന്, പശ്ചാത്തലത്തിൽ ഡാറ്റ അയയ്ക്കുകയോ സ്വീകരിക്കുകയോ ചെയ്യുന്നതിൽ നിന്ന് ചില ആപ്‌സിനെ ഡാറ്റ സേവർ തടയുന്നു. നിങ്ങൾ നിലവിൽ ഉപയോഗിക്കുന്ന ഒരു ആപ്പിന് ഡാറ്റ ആക്സസ്സ് ചെയ്യാൻ കഴിയും, എന്നാൽ കുറഞ്ഞ ആവൃത്തിയിലാണിത് നടക്കുക. ഇതിനർത്ഥം, നിങ്ങൾ ടാപ്പുചെയ്യുന്നത് വരെ ചിത്രങ്ങൾ കാണിക്കുകയില്ല എന്നാണ്."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ഡാറ്റ സേവർ ഓണാക്കണോ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ഓണാക്കുക"</string>
@@ -1682,9 +1705,9 @@
<item quantity="other">%1$d മിനിറ്റത്തേക്ക് (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> വരെ)</item>
<item quantity="one">ഒരു മിനിറ്റത്തേക്ക് (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> വരെ)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d മണിക്കൂർ സമയത്തേക്ക് (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> വരെ)</item>
- <item quantity="one">ഒരു മണിക്കൂർ സമയത്തേക്ക് (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> വരെ)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d മണിക്കൂർ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> വരെ)</item>
+ <item quantity="one">ഒരു മണിക്കൂർ (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> വരെ)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d മണിക്കൂറത്തേക്ക് (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> വരെ)</item>
@@ -1698,9 +1721,9 @@
<item quantity="other">%d മിനിറ്റത്തേക്ക്</item>
<item quantity="one">ഒരു മിനിറ്റത്തേക്ക്</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">%d മണിക്കൂർ സമയത്തേക്ക്</item>
- <item quantity="one">ഒരു മണിക്കൂർ സമയത്തേക്ക്</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d മണിക്കൂർ</item>
+ <item quantity="one">ഒരു മണിക്കൂർ</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d മണിക്കൂറത്തേക്ക്</item>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>, മ്യൂട്ടുചെയ്‌തു"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്‌നമുണ്ട്, ഫാക്‌ടറി വിവര പുനഃസജ്ജീകരണം ചെയ്യുന്നതുവരെ ഇതു അസ്ഥിരമായിരിക്കാനിടയുണ്ട്."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്‌നമുണ്ട്. വിശദാംശങ്ങൾക്കായി നിർമ്മാതാവിനെ ബന്ധപ്പെടുക."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD അഭ്യർത്ഥന, DIAL അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD അഭ്യർത്ഥന, SS അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD അഭ്യർത്ഥന, പുതിയ USSD അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD അഭ്യർത്ഥന, വീഡിയോ DIAL അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS അഭ്യർത്ഥന, DIAL അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS അഭ്യർത്ഥന, വീഡിയോ DIAL അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS അഭ്യർത്ഥന, USSD അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS അഭ്യർത്ഥന, പുതിയ SS അഭ്യർത്ഥനയായി പരിഷ്‌ക്കരിച്ചു."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"വികസിപ്പിക്കുക"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ചുരുക്കുക"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ദോഷകരമായ ആപ്പ് കണ്ടെത്തി"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> സ്ലൈസുകൾ കാണിക്കാൻ <xliff:g id="APP_0">%1$s</xliff:g> താൽപ്പര്യപ്പെടുന്നു"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"എഡിറ്റ് ചെയ്യുക"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"കോളുകളും അറിയിപ്പുകളും വൈബ്രേറ്റ് ചെയ്യും"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"കോളുകളും അറിയിപ്പുകളും മ്യൂട്ട് ചെയ്യപ്പെടും"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"സിസ്‌റ്റത്തിലെ മാറ്റങ്ങൾ"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ശല്യപ്പെടുത്തരുത്"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"നിങ്ങളെ ഫോക്കസ് ചെയ്യാൻ സഹായിക്കുന്ന അറിയിപ്പുകളെ \'ശല്യപ്പെടുത്തരുത്\' അദൃശ്യമാക്കുന്നു"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ഇത് പുതിയ പ്രവർത്തനരീതിയാണ്. മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ശല്യപ്പെടുത്തരുത്\' മാറ്റി"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"തടസ്സങ്ങൾക്കായി ക്രമീകരിച്ചിട്ടുള്ളത് എന്താണെന്ന് പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"എന്തിനെയാണ് ബ്ലോക്ക് ചെയ്‌തതെന്ന് പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index a5e6860b2a5b..158595f912f9 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Дуудлага хийгчийн ID хязгаарлагдсан. Дараагийн дуудлага: Хязгаарлагдсан"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Үйлчилгээ провишн хийгдээгүй ."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Та дуудлага хийгчийн ID тохиргоог солиж чадахгүй."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Дата үйлчилгээ алга"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Яаралтай дуудлага хийх боломжгүй"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Мобайл дата үйлчилгээ алга"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Яаралтай дуудлага боломжтой"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Дуу хоолойны үйлчилгээ алга"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Дуу хоолой/яаралтай үйлчилгээ алга"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Таны байршилд таны мобайл сүлжээнээс түр хугацаанд блоклосон"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сүлжээнд холбогдох боломжгүй байна"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Хүлээн авалтыг сайжруулахын тулд Тохиргоо &gt; Сүлжээ &amp; Интернет &gt; Мобайл сүлжээ &gt; Сонгосон сүлжээний төрөл хэсэгт сонгосон төрлөө өөрчилнө үү."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi дуудлага идэвхтэй байна"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Яаралтай дуудлага хийхэд мобайл сүлжээнд холбогдсон байх шаардлагатай."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Дуут үйлчилгээ эсвэл яаралтай дуудлага алга"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Үйлчилгээг таны оператор компани түр хугацаанд унтраасан"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Мобайл сүлжээнд холбогдох боломжгүй байна"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Сонгосон сүлжээг өөрчлөхөөр оролдоно уу. Өөрчлөхийн тулд товшино уу."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Яаралтай дуудлага хийх боломжгүй"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi‑Fi-р яаралтай дуудлага хийх боломжгүй байна"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Сануулга"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Дуудлага шилжүүлэх"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Яаралтай дуудлага хийх горим"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Рүүминг Баннер Асаалттай"</string>
<string name="roamingText12" msgid="1189071119992726320">"Баннергүй рүүминг"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Үйлчилгээг хайж байна…"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Calling"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi-аар дуудлага хийх, мессеж илгээх бол эхлээд оператор компаниасаа энэ үйлчилгээг тохируулж өгөхийг хүснэ үү. Дараа нь Тохиргооноос Wi-Fi дуудлага хийх үйлдлийг асаана уу. (Алдааны код: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Оператор компаниар бүртгүүлэх (Алдааны код: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi Дуудлага"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Хэт олон хүсэлтийг боловсруулж байна. Дараа дахин оролдоно уу."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>-н нэвтрэлтийн алдаа"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Синк"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синк"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Хэт олон <xliff:g id="CONTENT_TYPE">%s</xliff:g> устгах."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Синк хийх боломжгүй"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Хэт олон <xliff:g id="CONTENT_TYPE">%s</xliff:g>-г устгах оролдлого хийсэн байна."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Таблетийн сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Цагны сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Телевизийн санах ой дүүрсэн байна. Зай гаргахын тулд зарим файлыг устгана уу."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Таны ажлын профайлын админаар"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>-с"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Ажлын профайл устсан"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Админ апп байхгүй байгаа тул ажлын профайлыг устгасан байна"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Ажлын профайлын админ апп байхгүй эсвэл эвдэрсэн байна. Үүний улмаас таны ажлын профайл болон холбогдох мэдээллийг устгасан болно. Тусламж хэрэгтэй бол админтай холбогдоно уу."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Таны ажлын профайл энэ төхөөрөмжид боломжгүй байна"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Нууц үгийг хэт олон удаа буруу оруулсан байна"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Төхөөрөмжийг удирдсан"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Таны байгууллага энэ төхөөрөмжийг удирдаж, сүлжээний ачааллыг хянадаг. Дэлгэрэнгүй мэдээлэл авах бол товшино уу."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Таны төхөөрөмж устах болно."</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Админы аппыг ашиглах боломжгүй. Таны төхөөрөмжийг одоо устгана.\n\nХэрэв танд асуулт байгаа бол админтайгаа холбогдоно уу."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Админ аппыг ашиглах боломжгүй. Таны төхөөрөмжийг одоо устгана.\n\nХэрэв танд асуулт байгаа бол байгууллагынхаа админтай холбогдоно уу."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> хэвлэх үйлдлийг идэвхгүй болгосон."</string>
<string name="me" msgid="6545696007631404292">"Би"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Таблетын сонголтууд"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Нислэгийн горим"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Нислэгийн горим асав"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Нислэгийн горим унтарсан"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Тэжээл хэмнэгч"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Тэжээл хэмнэгч УНТРААЛТТАЙ байна"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Тэжээл хэмнэгч АСААЛТТАЙ байна"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Тохиргоо"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Туслах"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Дуут туслах"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Ажлын профайл руу сэлгэх"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Харилцагчдын хаяг"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"харилцагч руугаа хандах"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны харилцагчдад хандахыг зөвшөөрнө үү"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны харилцагчид хандахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Байршил"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"энэ төхөөрөмжийн байршилд хандалт хийх"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д энэ төхөөрөмжийн байршилд хандахыг зөвшөөрнө үү"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д энэ төхөөрөмжийн байршилд хандахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Хуанли"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"Хуанли руу хандах"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны календарьт хандахыг зөвшөөрнө үү"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны календарьт хандахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"Мессеж"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS мессежийг илгээх, харах"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д SMS мессеж илгээх, харахыг зөвшөөрнө үү"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д SMS мессеж илгээх болон харахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Сан"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"Tөхөөрөмж дээрх зураг, медиа болон файлд хандалт хийх"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны төхөөрөмжийн зураг, медиа болон файлд хандахыг зөвшөөрнө үү"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны төхөөрөмжийн зураг, медиа болон файлд хандахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"дуу хураах"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д дуу бичихийг зөвшөөрнө үү"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д аудио бичихийг зөвшөөрөх үү?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камер"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"зураг авах, бичлэг хийх"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д зураг авах, видео хийхийг зөвшөөрнө үү"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д зураг авах, видео хийхийг зөвшөөрөх үү?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Утас"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"утасны дуудлага хийх, дуудлага удирдах"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д утасны дуудлага хийх, дуудлагад хариулахыг зөвшөөрнө үү"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д утасны дуудлага хийх, дуудлагад хариулахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Биеийн мэдрэгч"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"таны биеийн байдлын талаарх мэдрэгч бүхий өгөгдөлд нэвтрэх"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны биеийн ерөнхий байдлын үзүүлэлтүүдийн мэдрэгчийн өгөгдөлд хандахыг зөвшөөрнө үү"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны биеийн ерөнхий байдлын үзүүлэлтүүдийн мэдрэгчийн өгөгдөлд хандахыг зөвшөөрөх үү?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Цонхны агуулгыг авах"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Таны харилцан үйлчлэх цонхны контентоос шалгах."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Хүрч танихыг асаах"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Зангах"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Товших, шудрах, жижигрүүлэх болон бусад зангааг хийх боломжтой."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Хурууны хээний зангаа"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Төхөөрөмжийн хурууны хээ мэдрэгчид зангасан зангааг танина."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Төхөөрөмжийн хурууны хээ мэдрэгчид зангасан зангааг танина."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"статус самбарыг идэвхгүй болгох болон өөрчлөх"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Апп нь статус самбарыг идэвхгүй болгох эсвэл систем дүрсийг нэмэх, хасах боломжтой."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"статусын хэсэг болох"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Апп нь өөрийн хэсгийн санах ойд байнга байлгах боломжтой. Энэ нь бусад апп-уудын ашиглах санах ойг хязгаарлан таблетыг удаашруулах болно."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Апп-д өөрийн бүрэлдэхүүн хэсгийг санах ойд хадгалахыг зөвшөөрдөг. Энэ нь бусад аппликэйшнүүдийн ашиглах санах ойн хэмжээг хязгаарлахаас гадна, телевизийг удаашруулна."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Апп нь өөрийн хэсгийг санах ойд байнга байлгах боломжтой. Энэ нь бусад апп-уудын ашиглах санах ойг хязгаарлан утсыг удаашруулах болно."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"интерактив (foreground) үйлчилгээг ажиллуулах"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Аппад интерактив (foreground) үйлчилгээг ашиглахыг зөвшөөрнө үү."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"апп сангийн хэмжээг хэмжих"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Апп нь өөрийн код, дата болон кеш хэмжээг унших боломжтой"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"систем тохиргоог өөрчлөх"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Тайлах хээ."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Нүүрээр тайлах"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Тайлах пин."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Sim-н пин кодыг тайлна уу."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Sim-н Puk кодыг тайлна уу."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Тайлах нууц үг."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Хээний хэсэг."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Гулсуулах хэсэг."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Текст хуулагдав."</string>
<string name="more_item_label" msgid="4650918923083320495">"Илүү"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Цэс+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Мета+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Функц+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"зай"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"оруулах"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"устгах"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Шинэчлэлтийг шалгах"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> апп (<xliff:g id="PROCESS">%2$s</xliff:g> процесс) өөрийнхөө StrictMode бодлогыг зөрчив."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> процесс өөрийнхөө StrictMode бодлогыг зөрчив."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Андройдыг дэвшүүлж байна…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Андройд эхэлж байна..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Утсыг шинэчилж байна…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Таблетыг шинэчилж байна…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Төхөөрөмжийг шинэчилж байна…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Утсыг эхлүүлж байна…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Таблетыг эхлүүлж байна…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Төхөөрөмжийг эхлүүлж байна…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Хадгалалтыг сайжруулж байна."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Андройдын шинэчлэлтийг дуусгаж байна…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Шинэчилж дуустал зарим апп хэвийн бус ажиллаж болзошгүй"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Системийн шинэчлэлтийг дуусгаж байна…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g>-г сайжруулж байна…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>-н <xliff:g id="NUMBER_0">%1$d</xliff:g> апп-г тохируулж байна."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Бэлдэж байна <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Апп-г эхлүүлж байна."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Эхлэлийг дуусгаж байна."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ажиллаж байна"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Тоглоом руу буцахын тулд товших"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Тоглоом сонгох"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Гүйцэтгэлийг сайжруулахын тулд нэг удаад эдгээр тоглоомын зөвхөн нэгийг нь нээх боломжтой."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> руу буцах"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g>-г нээх"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g>-г хадгалахгүйгээр хаана"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> санах ойн хязгаараас давсан"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Хэт их мэдээлэл цуглуулсан байна. Хуваалцахын тулд товшино уу"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Багтаамж хэтэрсэн байна. Хуваалцахын тулд товшино уу."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Хэт их хуримтлагдсан мэдээллийг хуваалцах уу?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Энэ үйл явц <xliff:g id="PROC">%1$s</xliff:g> нь үйл ажиллагааны санах ойн хязгаар болох <xliff:g id="SIZE">%2$s</xliff:g> хэмжээг давсан байна. Та хэт их хуримтлагдсан мэдээллийг тэдгээрийн өөрсдийнх нь хөгжүүлэгчтэй хуваалцах боломжтой. Болгоомжтой байгаарай: энэхүү хэт их хуримтлагдсан мэдээлэлд аппликейшнаас нэвтрэх боломжтой таны хувийн мэдээлэл агуулагдсан байж болно."</string>
<string name="sendText" msgid="5209874571959469142">"Текст илгээх үйлдлийг сонгох"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Нээлттэй Wi‑Fi сүлжээнд холбогдох"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Оператор Wi‑Fi сүлжээнд холбогдох"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Нээлттэй Wi‑Fi сүлжээнд холбогдож байна"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi сүлжээнд холбогдлоо"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi сүлжээнд холбогдож чадсангүй"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бүх сүлжээг харахын тулд товшино уу"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Холбогдох"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Бүх сүлжээ"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Бүх сүлжээ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматаар асна"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Таныг хадгалсан, өндөр чанартай сүлжээний ойролцоо байх үед"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Буцааж асаахгүй"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Дахин эхлүүлэх"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Мобайл үйлчилгээг идэвхжүүлэх"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Шинэ SIM-ээ идэвхжүүлэхийн тулд үүрэн холбооны компанийн аппыг татаж авна уу"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Шинэ SIM-ээ идэвхжүүлэх бол <xliff:g id="APP_NAME">%1$s</xliff:g> аппыг татна уу"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Апп татаж авах"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Шинэ SIM-г оруулсан"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Үүнийг тохируулахын тулд дарна уу"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB-р PTP горимд асаасан"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB модем болгохыг асаасан"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB-р MIDI горимд асаасан"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB хандалтын горимыг асаасан"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB нэмэлт хэрэгслийг холбосон"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Бусад сонголтыг харахын тулд товшино уу."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Холбосон төхөөрөмжийг цэнэглэж байна. Бусад сонголтыг харах бол товшино уу."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Аналог аудионы дагалдах хэрэгсэл илэрсэн"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Холбосон төхөөрөмж энэ утастай тохирохгүй байна. Дэлгэрэнгүй үзэх бол товшино уу."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB дебаг холбогдсон"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB-н алдаа засварлахыг идэвхгүй болгохын тулд товшино уу."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB дебаг хийхийг унтраахын тулд товшино уу"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB дебаг хийхийг идэвхгүй болгох бол сонгоно уу."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Алдааны тайланг авч байна..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Алдааны тайланг хуваалцах уу?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Бусад апп дээгүүр <xliff:g id="NAME">%s</xliff:g>-г харуулж байна"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>-г бусад апп дээр харуулж байна"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Та <xliff:g id="NAME">%s</xliff:g>-д энэ онцлогийг ашиглахыг хүсэхгүй байгаа бол тохиргоог нээгээд, унтраана уу."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"УНТРААХ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Унтраах"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ыг бэлдэж байна"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Алдааг шалгаж байна"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Шинэ <xliff:g id="NAME">%s</xliff:g> илэрлээ"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Байнгын VPN-д холбогдож байна..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Байнга VPN холбоотой"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Тогтмол асаалттай VPN-с салсан"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Байнгын VPN алдаа"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Тогтмол асаалттай VPN-д холбогдож чадсангүй"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Сүлжээ эсвэл VPN тохиргоог өөрчлөх"</string>
<string name="upload_file" msgid="2897957172366730416">"Файл сонгох"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Сонгосон файл байхгүй"</string>
<string name="reset" msgid="2448168080964209908">"Бүгдийг цэвэрлэх"</string>
<string name="submit" msgid="1602335572089911941">"Илгээх"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Машины горим идэвхтэй болов"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Машины горимоос гарахын тулд товшино уу."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Жолоо барих апп ажиллаж байна"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Жолооны аппаас гарахын тулд товшино уу."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Модем болгох эсвэл идэвхтэй цэг болгох"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Тохируулахын тулд товшино уу."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Модем болгох боломжгүй байна"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB диск"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB сан"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Засах"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Дата ашиглалтын сануулга"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Хэрэглээ, тохиргоог харах бол товш."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G дата хязгаарт хүрсэн"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G дата хязгаарт хүрсэн"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Дата хэрэглээний анхааруулга"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Та <xliff:g id="APP">%s</xliff:g>-н өгөгдлийг ашигласан байна"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Мобайл дата хязгаарт хүрсэн"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi дата хязгаарт хүрсэн"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Циклийн үлдсэн хугацаанд датаг түр зогсоосон"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G дата хязгаар хэтрэв"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G дата хязгаар хэтрэв"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Мобайл дата хязгаар хэтрэв"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi дата хязгаар хэтрэв"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> заасан хязгаарыг давав."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Дата ашиглалтыг таны үлдсэн хугацаанд зогсоосон"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Таны мобайл датаны хязгаараас хэтэрсэн"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi дата хязгаараас хэтэрсэн"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Та тохируулсан хязгаараасаа <xliff:g id="SIZE">%s</xliff:g>-р хэтэрсэн байна"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Арын дата хязгаарлагдсан"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Хязгаарлалтыг устгах бол товш."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Их хэмжээний дата ашиглалт"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Таны сүүлийн хэдэн өдрийн дата ашиглалт хэвийн хэмжээнээс их байна. Ашиглалт, тохиргоог харах бол товшино уу."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Мобайл дата ашиглалт өндөр байна"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Таны апп энгийн үеийнхээс их дата ашигласан байна"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> энгийн үеийнхээс их дата ашигласан байна"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Аюулгүй сертификат"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Сертификат хүчинтэй."</string>
<string name="issued_to" msgid="454239480274921032">"Гаргуулсан:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Таны админ суулгасан"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Таны админ шинэчилсэн"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Таны админ устгасан"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Тэжээл хэмнэгч нь батерейны амийг сайжруулахад туслахын тулд таны төхөөрөмжийн гүйцэтгэлийг багасгаж, чичрэлт, байршлын үйлчилгээнүүд болон ихэнх арын датаг хязгаарладаг. Та и-мэйл, мессеж болон бусад синк хийдэг аппыг нээх хүртэл тэдгээрийг шинэчлэхгүй.\n\nТэжээл хэмнэгч нь таныг төхөөрөмжөө цэнэглэх үед автоматаар унтарна."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Дата ашиглалтыг багасгахын тулд дата хэмнэгч нь зарим апп-г өгөгдлийг дэвсгэрт илгээх болон авахаас сэргийлдэг. Таны одоогийн ашиглаж буй апп нь өгөгдөлд хандах боломжтой хэдий ч цөөн үйлдэл хийнэ. Жишээлбэл зураг харахын тулд та товших шаардлагатай болно."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Өгөгдөл хамгаалагчийг асаах уу?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Асаах"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d минутын турш (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> хүртэл)</item>
<item quantity="one">1 минутын турш (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> хүртэл)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d цагийн турш (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> хүртэл)</item>
- <item quantity="one">Нэг цагийн турш (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> хүртэл)</item>
+ <item quantity="one">1 цагийн турш (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> хүртэл)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d цагийн турш (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> хүртэл)</item>
@@ -1697,8 +1705,10 @@
<item quantity="other">%d минутын турш</item>
<item quantity="one">1 минутын турш</item>
</plurals>
- <!-- String.format failed for translation -->
- <!-- no translation found for zen_mode_duration_hours (3938821308277433854) -->
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d цагийн турш</item>
+ <item quantity="one">1 цагийн турш</item>
+ </plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d цагийн турш</item>
<item quantity="one">1 цагийн турш:</item>
@@ -1718,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>-с хаасан"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Таны төхөөрөмжид дотоод алдаа байна.Та төхөөрөмжөө үйлдвэрээс гарсан төлөвт шилжүүлэх хүртэл таны төхөөрөмж чинь тогтворгүй байж болох юм."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Таны төхөөрөмжид дотоод алдаа байна. Дэлгэрэнгүй мэдээлэл авахыг хүсвэл үйлдвэрлэгчтэйгээ холбоо барина уу."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD хүсэлтийг DIAL хүсэлт болгон өөрчилсөн байна."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD хүсэлтийг SS хүсэлт болгон өөрчилсөн байна."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD хүсэлтийг шинэ USSD хүсэлт болгон өөрчилсөн байна."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD хүсэлтийг Видео DIAL хүсэлт болгон өөрчилсөн байна."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS хүсэлтийг DIAL хүсэлт болгон өөрчилсөн байна"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS хүсэлтийг Видео DIAL хүсэлт болгон өөрчилсөн байна."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS хүсэлтийг USSD хүсэлт болгон өөрчилсөн байна."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS хүсэлтийг шинэ SS хүсэлт болгон өөрчилсөн байна."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Ажлын профайл"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Дэлгэх"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Буулгах"</string>
@@ -1835,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Аюултай апп олдсон"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g>-н хэсгүүдийг (slices) харуулах хүсэлтэй байна"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Засах"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Дуудлага болон мэдэгдэл чичирнэ"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Дуудлага болон мэдэгдлийн дууг хаана"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Системийн өөрчлөлт"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Бүү саад бол"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Бүү саад бол горим нь таныг төвлөрөхөд туслахын тулд мэдэгдлийг нууж байна"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Энэ нь шинэ төлөв юм. Өөрчлөхийн тулд товшино уу."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Бүү саад бол горимыг өөрчилсөн"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Төлөвийн тохиргоонд саад болох зүйл байгаа эсэхийг шалгахын тулд товшино уу"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Блоклосон зүйлийг шалгахын тулд товшино уу."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Систем"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Тохиргоо"</string>
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 00eb8fd809cf..92b07780fe8a 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"कॉलर आयडी डीफॉल्‍ट रूपात प्रतिबंधित नाही वर सेट असतो. पुढील कॉल: प्रतिबंधित नाही"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"सेवेची तरतूद केलेली नाही."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"आपण कॉलर आयडी सेटिंग बदलू शकत नाही."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"डेटा सेवा नाही"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"आणीबाणीत कॉल करू शकत नाही"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"मोबाइल डेटा सेवा नाही"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"आणीबाणी कॉलिंग अनुपलब्‍ध आहे"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"व्हॉइस सेवा नाही"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"व्हॉइस/आणीबाणी सेवा नाही"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"तुम्‍ही असलेल्‍या स्‍थानी मोबाइल नेटवर्क तात्‍पुरते उपलब्‍ध नाही"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कवर पोहोचूू शकत नाही"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"रीसेप्शन सुधारण्यासाठी, सेटिंग्ज &gt; नेटवर्क आणि इंटरनेट &gt; मोबाइल नेटवर्क &gt; प्राधान्यीकृत नेटवर्क प्रकार बदलून पाहा."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"वाय-फाय कॉलिंग चालू आहे"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"आपात्कालीन कॉलसाठी मोबाइल नेटवर्क असणे आवश्यक आहे."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"व्‍हॉइस सेवा किंवा आणीबाणी कॉलिंग नाही"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"तुमच्‍या वाहकाने तात्‍पुरते बंद केले आहे"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"मोबाइल नेटवर्क उपलब्ध नाही"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"प्राधान्य दिलेले नेटवर्क बदलण्याचा प्रयत्न करा. बदलण्यासाठी टॅप करा."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"आणीबाणी कॉलिंग अनुपलब्ध"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"वाय-फाय वरून आणीबाणी कॉल करू शकत नाही"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्ट"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल फॉरवर्डिंग"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"इमर्जन्सी कॉलबॅक मोड"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"रोमिंग बॅनर चालू"</string>
<string name="roamingText12" msgid="1189071119992726320">"रोमिंग बॅनर बंद"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"सेवा शोधत आहे"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"वाय-फाय कॉलिंग"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"वाय-फायवरून कॉल करण्यासाठी आणि संदेश पाठवण्यासाठी आधी तुमच्या कॅरियरला ही सेवा सेट अप करण्यास सांगा. नंतर सेटिंग्जमधून वाय-फाय वापरून कॉल करणे पुन्हा चालू करा. (एरर कोड <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"तुमच्‍या वाहकासह नोंदणी करा (एरर कोड: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s वाय-फाय कॉलिंग"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"बर्‍याच विनंत्यांवर प्रक्रिया होत आहे. नंतर पुन्हा प्रयत्न करा."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> साठी साइन इन एरर"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"संकालन करा"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"संकालन करा"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"खूप <xliff:g id="CONTENT_TYPE">%s</xliff:g> हटविणे."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"टॅबलेट संचयन पूर्ण भरले आहे. स्थान मोकळे करण्यासाठी काही फाईल हटवा."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"पाहण्याचे संचयन पूर्ण भरले आहे. स्थान मोकळे करण्यासाठी काही फायली हटवा."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"टीव्ही संचयन भरले आहे. स्थान मोकळे करण्यासाठी काही फायली हटवा."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"आपल्या कार्य प्रोफाइल प्रशासकाद्वारे"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> द्वारे"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"कार्य प्रोफाईल हटविले"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"प्रशासक अॅप गहाळ असल्यामुळे कार्य प्रोफाइल हटवले गेले"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"कार्य प्रोफाइल प्रशासक अॅप गहाळ आहे किंवा करप्ट आहे. परिणामी, आपले कार्य प्रोफाइल आणि संबंधित डेटा हटवले गेले आहेत. सहाय्यासाठी आपल्या प्रशासकाशी संपर्क साधा."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"आपले कार्य प्रोफाइल आता या डिव्हाइसवर उपलब्‍ध नाही"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"बर्‍याचदा पासवर्ड टाकण्‍याचा प्रयत्‍न केला"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"डिव्हाइस व्यवस्थापित केले आहे"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"आपली संस्था हे डिव्हाइस व्यवस्थापित करते आणि नेटवर्क रहदारीचे निरीक्षण करू शकते. तपशीलांसाठी टॅप करा."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"तुमचे डिव्हाइस मिटविले जाईल"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"हे प्रशासक अ‍ॅप वापरले जाऊ शकत नाही. तुमचे डिव्हाइस आता मिटवले जाईल.\n\nतुम्हाला प्रश्न असल्यास, तुमच्या संस्थेच्या प्रशासकाशी संपर्क साधा."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"प्रशासक अ‍ॅप वापरता येणार नाही. तुमचे डिव्हाइस आता साफ केले जाईल.\n\nतुम्हाला कुठलेही प्रश्न असल्यास, तुमच्या संस्थेच्या प्रशासकाशी संपर्क साधा."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> नी प्रिंट करणे बंद केले आहे."</string>
<string name="me" msgid="6545696007631404292">"मी"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"टॅबलेट पर्याय"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"विमान मोड"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"विमान मोड चालू आहे"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"विमान मोड बंद आहे"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"बॅटरी बचतकर्ता"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"बॅटरी बचतकर्ता बंद आहे"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"बॅटरी बचतकर्ता सुरू आहे"</string>
<string name="global_action_settings" msgid="1756531602592545966">"सेटिंग्ज"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहाय्यता"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"व्हॉइस सहाय्य"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"कार्य प्रोफाइलवर स्विच करा"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"संपर्क"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"आपल्या संपर्कांवर प्रवेश"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमचे संपर्क अॅक्सेस करू द्या"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"या डिव्हाइसच्या स्थानावर प्रवेश"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला या डीव्हाइसचे स्थान अॅक्सेस करू द्या"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"कॅलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"आपल्या कॅलेंडरवर प्रवेश"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमचा कॅलेंडर अॅक्सेस करू द्या"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS संदेश पाठवणे आणि पाहणे हे"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला SMS संदेश पाठवू आणि पाहू द्या"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"संचयन"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"तुमच्या डिव्हाइस वरील फोटो, मीडिया आणि फायलींमध्‍ये अॅक्सेस"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमच्या डीव्हाइसवरील फोटो, मीडिया आणि फायली अॅक्सेस करू द्या"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"मायक्रोफोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ऑडिओ रेकॉर्ड"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला ऑडिओ रेकॉर्ड करू द्या"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"कॅमेरा"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"चित्रे घेण्याची आणि व्हिडिओ रेकॉर्ड"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला फोटो घेऊ आणि व्हिडिओ रेकॉर्ड करू द्या"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कॉल आणि व्यवस्थापित"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला फोन कॉल करू आणि ते व्यवस्थापित करू द्या"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"शरीर सेन्सर"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"आपल्‍या महत्त्वाच्या मापनांविषयी सेंसर डेटा अॅक्सेस करा"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमच्या महत्त्वपूर्ण संकेतांविषयी सेन्सर डेटा अॅक्सेस करू द्या"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडो सामग्री पुनर्प्राप्त करा"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"आपण परस्‍परसंवाद करीत असलेल्‍या विंडोची सामग्री तपासा."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"स्पर्श करून अन्वेषण चालू करा"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"जेश्चर करा"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"टॅप, स्वाइप, पिंच आणि इतर जेश्चर करू शकते."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"फिंगरप्रिंट जेश्चर"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"डिव्‍हाइसच्‍या फिंगरप्रिंट सेंसरवर केलेले जेश्चर कॅप्‍चर करू शकते."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"डिव्‍हाइसच्‍या फिंगरप्रिंट सेंसरवर केलेले जेश्चर कॅप्‍चर करू शकते."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"स्टेटस बार अक्षम करा किंवा सुधारित करा"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"स्टेटस बार अक्षम करण्यासाठी किंवा सिस्टम चिन्हे जोडण्यासाठी आणि काढण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"स्टेटस बार होऊ द्या"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"अॅप ला मेमरीमध्ये कायम असलेले त्याचे स्वतःचे भाग बनविण्यास अनुमती देते. हे टॅबलेट धीमा करून अन्य अॅप्सवर उपलब्ध असलेल्या मेमरीवर मर्यादा घालू शकते."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"अॅपला मेमरीमध्ये कायम असलेले त्याचे स्वतःचे भाग बनविण्यासाठी अनुमती देते. हे टीव्ही धीमा करून इतर अॅप्सवर उपलब्ध असलेली मेमरी मर्यादित करू शकते."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"अॅप ला मेमरीमध्ये कायम असलेले त्याचे स्वतःचे भाग बनविण्यास अनुमती देते. हे फोन धीमा करून अन्य अॅप्सवर उपलब्ध असलेल्या मेमरीवर मर्यादा घालू शकते."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"पृष्‍ठभाग सेवा रन करा"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"अ‍ॅपला पृष्‍ठभाग सेवा वापरण्याची अनुमती देते."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"अॅप संचयन स्थान मोजा"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"अॅप ला त्याचा कोड, डेटा आणि कॅश आकार पुनर्प्राप्त करण्यासाठी अनुमती देते"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"सिस्टम सेटिंग्ज सुधारित करा"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"पॅटर्न अनलॉक."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"चेहरा अनलॉक."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"सिम पिन अनलॉक करा"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"सिम PUK अनलॉक करा"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवर्ड अनलॉक."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"पॅटर्न क्षेत्र."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"स्लाइड क्षेत्र."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"मजकूर क्लिपबोर्डवर कॉपी केला."</string>
<string name="more_item_label" msgid="4650918923083320495">"अधिक"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"मेनू+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"स्पेस"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"एंटर"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"हटवा"</string>
@@ -1024,9 +1046,9 @@
<string name="whichEditApplication" msgid="144727838241402655">"सह संपादित करा"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s सह संपादित करा"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"संपादित करा"</string>
- <string name="whichSendApplication" msgid="6902512414057341668">"यांच्यासह सामायिक करा"</string>
- <string name="whichSendApplicationNamed" msgid="2799370240005424391">"%1$s सह सामायिक करा"</string>
- <string name="whichSendApplicationLabel" msgid="4579076294675975354">"सामायिक करा"</string>
+ <string name="whichSendApplication" msgid="6902512414057341668">"यांच्यासह शेअर करा"</string>
+ <string name="whichSendApplicationNamed" msgid="2799370240005424391">"%1$s सह शेअर करा"</string>
+ <string name="whichSendApplicationLabel" msgid="4579076294675975354">"शेअर करा"</string>
<string name="whichSendToApplication" msgid="8272422260066642057">"वापरून पाठवा"</string>
<string name="whichSendToApplicationNamed" msgid="7768387871529295325">"%1$s वापरून पाठवा"</string>
<string name="whichSendToApplicationLabel" msgid="8878962419005813500">"पाठवा"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"अपडेट आहे का ते तपासा"</string>
<string name="smv_application" msgid="3307209192155442829">"अॅप <xliff:g id="APPLICATION">%1$s</xliff:g> (प्रक्रिया <xliff:g id="PROCESS">%2$s</xliff:g>) ने तिच्या स्वयं-लागू केलेल्या StrictMode धोरणाचे उल्लंघन केले आहे."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> प्रक्रियेने तिच्या स्वतः-लागू केलेल्या StrictMode धोरणाचे उल्लंघन केले."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android श्रेणीसुधारित होत आहे..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android प्रारंभ करत आहे…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"फोन अपडेट होत आहे…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"टॅबलेट अपडेट होत आहे…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"डिव्‍हाइस अपडेट होत आहे…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"फोन सुरू होत आहे…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"टॅबलेट सुरू होत आहे…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"डिव्‍हाइस सुरू होत आहे…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"संचयन ऑप्टिमाइझ करत आहे."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android अपडेट संपवत आहे..."</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"श्रेणीसुधारणा पूर्ण होईपर्यंत काही अॅप्स योग्यरित्या कार्य करणार नाहीत"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"सिस्‍टम अपडेट संपत आहे…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> श्रेणीसुधारित करत आहे…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> पैकी <xliff:g id="NUMBER_0">%1$d</xliff:g> अॅप ऑप्टिमाइझ करत आहे."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> तयार करत आहे."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"अॅप्स प्रारंभ करत आहे."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"बूट समाप्त होत आहे."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चालत आहे"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"गेमवर परत जाण्यासाठी टॅप करा"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"गेम निवडा"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"अधिक चांगल्या कामगिरीसाठी, एकावेळी यापैकी केवळ एक गेम चालू ठेवता येईल."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> वर परत जा"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> उघडा"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> सेव्ह न करता बंद होईल"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ने मेमेरी मर्यादा वाढविली"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"हीप डंप संकलित केला गेला आहे; सामायिक करण्यासाठी टॅप करा"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"हीप डंप सामायिक करायचे?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> प्रक्रियेने त्याची <xliff:g id="SIZE">%2$s</xliff:g> ची प्रक्रिया मेमरी मर्यादा ओलांडली आहे. त्याच्या विकासकासह सामायिक करण्यासाठी तुमच्यासाठी हीप डंप उपलब्ध आहे. सावधगिरी बाळगा: या हीप डंपमध्ये आपली कोणतीही वैयक्तिक माहिती असू शकते ज्यात अॅप्लिकेशन प्रवेश करू शकतो."</string>
<string name="sendText" msgid="5209874571959469142">"मजकुरासाठी क्रिया निवडा"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"खुल्या वाय-फाय नेटवर्कशी कनेक्ट करा"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"वाहक वाय-फाय नेटवर्कशी कनेक्ट करा"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"खुल्या वाय-फाय नेटवर्कशी कनेक्ट करत आहे"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"वाय-फाय नेटवर्कशी कनेक्ट केले"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"वाय-फाय नेटवर्कशी कनेक्ट करू शकत नाही"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सर्व नेटवर्क पाहण्यासाठी टॅप करा"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करा"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"सर्व नेटवर्क"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सर्व नेटवर्क"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"वाय-फाय आपोआप चालू होईल"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"तुम्ही जेव्हा सेव्ह केलेल्या उच्च दर्जाच्या नेटवर्कजवळ असाल तेव्हा"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"पुन्हा चालू करू नका"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"रीस्टार्ट"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"मोबाइल सेवा अ‍ॅक्टिव्हेट करा"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"तुमचे नवीन सिम अ‍ॅक्टिव्हेट करण्यासाठी वाहकाचे अ‍ॅप डाउनलोड करा"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"तुमचे सिम अ‍ॅक्टिव्हेट करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> अ‍ॅप डाउनलोड करा"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"अ‍ॅप डाउनलोड करा"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"नवीन सिम घाला"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ते सेट करण्यासाठी टॅप करा"</string>
@@ -1223,19 +1245,19 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB मार्फत PTP चालू केले"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB टेदरिंग चालू केले"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB मार्फत MIDI चालू केले"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB अ‍ॅक्सेसरी मोड चालू आहे"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB अ‍ॅक्सेसरी कनेक्ट केली आहे"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"अधिक पर्यायांसाठी टॅप करा."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"चार्जर लावलेले डिव्हाइस. आणखी पर्यायांसाठी टॅप करा"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"अॅनालॉग ऑडिओ अॅक्‍सेसरी आढळली"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"या फोनसह संलग्‍न केलेले डीव्‍हाइस सुसंगत नाही. अधिक जाणून घेण्‍यासाठी टॅप करा."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग करणे कनेक्‍ट केले"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB डीबग करणे अक्षम करण्यासाठी टॅप करा."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB डीबगिंग बंद करण्यासाठी टॅप करा"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB डीबगिंग बंद करण्यासाठी निवडा."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"बग रीपोर्ट घेत आहे..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"बग अहवाल सामायिक करायचा?"</string>
<string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"बग रीपोर्ट शेअर करत आहे..."</string>
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"आपल्या प्रशासकाने या डिव्हाइसचे समस्या निवारण करण्यात मदत करण्यासाठी दोष अहवालाची विनंती केली. अॅप्स आणि डेटा शेअर केले जाऊ शकतात."</string>
- <string name="share_remote_bugreport_action" msgid="6249476773913384948">"सामायिक करा"</string>
+ <string name="share_remote_bugreport_action" msgid="6249476773913384948">"शेअर करा"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"नकार द्या"</string>
<string name="select_input_method" msgid="8547250819326693584">"कीबोर्ड बदला"</string>
<string name="show_ime" msgid="2506087537466597099">"भौतिक कीबोर्ड सक्रिय असताना त्यास स्क्रीनवर ठेवा"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> इतर अॅप्सवर प्रदर्शित करत आहे"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्‍य अॅप्सवर प्रदर्शित करत आहे"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ने हे वैशिष्ट्य वापरू नये असे आपण इच्छित असल्यास, सेटिंग्ज उघडण्यासाठी टॅप करा आणि ते बंद करा."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"बंद करा"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"बंद करा"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> तयार करत आहे"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटींसाठी तपासत आहे"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"नवीन <xliff:g id="NAME">%s</xliff:g> आढळले"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN कनेक्ट करणे नेहमी-चालू…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN कनेक्ट केलेले नेहमी-चालू"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"कायम चालू असलेल्या VPN मधून डिस्कनेक्ट केले"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"VPN एरर नेहमी-चालू"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"नेटवर्क किंवा VPN सेटिंग्ज बदला"</string>
<string name="upload_file" msgid="2897957172366730416">"फाईल निवडा"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"फाईल निवडली नाही"</string>
<string name="reset" msgid="2448168080964209908">"रीसेट करा"</string>
<string name="submit" msgid="1602335572089911941">"सबमिट करा"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"कार मोड सक्षम केला"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"कार मोडमधून बाहेर पडण्यासाठी टॅप करा."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"टेदरिंग किंवा हॉटस्पॉट सक्रिय"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"सेट करण्यासाठी टॅप करा."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिंग बंद आहे"</string>
@@ -1358,7 +1383,7 @@
<string name="action_mode_done" msgid="7217581640461922289">"पूर्ण केले"</string>
<string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"USB स्टोरेज मिटवत आहे…"</string>
<string name="progress_erasing" product="default" msgid="6596988875507043042">"SD कार्ड मिटवत आहे…"</string>
- <string name="share" msgid="1778686618230011964">"सामायिक करा"</string>
+ <string name="share" msgid="1778686618230011964">"शेअर करा"</string>
<string name="find" msgid="4808270900322985960">"शोधा"</string>
<string name="websearch" msgid="4337157977400211589">"वेब शोध"</string>
<string name="find_next" msgid="5742124618942193978">"पुढील शोधा"</string>
@@ -1403,8 +1428,8 @@
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"एंटर करा"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"एक अ‍ॅप निवडा"</string>
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> लाँच करू शकलो नाही"</string>
- <string name="shareactionprovider_share_with" msgid="806688056141131819">"यांच्यासह सामायिक करा"</string>
- <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सह सामायिक करा"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"यांच्यासह शेअर करा"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सह शेअर करा"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"स्लायडिंग हँडल. स्पर्श करा आणि धरुन ठेवा."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"अनलॉक करण्यासाठी स्वाइप करा."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"होम स्क्रीनवर नेव्‍हिगेट करा"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ड्राइव्‍ह"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB स्टोरेज"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"संपादित करा"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"डेटा वापर सूचना"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"वापर आणि सेटिंग्ज पाहण्यासाठी टॅप करा."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G डेटा मर्यादा गाठली"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G डेटा मर्यादा गाठली"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"डेटा चेतावणी"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"तुम्ही <xliff:g id="APP">%s</xliff:g> डेटा वापरला आहे"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"मोबाइल डेटा मर्यादा गाठली"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"वाय-फाय डेटा मर्यादा गाठली"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"उर्वरित चक्रासाठी डेटास विराम दिला"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G डेटा मर्यादा ओलांडली"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G डेटा मर्यादा ओलांडली"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"मोबाईल डेटा मर्यादा ओलांडली"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"वाय-फाय डेटा मर्यादा ओलांडली"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"निर्दिष्ट केलेल्या मर्यादेबाहेर <xliff:g id="SIZE">%s</xliff:g>."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"डेटा तुमच्या शिल्लक सायकलसाठी थांबवण्यात आला"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"तुमच्या मोबाइल डेटाच्या मर्यादेपेक्षा जास्त"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"तुमच्या वाय-फाय डेटाच्या मर्यादेबाहेर"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"तुम्ही तुमच्या सेट केलेल्या मर्यादेपेक्षा <xliff:g id="SIZE">%s</xliff:g> जास्त वापर केला आहे"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"पार्श्वभूमीवरील डेटा प्रतिबंधित केला"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"प्रतिबंध काढण्यासाठी टॅप करा."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"डेटाचा जास्त वापर"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"तुमचा गेल्या काही दिवसांतला डेटाचा वापर हा नेहमीपेक्षा जास्त आहे. वापर आणि सेटिंग्ज पाहण्यासाठी टॅप करा."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"मोबाइल डेटाचा उच्च वापर"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"तुमच्या अ‍ॅप्सनी नेहमीपेक्षा जास्त डेटा वापरला आहे"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ने नेहमीपेक्षा जास्त डेटा वपरला आहे"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"सुरक्षितता प्रमाणपत्र"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"हे प्रमाणपत्र वैध आहे."</string>
<string name="issued_to" msgid="454239480274921032">"यावर जारी केले:"</string>
@@ -1451,7 +1473,7 @@
<string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 फिंगरप्रिंट:"</string>
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"सर्व पहा"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"अॅक्टिव्हिटी निवडा"</string>
- <string name="share_action_provider_share_with" msgid="5247684435979149216">"यांच्यासह सामायिक करा"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"यांच्यासह शेअर करा"</string>
<string name="sending" msgid="3245653681008218030">"पाठवित आहे..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउझर लाँच करायचा?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकारायचा?"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"आपल्या प्रशासकाने इंस्टॉल केले"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"आपल्या प्रशासकाने अपडेट केले"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"आपल्या प्रशासकाने हटवले"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"बॅटरी लाइफ सुधारण्‍यासाठी, बॅटरी सेव्हर तुमच्या डिव्हाइस ची कामगिरी कमी करतो आणि कंपन, स्थान सेवा आणि बराचसा पार्श्वभूमी डेटा मर्यादित करतो. सिंकवर अवलंबून असणारे ईमेल, मेसेजिंग आणि इतर अ‍ॅप्स तुम्ही उघडल्याशिवाय अपडेट होऊ शकत नाहीत.\n\nतुमचे डिव्हाइस चार्ज होत असते तेव्हा बॅटरी सेव्हर आपोआप बंद होतो."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"डेटा वापर कमी करण्यात मदत करण्यासाठी, डेटा सर्व्हर काही अॅप्सना पार्श्वभूमीमध्ये डेटा पाठविण्यास किंवा प्राप्त करण्यास प्रतिबंधित करतो. आपण सध्या वापरत असलेला अॅप डेटामध्ये प्रवेश करू शकतो परंतु तसे तो खूप कमी वेळा करू शकतो. याचा अर्थ, उदाहरणार्थ, आपण इमेज टॅप करेपर्यंत त्या प्रदर्शित करणार नाहीत असा असू शकतो."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा बचतकर्ता चालू करायचा?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करा"</string>
@@ -1682,7 +1705,7 @@
<item quantity="one">%1$d मिनिटासाठी (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> पर्यंत)</item>
<item quantity="other">%1$d मिनिटासाठी (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> पर्यंत)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="one">%1$d तासासाठी (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> पर्यंत)</item>
<item quantity="other">%1$d तासांसाठी (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> पर्यंत)</item>
</plurals>
@@ -1698,7 +1721,7 @@
<item quantity="one">%d मिनिटासाठी</item>
<item quantity="other">%d मिनिटांसाठी</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="one">%d तासासाठी</item>
<item quantity="other">%d तासांसाठी</item>
</plurals>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारे नि:शब्द केले"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"आपल्‍या डिव्‍हाइसमध्‍ये अंतर्गत समस्‍या आहे आणि आपला फॅक्‍टरी डेटा रीसेट होईपर्यंत ती अस्‍थिर असू शकते."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"आपल्‍या डिव्‍हाइसमध्‍ये अंतर्गत समस्‍या आहे. तपशीलांसाठी आपल्‍या निर्मात्याशी संपर्क साधा."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD विनंती डायल विनंतीवर सुधारित केली आहे."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD विनंती SS विनंतीवर सुधारित केली आहे."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD विनंती नवीन USSD विनंतीवर सुधारित केली आहे."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD विनंतीमध्ये बदल करून ती व्हिडिओ डायल विनंतीमध्ये बदलली आहे."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS विनंती डायल विनंतीवर सुधारित केली आहे."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS विनंतीमध्ये बदल करून ती व्हिडिओ डायल विनंतीमध्ये बदलली आहे."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS विनंती USSD विनंतीवर सुधारित केली आहे."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS विनंती नवीन SS विनंतीवर सुधारित केली आहे."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफाईल"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तृत करा"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"संकुचित करा"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"हानिकारक अॅप आढळला"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ला <xliff:g id="APP_2">%2$s</xliff:g> चे तुकडे दाखवायचे आहेत"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"संपादित करा"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"कॉल आणि सूचनांवर व्हायब्रेट होईल"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"कॉल आणि सूचना म्युट केल्या जातील"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"सिस्टम बदल"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"व्यत्यय आणू नका"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"तुम्हाला लक्ष केंद्रित करण्यात मदत करण्यासाठी व्यत्यय आणू नका सूचना लपवत आहे"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"हे नवीन वर्तन आहे. बदलण्यासाठी टॅप करा."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"व्यत्यय आणू नका बदलले आहे"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"व्यत्ययांसाठीच्या तुमच्या वर्तन सेटिंग्ज तपासण्यासाठी टॅप करा"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"काय ब्लॉक केले आहे हे तपासण्यासाठी टॅप करा."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 176ecff72c71..a29ffbb0d0e8 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်မထားပါ။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်မထားပါ။"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"ဝန်ဆောင်မှုအား ကန့်သတ်မထားပါ"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"သင်သည် ခေါ်ဆိုသူ ID ဆက်တင်ကို မပြောင်းလဲနိုင်ပါ။"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ဒေတာချိတ်ဆက်ရန် ဝန်ဆောင်မှု မရှိပါ"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"အရေးပေါ်ဖုန်းခေါ်ခြင်းများ မရရှိနိုင်ပါ"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"မိုဘိုင်း ဒေတာဝန်ဆောင်မှု မရှိပါ"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"အရေးပေါ်ခေါ်ဆိုမှု မရနိုင်ပါ"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ဖုန်းဝန်ဆောင်မှု မရှိပါ"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ဖုန်း/အရေးပေါ် ဝန်ဆောင်မှုများမရရှိနိုင်ပါ"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"သင်၏ ဒေသတွင် မိုဘိုင်းကွန်ရက် ယာယီမရရှိနိုင်ပါ"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ကွန်ရက်ကို ချိတ်ဆက်၍မရပါ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"လိုင်းဖမ်းယူမှု ကောင်းမွန်စေရန် ဆက်တင်များ &gt; ကွန်ရက်နှင့် အင်တာနက် &gt; မိုဘိုင်းကွန်ရက်များ &gt; အသုံးပြုလိုသည့် ကွန်ရက်အမျိုးအစားတွင် ရွေးချယ်ထားသည့် အမျိုးအစားကို ပြောင်းကြည့်ပါ။"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi ခေါ်ဆိုမှုကို အသုံးပြုနေပါသည်"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"အရေးပေါ်ဖုန်းခေါ်ဆိုရန် မိုဘိုင်းကွန်ရက်ကို လိုအပ်သည်။"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ဖုန်းခေါ်ဆိုခြင်း ဝန်ဆောင်မှု သို့မဟုတ် အရေးပေါ်ခေါ်ဆိုခြင်း မရနိုင်ပါ"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"သင်၏ ဝန်ဆောင်မှုပေးသူက ယာယီပိတ်ထားသည်"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"မိုဘိုင်းကွန်ရက် လိုင်းမရပါ"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ဦးစားပေးကွန်ရက်သို့ ပြောင်းကြည့်ပါ။ ပြောင်းရန် တို့ပါ။"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"အရေးပေါ်ခေါ်ဆိုမှု မရနိုင်ပါ"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi‑Fi ဖြင့် အရေးပေါ်ခေါ်ဆိုမှုများ ပြုလုပ်၍မရပါ"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"သတိပေးချက်များ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"အရေးပေါ် ပြန်လည်ခေါ်ဆိုနိုင်သောမုဒ်"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"ရုန်းမင်းစာတမ်းဖွင့်ရန်"</string>
<string name="roamingText12" msgid="1189071119992726320">"ရုန်းမင်းစာတမ်းပိတ်ထားရန်"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ဆားဗစ်အားရှာဖွေနေသည်"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi ခေါ်ဆိုမှု"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi အသုံးပြု၍ ဖုန်းခေါ်ရန်နှင့် မက်ဆေ့ဂျ်ပို့ရန်အတွက် သင့်ဝန်ဆောင်မှုပေးသူကို ဤဝန်ဆောင်မှုအား သတ်မှတ်ပေးရန် ဦးစွာတောင်းဆိုပါ။ ထို့နောက် ဆက်တင်ထဲသို့ သွား၍ Wi-Fi ဖြင့် ဖုန်းခေါ်ခြင်းကို ဖွင့်ရပါမည်။ (အမှားကုဒ်- <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"သင့်ဖုန်းကုမ္ပဏီနှင့် မှတ်ပုံတင်ပါ (အမှားကုဒ်− <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi ခေါ်ဆိုမှု"</item>
@@ -142,7 +141,7 @@
<string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ထပ်ဆင့်မပို့နိုင်ပါ"</string>
<string name="fcComplete" msgid="3118848230966886575">"ပုံစံကုတ်ပြီးဆုံးသည်"</string>
<string name="fcError" msgid="3327560126588500777">"ဆက်သွယ်မှုဆိုင်ရာပြသနာ သို့မဟုတ် တရားမဝင်သောပုံစံကုတ်"</string>
- <string name="httpErrorOk" msgid="1191919378083472204">"အိုကေ"</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"OK"</string>
<string name="httpError" msgid="7956392511146698522">"ကွန်ရက်အမှားအယွင်း ရှိပါသည်"</string>
<string name="httpErrorLookup" msgid="4711687456111963163">"URL ကို ရှာဖွေ့ မတွေ့ရှိပါ"</string>
<string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"ဆိုက် မှန်ကန်မှု စိစစ်ရေး စနစ်ကို ပံ့ပိုး မပေးပါ။"</string>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"တောင်းခံမှုများစွာကို ပြုလုပ်နေသည် အချိန်အနည်းငယ်အကြာတွင်ပြန်လည်လုပ်ပါ"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> ဝင်ရာ အမှား"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"အလိုအလျောက် ထပ်တူလုပ်ခြင်း"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ထပ်တူ ကိုက်ညီခြင်း"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"ဖျက်ရန် <xliff:g id="CONTENT_TYPE">%s</xliff:g> များစွာရှိ"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"စင့်ခ်လုပ်၍ မရပါ"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> များစွာကို ဖျက်ရန် ကြိုးစားထားသည်။"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"တက်ဘလက်တွင် သိမ်းဆည်းသော နေရာ ကုန်သွားပါပြီ။ တချို့ ဖိုင်များ ဖျက်စီးခြင်းဖြင့် နေရာလွတ် ပြုလုပ်ပါ"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"သိုလှောင်ခန်း နေရာ ပြည့်နေပြီ။ နေရာ လွတ်လာရန် ဖိုင် အချို့ကို ဖျက်ပါ။"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"တီဗွီ၏ သိုလှောင်ရုံ ပြည့်နေ၏။ နေရာလွတ်ရရန် ဖိုင်တစ်ချို့အား ဖျက်ပစ်ပါ။"</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"သင်၏အလုပ်ပရိုဖိုင် စီမံခန့်ခွဲသူမှ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ဖြင့်"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"အလုပ်ပရိုဖိုင် ဖျက်ပြီးဖြစ်၏"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"စီမံခန့်ခွဲရန် အက်ပ်မရှိသောကြောင့် အလုပ်ပရိုဖိုင်ကို ဖျက်လိုက်ခြင်းဖြစ်သည်"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"အလုပ်ပရိုဖိုင် စီမံခန့်ခွဲရန်အက်ပ် မရှိပါ သို့မဟုတ် ပျက်စီးနေပါသည်။ ထို့ကြောင့် သင်၏ အလုပ်ပရိုဖိုင်နှင့် ဆက်စပ်နေသော ဒေတာများကို ဖျက်လိုက်ပါပြီ။ အကူအညီရယူရန် သင်၏စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"ဤစက်ပစ္စည်းတွင် သင်၏ အလုပ်ပရိုဖိုင်မရှိတော့ပါ"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"စကားဝှက်ထည့်သွင်းရန် ကြိုးစားသည့် အကြိမ်အရေအတွက် အလွန်များသွား၍ ဖြစ်ပါသည်"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"စက်ပစ္စည်းကို စီမံခန့်ခွဲထားပါသည်"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"ဤစက်ပစ္စည်းကို သင်၏ အဖွဲ့အစည်းက စီမံပြီး ကွန်ရက်အသွားအလာကို စောင့်ကြည့်နိုင်ပါသည်။ ထပ်မံလေ့လာရန် တို့ပါ။"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"သင့်ကိရိယာအား ပယ်ဖျက်လိမ့်မည်"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"စီမံခန့်ခွဲရန် အက်ပ်ကို သုံး၍မရပါ။ သင်၏ စက်ပစ္စည်းအတွင်းရှိ အရာများကို ဖျက်လိုက်ပါမည်။\n\nမေးမြန်းစရာများရှိပါက အဖွဲ့အစည်း၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"စီမံခန့်ခွဲမှု အက်ပ်ကို သုံး၍မရပါ။ သင်၏ စက်ပစ္စည်းအတွင်းရှိ အရာများကို ဖျက်လိုက်ပါမည်\n\nမေးစရာများရှိပါက သင့်အဖွဲ့အစည်း၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> က ပုံနှိပ်ထုတ်ယူခြင်းကို ပိတ်ထားသည်။"</string>
<string name="me" msgid="6545696007631404292">"ကျွန်ုပ်"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tabletဆိုင်ရာရွေးချယ်မှုများ"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ဖွင့်ထားသည်"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ပိတ်ထားသည်"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ဘက်ထရီ ချွေတာမှုစနစ်"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ဘက်ထရီချွေတာခြင်းမုဒ်ကို ပိတ်ထားသည်"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ဘက်ထရီချွေတာခြင်းမုဒ်ကို ဖွင့်ထားသည်"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ဆက်တင်များ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"အကူအညီ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"အသံ အကူအညီ"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"အလုပ်ပရိုဖိုင်သို့ ပြောင်းရန်"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"အဆက်အသွယ်များ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"သင့် အဆက်အသွယ်များအား ဝင်ရောက်သုံးရန်"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား သင်၏အဆက်အသွယ်များကို သုံးခွင့်ပေးရန်"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင်၏အဆက်အသွယ်များကို သုံးခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"တည်နေရာ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ဤစက်ပစ္စည်း၏ တည်နေရာကို ရယူရန်"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား ဤစက်ပစ္စည်း၏တည်နေရာကို သုံးခွင့်ပေးရန်"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား ဤစက်ပစ္စည်း၏တည်နေရာကို သုံးခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ပြက္ခဒိန်"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"သင့်ပြက္ခဒိန်အား ဝင်ရောက်သုံးရန်"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား သင်၏ပြက္ခဒိန်ကို သုံးခွင့်ပေးရန်"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင်၏ပြက္ခဒိန်ကို သုံးခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS စာတိုစနစ်"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS စာများကို ပို့ကာ ကြည့်မည်"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား SMS မက်ဆေ့ဂျ်များကို ကြည့်ရှုခွင့်နှင့် ပို့ခွင့်ပေးရန်"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား SMS မက်ဆေ့ဂျ်များ ကြည့်ရှုခွင့်နှင့် ပို့ခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"သိုလှောင်မှုများ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"သင့်ဖုန်းရှိ ဓာတ်ပုံများ၊ မီဒီယာနှင့် ဖိုင်များအား ဝင်သုံးပါ"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား သင့်ဖုန်းရှိ ဓာတ်ပုံများ၊ မီဒီယာနှင့် ဖိုင်များအားကို ဝင်သုံးခွင့်ပေးရန်"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင့်ဖုန်းရှိ ဓာတ်ပုံများ၊ မီဒီယာနှင့် ဖိုင်များ ဝင်သုံးခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"မိုက်ခရိုဖုန်း"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"အသံဖမ်းခြင်း"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား အသံဖမ်းယူခွင့် ပေးရန်"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား အသံဖမ်းယူခွင့် ပေးလိုပါသလား။"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ကင်မရာ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ဓာတ်ပုံ ရိုက်ပြီးနောက် ဗွီဒီယို မှတ်တမ်းတင်ရန်"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား ဓာတ်ပုံနှင့် ဗီဒီယိုရိုက်ကူးခွင့် ပြုရန်"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား ဓာတ်ပုံနှင့် ဗီဒီယိုရိုက်ကူးခွင့် ပေးလိုပါသလား။"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ဖုန်း"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန်နှင့် စီမံရန်"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ခွင့်နှင့် စီမံခွင့်ပေးရန်"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ခွင့်နှင့် စီမံခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ခန္ဓာကိုယ် အာရုံခံကိရိယာများ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"သင်၏ အဓိကကျသော လက္ခဏာများအကြောင်း အာရုံခံကိရိယာဒေတာကို ရယူသုံးစွဲရန်"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"<xliff:g id="APP_NAME">%1$s</xliff:g> အား သင်၏ အသက်ရှင်မှုလက္ခဏာ အာရုံခံကိရိယာ အချက်အလက်များကို သုံးခွင့်ပေးရန်"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင်၏ အသက်ရှင်မှုလက္ခဏာ အာရုံခံကိရိယာ ဒေတာများကို သုံးခွင့်ပေးလိုပါသလား။"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ဝင်းဒိုးတွင် ပါရှိသည်များကို ပြန်လည်ရယူရန်"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"သင်အသုံးပြုနေသော ဝင်းဒိုးတွင် ပါရှိသည်များကို ကြည့်ရှုစစ်ဆေးသည်။"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"တို့ထိခြင်းဖြင့် ရှာဖွေမှုကို ဖွင့်ရန်"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"လက်ဟန်များ အသုံးပြုပါ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"တို့ခြင်း၊ ပွတ်ဆွဲခြင်း၊ နှင့် အခြား လက်ဟန်များကို အသုံးပြုနိုင်ပါသည်။"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"လက်ဗွေရာများ"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"ကိရိယာ၏ လက်ဗွေအာရုံခံကိရိယာတွင် နှိပ်ထားသည်များကို မှတ်သားထားနိုင်သည်။"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"စက်ပစ္စည်း၏ လက်ဗွေအာရုံခံကိရိယာတွင် လုပ်ဆောင်ထားသည့် လက်ဟန်များကို မှတ်သားထားနိုင်သည်။"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"အခြေအနေပြဘားအား အလုပ်မလုပ်ခိုင်းရန်သို့မဟုတ် မွမ်းမံရန်"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"အက်ပ်အား အခြေအနေပြ ဘားကို ပိတ်ခွင့် သို့မဟတ် စနစ် အိုင်ကွန်များကို ထည့်ခြင်း ဖယ်ရှားခြင်း ပြုလုပ်ခွင့် ပြုသည်။"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"အခြေအနေပြ ဘားဖြစ်ပါစေ"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"အပလီကေးရှင်းအား မှတ်ဉာဏ်ထဲတွင် ရေရှည်သိမ်းဆည်ထားရန် ခွင့်ပြုပါ။ ဒီခွင့်ပြုချက်ကြောင့် တခြားအပလီကေးရှင်းအများအတွက် မှတ်ဉာဏ်ရရှိမှု နည်းသွားနိုင်ပြီး တက်ဘလက်လည်း နှေးသွားနိုင်ပါသည်။"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"မှတ်ဉာဏ်တွင် ၎င်း၏အစိတ်အပိုင်းများကိုယ်တိုင် တည်မြဲနေစေရန် အက်ပ်အား ခွင့်ပြုပါ။ ဤနည်းဖြင့် တီဗွီကို နှေးစေသော အခြား အက်ပ်များ၏ မှတ်ဉာဏ်ကို ကန့်သတ်ထားနိုင်သည်။"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"အပလီကေးရှင်းအား မှတ်ဉာဏ်ထဲတွင် ရေရှည်သိမ်းဆည်ထားရန် ခွင့်ပြုပါ။ ဒီခွင့်ပြုချက်ကြောင့် တခြားအပလီကေးရှင်းအများအတွက် မှတ်ဉာဏ်ရရှိမှု နည်းသွားနိုင်ပြီး ဖုန်းလည်း နှေးသွားနိုင်ပါသည်။"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"မျက်နှာစာ ဝန်ဆောင်မှုကို ဖွင့်ခြင်း"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"မျက်နှာစာဝန်ဆောင်မှုများကို အက်ပ်အား အသုံးပြုခွင့်ပေးသည်။"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"အက်ပ်သိုလ​ှောင်မှု နေရာကို တိုင်းထွာခြင်း"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"အက်ပ်အား ၎င်း၏ ကုဒ်၊ ဒေတာ၊ နှင့် ကက်ရှ ဆိုက်များကို ရယူခွင့် ပြုသည်။"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"စနစ်အပြင်အဆင်အား မွမ်းမံခြင်း"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ပုံစံဖြင့် သော့ဖွင့်ခြင်း"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"မျက်နှာမှတ် သော့ဖွင့်ခြင်း"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ပင်နံပါတ်ဖြင့် သော့ဖွင့်ခြင်း"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"ဆင်းမ်ကဒ် ပင်နံပါတ်လော့ခ်ဖွင့်ပါ။"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"ဆင်းမ်ကဒ် Puk လော့ခ်ဖွင့်ပါ။"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"စကားဝှက်ဖြင့် သော့ဖွင့်ခြင်း"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ပုံစံနေရာ"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ဘေးတိုက်ပွတ်ဆွဲရန် နေရာ"</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"clipboardထံ စာသားအားကူးယူမည်"</string>
<string name="more_item_label" msgid="4650918923083320495">"နောက်ထပ်"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ဖျက်ရန်"</string>
@@ -967,7 +978,7 @@
<string name="VideoView_error_title" msgid="3534509135438353077">"ဗီဒီယို ပြဿနာ"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"ဒီဗိဒီယိုမှာ ဒီကိရိယာ ပေါ်မှာ ဖွင့်ကြည့်၍ မရနိုင်ပါ။"</string>
<string name="VideoView_error_text_unknown" msgid="3450439155187810085">"ဒီဗီဒီယိုကို ပြသလို့ မရပါ"</string>
- <string name="VideoView_error_button" msgid="2822238215100679592">"အိုကေ"</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"OK"</string>
<string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="noon" msgid="7245353528818587908">"မွန်းတည့်"</string>
<string name="Noon" msgid="3342127745230013127">"မွန်းတည့်"</string>
@@ -1007,9 +1018,9 @@
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"စနစ်အတွက် သိုလှောင်ခန်း မလုံလောက်ပါ။ သင့်ဆီမှာ နေရာလွတ် ၂၅၀ MB ရှိတာ စစ်ကြည့်ပြီး စတင်ပါ။"</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> က အလုပ်လုပ်နေသည်။"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"နောက်ထပ်အချက်အလက်များကို ကြည့်ရန် သို့မဟုတ် အက်ပ်ကိုရပ်တန့်ရန် တို့ပါ။"</string>
- <string name="ok" msgid="5970060430562524910">"အိုကေ"</string>
+ <string name="ok" msgid="5970060430562524910">"OK"</string>
<string name="cancel" msgid="6442560571259935130">"မလုပ်တော့"</string>
- <string name="yes" msgid="5362982303337969312">"အိုကေ"</string>
+ <string name="yes" msgid="5362982303337969312">"OK"</string>
<string name="no" msgid="5141531044935541497">"မလုပ်တော့"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"သတိပြုရန်"</string>
<string name="loading" msgid="7933681260296021180">"တင်နေ…"</string>
@@ -1057,7 +1068,7 @@
<string name="anr_activity_process" msgid="1622382268908620314">"<xliff:g id="ACTIVITY">%1$s</xliff:g> သည်တုံ့ပြန်မှုမရှိပါ"</string>
<string name="anr_application_process" msgid="6417199034861140083">"<xliff:g id="APPLICATION">%1$s</xliff:g> သည်တုံ့ပြန်မှုမရှိပါ"</string>
<string name="anr_process" msgid="6156880875555921105">"<xliff:g id="PROCESS">%1$s</xliff:g> လုပ်ဆောင်ချက်သည် တုံ့ပြန်မှုမရှိပါ"</string>
- <string name="force_close" msgid="8346072094521265605">"အိုကေ"</string>
+ <string name="force_close" msgid="8346072094521265605">"OK"</string>
<string name="report" msgid="4060218260984795706">"သတင်းပို့ပါ"</string>
<string name="wait" msgid="7147118217226317732">"စောင့်ဆိုင်းရန်"</string>
<string name="webpage_unresponsive" msgid="3272758351138122503">"စာမျက်နှာမှာ ပြန်လည် တုံ့ပြန်မှု မရှိတော့ပါ။\n\nပိတ်လိုက်ချင်ပါသလား?"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"အပ်ဒိတ်အတွက် စစ်ကြည့်ရန်"</string>
<string name="smv_application" msgid="3307209192155442829">"app <xliff:g id="APPLICATION">%1$s</xliff:g> (လုပ်ငန်းစဉ် <xliff:g id="PROCESS">%2$s</xliff:g>) က ကိုယ်တိုင် ပြဌာန်းခဲ့သည့် StrictMode မူဝါဒကို ချိုးဖောက်ခဲ့သည်။"</string>
<string name="smv_process" msgid="5120397012047462446">"ဤ<xliff:g id="PROCESS">%1$s</xliff:g>ဖြစ်စဥ်မှာ ကိုယ်တိုင်အကျိုးသက်ရောက်သော StrictModeမူဝါဒအား ချိုးဖောက်သည်"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"အန်ဒရွိုက်ကို မွမ်းမံနေ…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android စတင်နေ…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ဖုန်းကို အပ်ဒိတ်လုပ်နေသည်…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"တက်ဘလက်ကို အပ်ဒိတ်လုပ်နေသည်…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"စက်ပစ္စည်းကို အပ်ဒိတ်လုပ်နေသည်…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ဖုန်း စတင်နေသည်…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"တက်ဘလက် စတင်နေသည်…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"စက်ပစ္စည်း စတင်နေသည်…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"သိုလှောင်မှုအား ပြုပြင်ခြင်း။"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android အပ်ဒိတ်ကို အပြီးသတ်နေသည်…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"အဆင့်မြှင့်တင်ခြင်း မပြီးဆုံးသေးသ၍ အချို့အက်ပ်များကို ကောင်းမွန်စွာအသုံးပြုနိုင်ဦးမည် မဟုတ်ပါ"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"စနစ်အပ်ဒိတ်ကို အပြီးသတ်နေသည်…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ကို အဆင့်မြှင့်တင်နေပါသည်…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> ထဲက အက်ပ်<xliff:g id="NUMBER_1">%2$d</xliff:g>ကို ဆီလျော်အောင် လုပ်နေ"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> အားပြင်ဆင်နေသည်။"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"အက်ပ်များကို စတင်နေ"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"လုပ်ငန်းစနစ်ထည့်သွင်း၍ ပြန်လည်စတင်ရန် ပြီးပါပြီ"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> က အလုပ်လုပ်နေသည်"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"ဂိမ်းသို့ ပြန်သွားရန် တို့ပါ"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ဂိမ်းကို ရွေးခြင်း"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"စွမ်းဆောင်ရည် ပိုမိုကောင်းမွန်စေရန် တစ်ကြိမ်လျှင် အောက်ပါဂိမ်းတစ်ခုကိုသာ ဖွင့်ပါ။"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> သို့ ပြန်သွားရန်"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> ကို ဖွင့်ရန်"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"မသိမ်းဘဲ <xliff:g id="OLD_APP">%1$s</xliff:g> ကို ပိတ်လိုက်ပါမည်"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> သိမ်းထားနိုင်မှု အကန့်အသတ် ကျော်လွန်နေ"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"သိမ်းဆည်းနိုင်မှု ပမာဏကျော်လွန်သွားပါပြီ။ မျှဝေရန် တို့ပါ"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"သိမ်းဆည်းနိုင်မှု ပမာဏကျော်လွန်သွားပါပြီ။ မျှဝေရန် တို့ပါ။"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"အရေးပေါ် သိမ်းထားပေးမှု ကို မျှဝေမလား။"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> လုပ်ဆောင်နိုင်မှုသည် <xliff:g id="SIZE">%2$s</xliff:g>ရှိသည့် သိမ်းထားနိုင်မှု ပမာဏထက်ကျော်လွန်သွားသည်။ စက်လုပ်ဆောင်ရည်မြင့်တင်ပေးသူနှင့် မျှဝေမှုလုပ်ရန် အရေးပေါ်သိမ်းထားပေးမှု ရမည်။"</string>
<string name="sendText" msgid="5209874571959469142">"စာတိုအတွက် လုပ်ဆောင်ချက် ရေးပါ"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"အများသုံး Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပါ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ဝန်ဆောင်မှုပေးသူ Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပါ"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"အများသုံး Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်နေသည်"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပြီးပါပြီ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်၍ မရပါ"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ကွန်ရက်အားလုံးကို ကြည့်ရန် တို့ပါ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ချိတ်ဆက်ရန်"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ကွန်ရက်အားလုံး"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ကွန်ရက်အားလုံး"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ကို အလိုအလျောက်​ ပြန်ဖွင့်ပေးလိမ့်ပါမည်"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"သိမ်းဆည်းထားသည့် အရည်အသွေးမြင့်ကွန်ရက်များအနီးသို့ ရောက်ရှိသည့်အခါ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ပြန်မဖွင့်ပါနှင့်"</string>
@@ -1205,6 +1214,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"အစက ပြန်စရန်"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"မိုဘိုင်းဝန်ဆောင်မှု စတင်ဖွင့်လှစ်ရန်"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"သင့်ဆင်းမ်ကဒ်အသစ်ကို စတင်အသုံးပြုရန် ဝန်ဆောင်မှုပေးသူအက်ပ်ကို ဒေါင်းလုဒ်လုပ်ပါ"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"သင်၏ ဆင်းမ်ကဒ်အသစ်ကို စဖွင့်အသုံးပြုနိုင်ရန် <xliff:g id="APP_NAME">%1$s</xliff:g> အက်ပ်ကို ဒေါင်းလုဒ်လုပ်ပါ"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"အက်ပ် ဒေါင်းလုဒ်လုပ်ရန်"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM အသစ်ထည့်သွင်းလိုက်ပါသည်"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"၎င်းကိုတပ်ဆင်ရန် တို့ပါ"</string>
@@ -1216,20 +1226,20 @@
<string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> မှ ထောက်ပံ့သည်"</string>
<string name="no_permissions" msgid="7283357728219338112">"ခွင့်ပြုချက်မလိုအပ်ပါ"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"သင့်အတွက် ပိုက်ဆံကုန်ကျနိုင်ပါသည်"</string>
- <string name="dlg_ok" msgid="7376953167039865701">"အိုကေ"</string>
+ <string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
<string name="usb_charging_notification_title" msgid="1595122345358177163">"ဤစက်ပစ္စည်းကို USB မှတစ်ဆင့် အားသွင်းနေသည်"</string>
<string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB မှတစ်ဆင့် ချိတ်ဆက်ထားသည့် စက်ပစ္စည်းကို အားသွင်းနေသည်"</string>
<string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ဖြင့် ဖိုင်လွှဲပြောင်းခြင်းကို ဖွင့်ထားသည်"</string>
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB မှတစ်ဆင့် PTP ကို အသုံးပြုရန် ဖွင့်ထားသည်"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB မှတစ်ဆင့် မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ်သုံးရန် ဖွင့်ထားသည်"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB မှတစ်ဆင့် MIDI ကို အသုံးပြုရန် ဖွင့်ထားသည်"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB တွဲဖက်ပစ္စည်းမုဒ်ကို ဖွင့်ထားသည်"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB တွဲဖက်ပစ္စည်းကို ချိတ်ဆက်ထားသည်"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"နောက်ထပ်ရွေးချယ်စရာများအတွက် တို့ပါ။"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"ချိတ်ဆက်ထားသည့် စက်ပစ္စည်းကို အားသွင်းနေသည်။ နောက်ထပ်ရွေးချယ်စရာများအတွက် တို့ပါ။"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"အန်နာလော့ အသံကိရိယာကို တွေ့ထားပါသည်"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"တပ်ဆင်ထားသော ကိရိယာကို ဤဖုန်းနှင့် တွဲသုံး၍မရပါ။ ပိုမိုလေ့လာရန် တို့ပါ။"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB အမှားရှာပြင်စနစ် ချိတ်ဆက်ထားသည်"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB အမှားရှာပြင်စနစ် ပိတ်ရန် တို့ပါ။"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB အမှားရှာပြင်ခြင်းကို ပိတ်ရန် တို့ပါ"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ဖြင့် အမှားရှာပြင်ခြင်းကို ပိတ်ရန် ရွေးပါ။"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ချွတ်ယွင်းချက် အစီရင်ခံစာပြုစုနေသည်..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ချွတ်ယွင်းချက် အစီရင်ခံစာကို မျှဝေမလား။"</string>
@@ -1248,7 +1258,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> သည် အခြားအက်ပ်များအပေါ်တွင် ပြပါသည်"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ကို အခြားအက်ပ်များပေါ်တွင် မြင်နေရပါသည်။"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ကို ဤဝန်ဆောင်မှုအား အသုံးမပြုစေလိုလျှင် ဆက်တင်ကို တို့၍ ဖွင့်ပြီး ၎င်းကို ပိတ်လိုက်ပါ။"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ပိတ်ပါ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ပိတ်ရန်"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ပြင်ဆင်နေသည်"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"အမှားအယွင်းများ စစ်ဆေးနေသည်"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> အသစ်တွေ့ရှိပါသည်"</string>
@@ -1334,14 +1344,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"အမြဲတမ်းဖွင့်ထား VPN ဆက်သွယ်နေစဉ်…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"အမြဲတမ်းဖွင့်ထား VPN ဆက်သွယ်မှုရှိ"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"အမြဲပွင့်နေသော VPN မှ ချိတ်ဆက်မှုပြုတ်သွားပါပြီ"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"အမြဲတမ်းဖွင့်ထား VPN အမှား"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"အမြဲပွင့်နေသော VPN ကို ချိတ်ဆက်၍မရပါ"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"ကွန်ရက် သို့မဟုတ် VPN ဆက်တင်များကို ပြောင်းပါ"</string>
<string name="upload_file" msgid="2897957172366730416">"ဖိုင်ရွေးချယ်ရန်"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"မည်သည့်ဖိုင်ကိုမှမရွေးပါ"</string>
<string name="reset" msgid="2448168080964209908">"ပြန်လည်သတ်မှတ်ရန်"</string>
<string name="submit" msgid="1602335572089911941">"ပေးပို့ရန်"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"ကားထဲတွင်အသုံးပြုနိုင်သောစနစ် ရရှိနိုင်သည်"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"ကားမောင်းနှင်ခြင်းမုဒ်မှ ထွက်ရန် တို့ပါ။"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"ကားမောင်းသည့်အက်ပ် ပွင့်နေပါသည်"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"ကားမောင်းသည့်အက်ပ်မှ ထွက်ရန် တို့ပါ။"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"တဆင့်ပြန်လည်လွှင့်ခြင်း သို့မဟုတ် ဟော့စပေါ့ ဖွင့်ထားသည်"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"စနစ်ထည့်သွင်းရန် တို့ပါ။"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ်သုံးခြင်းအား ပိတ်ထားသည်"</string>
@@ -1419,22 +1429,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ဒရိုက်ဗ်"</string>
<string name="storage_usb" msgid="3017954059538517278">"USBဖြင့် သိမ်းဆည်း"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ပြင်ဆင်ရန်"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"ဒေတာအသုံးပြုမှုသတိပေးချက်"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"အသုံးပြုမှုနှင့် ဆက်တင်များကိုကြည့်ရန် တို့ပါ။"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ဒေတာသတိပေးချက်"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"သင်ဒေတာ <xliff:g id="APP">%s</xliff:g> သုံးပြီးပါပြီ"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"မိုဘိုင်းဒေတာကန့်သတ်ချက်ပြည့်ပြီ"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ကြိုးမဲ့ ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"ကျန် စက်ဝန်း အတွက် ဒေတာကို ဆိုင်းငံ့ထား"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"သတ်မှတ်ထားသော2G-3Gဒေတာအားကျော်လွန်နေသည်"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"သတ်မှတ်ထားသော4Gဒေတာအားကျော်လွန်နေသည်"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"သတ်မှတ်မိုဘိုင်းဒေတာထက်ကျော်နေ"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"သတ်မှတ်ဝိုင်ဖိုင်ဒေတာထက်ကျော်နေ"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"သက်မှတ်နှုန်းထက် <xliff:g id="SIZE">%s</xliff:g> ကျော်နေပါသည်"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"ကျန်ရှိသက်တမ်းတစ်လျှောက် ဒေတာကို ခေတ္တရပ်ထားပါသည်"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"ဒေတာ ကန့်သတ်ချက် ကျော်သွားပါပြီ"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi ဒေတာကန့်သတ်ချက် ကျော်ပါပြီ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"သင့်အတွက် သတ်မှတ်ထားသည့် ကန့်သတ်ချက်အပြင် <xliff:g id="SIZE">%s</xliff:g> သုံးထားပါသည်"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"နောက်ခံဒေတာ ကန့်သတ်ထားသည်"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"ကန့်သတ်ချက်ကိုဖယ်ရှားရန် တို့ပါ။"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"ဒေတာသုံးစွဲမှု များပြားခြင်း"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"ပြီးခဲ့သည့်ရက်အနည်းငယ်က သင်၏ဒေတာသုံးစွဲမှုသည် ပုံမှန်ထက်ပိုများပါသည်။ သုံးစွဲမှုနှင့် ဆက်တင်များကိုကြည့်ရန် တို့ပါ။"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"မိုဘိုင်းဒေတာအသုံးပြုမှုမြင့်သည်"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"သင့်အက်ပ်များသည် ပုံမှန်ထက်မက ဒေတာများ သုံးထားသည်"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> သည် ပုံမှန်ထက်မက ဒေတာများ သုံးထားသည်"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"လုံခြံုမှုဆိုင်ရာ အသိအမှတ်ပြုလက်မှတ်"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ဤအသိအမှတ်ပြုလက်မှတ်မှာ တရားဝင်သည်"</string>
<string name="issued_to" msgid="454239480274921032">"ထုတ်ပေးသည်-"</string>
@@ -1670,7 +1677,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"သင်၏ စီမံခန့်ခွဲသူက ထည့်သွင်းထားသည်"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"သင်၏ စီမံခန့်ခွဲသူက အပ်ဒိတ်လုပ်ထားသည်"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"ဘက်ထရီ သက်တမ်းကြာရှည်ခံရန်အတွက် ဘက်ထရီ အားထိန်းသည် သင့်စက်ပစ္စည်း၏ စွမ်းဆောင်ရည်၊ တုန်ခါမှု၊ တည်နေရာ ဝန်ဆောင်မှုများနှင့် နောက်ခံဒေတာ အများစုတို့ကို လျှော့ချပေးပါသည်။ စင့်ခ်လုပ်ခြင်းကို အားထားနေရသည့် အီးမေးလ်၊ စာပို့ခြင်းနှင့် အခြားအက်ပ်များကို သင်မဖွင့်မချင်း အပ်ဒိတ်လုပ်မည် မဟုတ်ပါ။\n\nသင့်စက်ပစ္စည်းကို အားသွင်းနေသည့်အခါ ဘက်ထရီ အားထိန်းကို အလိုအလျောက် ပိတ်လိုက်ပါမည်။"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ဒေတာအသုံးလျှော့ချနိုင်ရန် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမရှိစေရန် ဒေတာချွေတာမှုစနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင် မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ဒေတာအသုံးပြုမှု ချွေတာမှုစနစ်ကို ဖွင့်မလား။"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ဖွင့်ပါ"</string>
@@ -1682,9 +1690,9 @@
<item quantity="other">(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ထိ) %1$d မိနစ်အတွက်</item>
<item quantity="one">(<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> ထိ) ၁မိနစ်အတွက်</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d နာရီကြာ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>အထိ)</item>
- <item quantity="one">တစ်နာရီကြာ (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> အထိ)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d နာရီကြာ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ထိ)</item>
+ <item quantity="one">၁ နာရီကြာ (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> ထိ)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">(<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ထိ) %1$d နာရီအတွက်</item>
@@ -1698,9 +1706,9 @@
<item quantity="other">%d မိနစ်အတွက်</item>
<item quantity="one">၁ မိနစ်အတွက်</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d နာရီကြာ</item>
- <item quantity="one">တစ်နာရီကြာ</item>
+ <item quantity="one">၁ နာရီကြာ</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d နာရီ အတွက်</item>
@@ -1721,14 +1729,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> အသံပိတ်သည်"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေပြီး၊ မူလစက်ရုံထုတ်အခြေအနေအဖြစ် ပြန်လည်ရယူနိုင်သည်အထိ အခြေအနေမတည်ငြိမ်နိုင်ပါ။"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေ၏။ အသေးစိတ်သိရန်အတွက် ပစ္စည်းထုတ်လုပ်သူအား ဆက်သွယ်ပါ။"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"DIAL တောင်းဆိုချက်အရ USSD တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"SS တောင်းဆိုချက် အရ USSD တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD တောင်းဆိုချက် အသစ်အရ USSD တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD တောင်းဆိုချက်အား Video DIAL တောင်းဆိုချက်သို့ ပြုပြင်ထားသည်။"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"DIAL တောင်းဆိုချက်အရ SS တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS တောင်းဆိုချက်အား Video DIAL တောင်းဆိုချက်သို့ ပြုပြင်ထားသည်။"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"USSD တောင်းဆိုချက်အရ SS တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS တောင်းဆိုချက်အရ SS တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"အလုပ်ကိုယ်ရေးအချက်အလက်"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ချဲ့ရန်"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ခေါက်သိမ်းရန်"</string>
@@ -1838,7 +1854,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"အန္တရာယ်ရှိသော အက်ပ်ကို တွေ့ရှိထားသည်"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> သည် <xliff:g id="APP_2">%2$s</xliff:g> ၏အချပ်များကို ပြသလိုသည်"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"တည်းဖြတ်ရန်"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များ တုန်ခါပါမည်"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များကို အသံပိတ်ထားပါမည်"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"စနစ် အပြောင်းအလဲများ"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"မနှောင့်ယှက်ရ"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"သင်အာရုံစိုက်နိုင်စေရန် \'မနှောင့်ယှက်ရ\' က အကြောင်းကြားချက်များကို ဖျောက်ထားသည်"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"၎င်းသည် အမူအကျင့်အသစ်ဖြစ်သည်။ ပြောင်းရန် တို့ပါ။"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'မနှောင့်ယှက်ရ\' ပြောင်းလဲသွားပါပြီ"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ကြားဖြတ်ခြင်းများအတွက် သင်၏ အမူအကျင့်ဆက်တင်များကို စစ်ဆေးရန် တို့ပါ"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ပိတ်ထားသည့်အရာများကို ကြည့်ရန် တို့ပါ။"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"စနစ်"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"ဆက်တင်များ"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index b1a254fee2ff..9e94f92f47e9 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Nummervisning er ikke begrenset som standard. Neste anrop: Ikke begrenset"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"SIM-kortet er ikke tilrettelagt for tjenesten."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Du kan ikke endre innstillingen for anrops-ID."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Ingen datatjeneste"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Ingen nødanrop"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Ingen mobildatatjeneste"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Nødanrop er utilgjengelig"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ingen taletjeneste"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ingen tale-/nødtjeneste"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Tilbys midlertidig ikke gjennom mobilnettverket der du er"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Får ikke kontakt med nettverket"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"For å forbedre signalet, prøv å endre valgt nettverkstype i Innstillinger &gt; Nettverk og Internett &gt; Mobilnettverk &gt; Foretrukket nettverkstype."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi-anrop er aktivt"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Du trenger et mobilnettverk for å utføre nødanrop."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ingen taletjeneste eller nødanrop"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Midlertidig deaktivert av operatøren din"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Får ikke kontakt med mobilnettverket"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prøv å endre foretrukket nettverk. Trykk for å endre."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Nødanrop er utilgjengelig"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Kan ikke ringe nødnumre via Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Varsler"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderekobling"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modusen nødsamtale-tilbakeringing"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roaming-banner på"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roaming-banner av"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Leter etter tjeneste"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-anrop"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"For å ringe og sende meldinger over Wi-Fi, må du først be operatøren om å konfigurere denne tjenesten. Deretter slår du på Wi-Fi-anrop igjen fra Innstillinger. (Feilkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registrer deg hos operatøren din (feilkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi-anrop"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"For mange forespørsler blir behandlet. Prøv igjen senere."</string>
<string name="notification_title" msgid="8967710025036163822">"Påloggingsfeil for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synkronisering"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synkronisering"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"For mange slettinger av <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Nettbrettlageret er fullt. Slett noen filer for å frigjøre lagringsplass."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Klokkens lagringsplass er full. Slett filer for å frigjøre plass."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV-ens lagringsplass er full. Slett noen filer for å frigjøre mer plass."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Av administratoren for jobbprofilen din"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Av <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Arbeidsprofilen er slettet"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Jobbprofilen er slettet på grunn av manglende administratorapp"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Administratorappen for jobbprofilen mangler eller er skadet. Dette har ført til at jobbprofilen og alle data knyttet til den, har blitt slettet. Ta kontakt med administratoren for å få hjelp."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Jobbprofilen din er ikke lenger tilgjengelig på denne enheten"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"For mange passordforsøk"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Enheten administreres"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Organisasjonen din kontrollerer denne enheten og kan overvåke nettverkstrafikk. Trykk for å få mer informasjon."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Enheten blir slettet"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Administratorappen kan ikke brukes. Enheten din blir nå tømt.\n\nTa kontakt med administratoren for organisasjonen din hvis du har spørsmål."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Administratorappen kan ikke brukes. Enheten din blir nå tømt.\n\nTa kontakt med administratoren for organisasjonen din hvis du har spørsmål."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> har slått av utskrift."</string>
<string name="me" msgid="6545696007631404292">"Meg"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Innstillinger for nettbrettet"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flymodus"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flymodus er på"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flymodus er av"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterisparing"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterisparing er AV"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterisparing er PÅ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Innstillinger"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hjelp"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Talehjelp"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Bytt til jobbprofil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"se kontaktene dine"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til kontaktene dine"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Posisjon"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"få tilgang til enhetens plassering"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til denne enhetens posisjon"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"åpne kalenderen din"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til kalenderen din"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"sende og lese SMS-meldinger"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"La &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; sende og se SMS-meldinger"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Lagring"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"åpne bilder, medieinnhold og filer på enheten din"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til bilder, medier og filer på enheten din"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ta opp lyd"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"La &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ta opp lyd"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ta bilder og ta opp video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"La &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ta bilder og spille inn video"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ring og administrer anrop"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"La &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ringe og administrere telefonsamtaler"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kroppssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få tilgang til sensordata om de vitale tegnene dine"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til sensordata om de vitale tegnene dine"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"hente innhold i vinduer"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Appen analyserer innholdet i vinduer du samhandler med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"slå på berøringsutforsking"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Gjøre bevegelser"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Kan trykke, sveipe, klype og gjøre andre bevegelser."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Bevegelser på fingeravtrykkssensor"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Kan fange inn bevegelser som utføres på enhetens fingeravtrykkssensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Kan fange inn bevegelser som utføres på enhetens fingeravtrykkssensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"deaktivere eller endre statusfeltet"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Lar appen deaktivere statusfeltet eller legge til og fjerne systemikoner."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"vise appen i statusfeltet"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Lar appen gjøre deler av seg selv vedvarende i minnet. Dette kan begrense minnet for andre apper og gjøre nettbrettet tregt."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Gjør at deler av appen kan legge seg vedvarende i minnet. Dette kan begrense minnets tilgjengelighet for andre apper, noe som gjør at TV-en går langsommere."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Lar appen gjøre deler av seg selv vedvarende i minnet. Dette kan begrense minnet for andre apper og gjøre telefonen treg."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"kjøre tjenesten i forgrunnen"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Lar appen bruke tjenester i forgrunnen."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"måle lagringsplass for apper"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Lar appen hente ut koden, dataene og bufferstørrelsene til appen"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"endre systeminnstillingene"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mønsteropplåsning."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ansiktsopplåsning."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-opplåsning."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"PIN-opplåsing for SIM-kort."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"PUK-opplåsing for SIM-kort."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Passordopplåsning."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mønsterområde."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Dra-felt."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Kopierte tekst til utklippstavlen."</string>
<string name="more_item_label" msgid="4650918923083320495">"Mer"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"menyknapp+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funksjon+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"mellomrom"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"slett"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Se etter oppdateringer"</string>
<string name="smv_application" msgid="3307209192155442829">"Appen <xliff:g id="APPLICATION">%1$s</xliff:g> (prosessen <xliff:g id="PROCESS">%2$s</xliff:g>) har brutt de selvpålagte StrictMode-retningslinjene."</string>
<string name="smv_process" msgid="5120397012047462446">"Prosessen<xliff:g id="PROCESS">%1$s</xliff:g> har brutt de selvpålagte StrictMode-retningslinjene."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android oppgraderes …"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android starter …"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefonen oppdateres …"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Nettbrettet oppdateres …"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Enheten oppdateres …"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefonen starter …"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Nettbrettet starter …"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Enheten starter …"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimaliser lagring."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Fullfører Android-oppdatering …"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Noen apper fungerer kanskje ikke skikkelig før oppgraderingen er fullført"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Fullfører systemoppdateringen …"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> oppgraderes …"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optimaliserer app <xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Forbereder <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starter apper."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Ferdigstiller oppstart."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> kjører"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Trykk for å gå tilbake til spillet"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Velg et spill"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"For å oppnå bedre ytelse kan bare ett av disse spillene være åpne om gangen."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Gå tilbake til <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Åpne <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> lukkes uten å lagre"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> er over minnegrensen"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Minnedumpen («heap dump») er samlet inn – trykk for å dele"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Vil du dele minnedumpen («heap dump»)?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g>-prosessen er <xliff:g id="SIZE">%2$s</xliff:g> over grensen for prosessminne. En minnedump («heap dump») er tilgjengelig for deling med utvikleren. Vær forsiktig – denne minnedumpen kan inneholde noen av de personlige opplysningene dine som appen har tilgang til."</string>
<string name="sendText" msgid="5209874571959469142">"Velg handling for tekst"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Koble til et åpent Wi‑Fi-nettverk"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Koble til operatørens Wi-Fi-nettverk"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Kobler til åpent Wi-Fi-nettverk"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Koblet til Wi-Fi-nettverk"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kunne ikke koble til Wi-Fi-nettverket"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trykk for å se alle nettverkene"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Koble til"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alle nettverk"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle nettverk"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi slås på automatisk"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Når du er i nærheten av et lagret nettverk av høy kvalitet"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ikke slå på igjen"</string>
@@ -1204,10 +1225,11 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Start på nytt"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktiver mobiltjeneste"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Last ned operatørappen for å aktivere det nye SIM-kortet ditt"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Last ned <xliff:g id="APP_NAME">%1$s</xliff:g>-appen for å aktivere det nye SIM-kortet ditt"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Last ned appen"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Et nytt SIM-kort er satt inn"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Trykk for å konfigurere"</string>
- <string name="time_picker_dialog_title" msgid="8349362623068819295">"Stille klokken"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"Oppgi tidspunkt"</string>
<string name="date_picker_dialog_title" msgid="5879450659453782278">"Angi dato"</string>
<string name="date_time_set" msgid="5777075614321087758">"Lagre"</string>
<string name="date_time_done" msgid="2507683751759308828">"Ferdig"</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB er slått på"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB-internettdeling er slått på"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB er slått på"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modus for USB-tilbehør er slått på"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-tilbehør er tilkoblet"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Trykk for å få flere alternativ."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Den tilkoblede enheten lades. Trykk for å se flere alternativer."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogt lydtilbehør ble oppdaget"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Den tilkoblede enheten er ikke kompatibel med denne telefonen. Trykk for å finne ut mer."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-feilsøking tilkoblet"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Trykk for å slå av feilsøking via USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Trykk for å slå av USB-feilsøking"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Velg for å deaktivere USB-debugging."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Kjører feilrapport …"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Vil du dele feilrapporten?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> vises over andre apper"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> vises over andre apper"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Hvis du ikke vil at <xliff:g id="NAME">%s</xliff:g> skal bruke denne funksjonen, kan du trykke for å åpne innstillingene og slå den av."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÅ AV"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Slå av"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Forbereder <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sjekker for feil"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> ble oppdaget"</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Alltid-på VPN kobler til ..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Alltid-på VPN er tilkoblet"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Koble fra alltid på-VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Alltid-på VPN-feil"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Endre nettverks- eller VPN-innstillingene"</string>
<string name="upload_file" msgid="2897957172366730416">"Velg fil"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil er valgt"</string>
<string name="reset" msgid="2448168080964209908">"Tilbakestill"</string>
<string name="submit" msgid="1602335572089911941">"Send inn"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Bilmodus er aktivert"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Trykk for avslutte bilmodus."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Internettdeling eller trådløs sone er aktiv"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Trykk for å konfigurere."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Internettdeling er slått av"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB-stasjon"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-lagring"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Endre"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Varsel om databruk"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Trykk for å se bruken og innstillingene."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Datagrensen for 2G-3G er nådd"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Datagrensen for 4G er nådd"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Varsel om databruk"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Du har brukt <xliff:g id="APP">%s</xliff:g> med data"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Grensen for mobildata er nådd"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Datagrensen for Wi-Fi er nådd"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Data er på pause resten av sykl."</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Grense på 2G-3G data overskredet"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Grensen på 4G data er overskredet"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Grensen for mobildatabruk er overskredet"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi-datagrense overskredet"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> over angitt grense."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data er på pause i resten av syklusen"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Over grensen for mobildata"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Over grensen din for Wi-Fi-data"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Du er <xliff:g id="SIZE">%s</xliff:g> over den angitte grensen din"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Bakgrunnsdata er begrenset"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Trykk for å fjerne begrensningen."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Høy databruk"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Databruken din de siste dagene er høyere enn vanlig. Trykk for å se bruken og innstillingene."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Høy bruk av mobildata"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Appene dine har brukt mer data enn vanlig"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> har brukt mer data enn vanlig"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Sikkerhetssertifikat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Sertifikatet er gyldig."</string>
<string name="issued_to" msgid="454239480274921032">"Utstedt til:"</string>
@@ -1669,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Installert av administratoren din"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Oppdatert av administratoren din"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Slettet av administratoren din"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Med batterisparing forlenges batterilevetiden ved at bruk av for eksempel vibrasjon, posisjonstjenester og bakgrunnsdata reduseres. E-post, sending av meldinger og andre apper som er avhengig av synkronisering, oppdateres kanskje ikke med mindre du åpner dem.\n\nBatterisparing slås av automatisk når enheten lader."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Datasparing hindrer at apper kan sende og motta data i bakgrunnen. Apper du bruker i øyeblikket, bruker ikke data i like stor grad – for eksempel vises ikke bilder før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Vil du slå på Datasparing?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Slå på"</string>
@@ -1681,8 +1704,8 @@
<item quantity="other">I %d minutter (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">I ett minutt (til <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">For %1$d timer (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">I %1$d timer (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">I 1 time (til <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
@@ -1697,7 +1720,7 @@
<item quantity="other">I %d minutter</item>
<item quantity="one">I ett minutt</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">I %d timer</item>
<item quantity="one">I 1 time</item>
</plurals>
@@ -1720,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> har kuttet lyden"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Det har oppstått et internt problem på enheten din, og den kan være ustabil til du tilbakestiller den til fabrikkdata."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Det har oppstått et internt problem på enheten din. Ta kontakt med produsenten for mer informasjon."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-forespørselen er endret til en RINGE-forespørsel."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-forespørselen er endret til en SS-forespørsel."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-forespørsel er endret til en ny USSD-forespørsel."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-forespørselen er endret til en RINGE-forespørsel med video."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-forespørselen er endret til en RINGE-forespørsel."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-forespørselen er endret til en RINGE-forespørsel med video."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-forespørselen er endret til en USSD-forespørsel."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-forespørselen er endret til en ny SS-forespørsel."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Arbeidsprofil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Vis"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skjul"</string>
@@ -1791,9 +1822,9 @@
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB-feilsøking"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"time"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"minutt"</string>
- <string name="time_picker_header_text" msgid="143536825321922567">"Still klokken"</string>
+ <string name="time_picker_header_text" msgid="143536825321922567">"Oppgi tidspunkt"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Angi et gyldig klokkeslett"</string>
- <string name="time_picker_prompt_label" msgid="7588093983899966783">"Skriv hva klokken er"</string>
+ <string name="time_picker_prompt_label" msgid="7588093983899966783">"Skriv inn tidspunktet"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Bytt til tekstinndatamodus for tidsinndata."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Bytt til klokkemodus for tidsinndata."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Alternativer for autofyll"</string>
@@ -1837,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"En skadelig app ble oppdaget"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vil vise <xliff:g id="APP_2">%2$s</xliff:g>-utsnitt"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Endre"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Anrop og varsler vibrerer"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Anrop og varsler er lydløse"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemendringer"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Ikke forstyrr"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"«Ikke forstyrr» skjuler varsler for å gjøre det enklere å fokusere"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dette er ny atferd. Trykk for å endre."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ikke forstyrr er endret"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Trykk for å sjekke atferdsinnstillingene dine for forstyrrelser"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Trykk for å sjekke hva som er blokkert."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 1eb0028df69b..976d49376f3d 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"कलर ID पूर्वनिर्धारितको लागि रोकावट छैन। अर्को कल: रोकावट छैन"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"सेवाको व्यवस्था छैन।"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"तपाईं कलर ID सेटिङ परिवर्तन गर्न सक्नुहुन्न।"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"कुनै पनि डेटा सेवा छैन"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"कुनै पनि आपतकालीन कल सेवा उपलब्ध छैन"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"कुनै पनि मोबाइल डेटा सेवा उपलब्ध छैन"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"आपतकालीन कल सेवा उपलब्ध छैन"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"कुनै पनि भ्वाइस सेवा उपलब्ध छैन"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"कुनै पनि भ्वाइस/आपतकालीन सेवा उपलब्ध छैन"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"तपाईंको स्थानमा सञ्चालन भइरहेको मोबाइल नेटवर्कले अस्थायी रूपमा यो सुविधा प्रदान गर्दैन"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कमाथि पहुँच राख्न सकिँदैन"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"रिसेप्सनमा सुधार गर्न सेटिङहरू &gt; नेटवर्क तथा इन्टरनेट &gt; मोबाइल नेटवर्कहरू &gt; रुचाइएको नेटवर्कको प्रकारमा गई चयन गरिएको प्रकार परिवर्तन गरी हेर्नुहोस्।"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi कलिङ सक्रिय छ"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"आपतकालीन कलहरू गर्न मोबाइल नेटवर्क अनिवार्य छ।"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"कुनै पनि भ्वाइस वा आपातकालीन कल सेवा उपलब्ध छैन"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"तपाईंको सेवा प्रदायकले अस्थायी रूपमा निष्क्रिय पार्नुभएको"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"मोबाइल नेटवर्कमाथि पहुँच राख्न सकिएन"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"रुचाइएको नेटवर्क परिवर्तन गरी हेर्नुहोस्‌। परिवर्तन गर्न ट्याप गर्नुहोस्‌।"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"आपतकालीन कल सेवा अनुपलब्ध छ"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi‑Fi मार्फत आपतकालीन कल गर्न सकिँदैन"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्टहरू"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कल फर्वार्ड गर्ने सेवा"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपतकालीन कलब्याक मोड"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"रोमिङ ध्वजा चालु छ"</string>
<string name="roamingText12" msgid="1189071119992726320">"रोमिङ ब्यानर बन्द छ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"सेवाको खोजी गर्दै…"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi कलिङ"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi मार्फत कलहरू गर्न र सन्देशहरू पठाउन सबभन्दा पहिला आफ्नो सेवा प्रदायकलाई यो सेवा सेट गर्न भन्नुहोस्। त्यसपछि सेटिङहरूबाट Wi-Fi कलिङलाई सक्रिय पार्नुहोस्। (त्रुटिसम्बन्धी कोड: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"आफ्नो सेवा प्रदायकमा दर्ता गर्नुहोस् (त्रुटिसम्बन्धी कोड: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi कलिङ"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"धेरै नै अनुरोधहरू प्रक्रियामा छन्। पछि फेरि प्रयास गर्नुहोस्।"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>को लागि साइन इन त्रुटि"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"सिङक गर्नुहोस्"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"सिंक गर्नुहोस्"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"अति धेरै <xliff:g id="CONTENT_TYPE">%s</xliff:g> मेट्नुहोस्।"</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ट्याब्लेट भण्डारण खाली छैन! ठाउँ खाली गर्नको लागि केही फाइलहरू मेटाउनुहोस्।"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"भण्डारण भरिएको छ हेर्नुहोस्। ठाउँ खाली गर्न केही फाइलहरू मेटाउनुहोस्।"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"TV भण्डारण पूर्ण छ। ठाउँ खाली गर्नको लागि केही फाइलहरू मेट्नुहोस्।"</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"तपाईंको कार्य प्रोफाइलका प्रशासकद्वारा"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> द्वारा"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"कार्य प्रोफाइल मेटियो"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"प्रशासकीय अनुप्रयोग नभएकाले कार्य प्रोफाइल मेटाइयो"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"उक्त कार्य प्रोफाइलको प्रशासकीय अनुप्रयोग छैन वा बिग्रेको छ। त्यसले गर्दा, तपाईंको कार्य प्रोफाइल र सम्बन्धित डेटालाई मेटिएको छ। सहायताका लागि आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्।"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"तपाईंको कार्य प्रोफाइल अब उप्रान्त यस यन्त्रमा उपलब्ध छैन"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"पासवर्ड प्रविष्ट गर्ने अत्यधिक गलत प्रयासहरू भए"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"यन्त्र व्यवस्थित गरिएको छ"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"तपाईंको संगठनले यस यन्त्रको व्यवस्थापन गर्दछ र नेटवर्क ट्राफिकको अनुगमन गर्न सक्छ। विवरणहरूका लागि ट्याप गर्नुहोस्।"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"तपाईंको यन्त्र मेटिनेछ"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"प्रशासकको अनुप्रयोग प्रयोग गर्न मिल्दैन। तपाईंको यन्त्रको डेटा अब मेटाइने छ। \n\nतपाईंका कुनै प्रश्न भएमा, आफ्नो संगठनका प्रशासकलाई सम्पर्क गर्नुहोस्।"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"प्रशासकको अनुप्रयोग प्रयोग गर्न मिल्दैन। तपाईंको यन्त्रको डेटा अब मेटाइने छ।\n\nतपाईंसँग प्रश्नहरू भएका खण्डमा आफ्नो संगठनका प्रशासकसँग सम्पर्क गर्नुहोस्।"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> ले छाप्ने कार्यलाई असक्षम पार्यो।"</string>
<string name="me" msgid="6545696007631404292">"मलाई"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ट्याब्लेट विकल्पहरू"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"हवाइजहाज मोड"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाइजहाज मोड खुला छ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाइजहाज मोड बन्द छ"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ब्याट्री सेभर"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ब्याट्री सेभर निष्क्रिय छ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ब्याट्री सेभर सक्रिय छ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"सेटिङहरू"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहायता दिनुहोस्"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज सहायता"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"कार्य प्रोफाइलमा बदल्नुहोस्"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"सम्पर्कहरू"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"तपाईँको सम्पर्कमाथि पहुँच गर्नुहोस्"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई आफ्ना सम्पर्क ठेगानाहरूमाथि पहुँच राख्न दिनुहोस्"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"यस यन्त्रको स्थानमाथि पहुँच"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई यो यन्त्रको स्थानमाथि पहुँच राख्न दिनुहोस्"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"पात्रो"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"तपाईंको पात्रोमाथि पहुँच गर्नुहोस्"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई आफ्नो पात्रोमाथि पहुँच राख्न दिनुहोस्"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS सन्देशहरू पठाउनुहोस् र हेर्नुहोस्"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई SMS सन्देशहरू पठाउन र हेर्न दिनुहोस्"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"भण्डारण"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"तपाईंको यन्त्रमा तस्बिर, मिडिया, र फाइलहरूमाथि पहुँच गर्नुहोस्"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई आफ्नो यन्त्रमा रहेका तस्बिर, मिडिया र फाइलहरूमाथि पहुँच राख्न दिनुहोस्"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"माइक्रोफोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"अडियो रेकर्ड गर्नुहोस्"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई अडियो रेकर्ड गर्न दिनुहोस्"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"क्यामेरा"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"तस्बिर खिच्नुका साथै भिडियो रेकर्ड गर्नुहोस्"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई तस्बिरहरू खिच्न र भिडियो रेकर्ड गर्न दिनुहोस्"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई फोन कलहरू गर्न र तिनीहरूको व्यवस्थापन गर्न दिनुहोस्"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"शारीरिक सेन्सर"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"तपाईंको महत्त्वपूर्ण संकेत बारे सेन्सर डेटा पहुँच गर्नुहोस्"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई आफ्ना महत्त्वपूर्ण लक्षणहरूसम्बन्धी सेन्सर डेटामाथि पहुँच राख्न दिनुहोस्"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोएर गरिने खोजलाई सुचारु गर्नुहोस्"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"इसाराहरू सम्बन्धी कार्य गर्नुहोस्"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"ट्याप, स्वाइप गर्न, थिच्न र अन्य इसाराहरू सम्बन्धी कार्य गर्न सक्छ"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"फिंगरप्रिन्टका इसाराहरू"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"यन्त्रहरूक‍ो फिंगरप्रिन्ट सेन्सरमा गरिएका इसाराहरू कैद गर्न सक्छ।"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"यसले यन्त्रक‍ो फिङ्गरप्रिन्टसम्बन्धी सेन्सरमा गरिएका इसाराहरूलाई खिच्‍न सक्छ।"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"स्थिति पट्टिलाई अक्षम वा संशोधित गर्नुहोस्"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"स्थिति पट्टि असक्षम पार्न वा प्रणाली आइकनहरू थप्न र हटाउन अनुप्रयोगलाई अनुमति दिन्छ।"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"वस्तुस्थिति पट्टी हुन दिनुहोस्"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"यसको आफ्नै मेमोरीमा दृढ भएकोको अंश बनाउनको लागि अनुप्रयोगलाई अनुमति दिन्छ। ट्याब्लेटलाई ढिलो गराउँदै गरेका अन्य अनुप्रयोगहरूलाई सीमित मात्रामा यसले मेमोरी उपलब्ध गराउन सक्छ।"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"अनुप्रयोगलाई अनुमति दिन्छ मेमोरीमा आफैंलाई स्थायी भागका रूपमा प्रस्तुत गर्न। यसले अन्य अनुप्रयोगलाई उपलब्ध मेमोरीलाई सीमित गरी TV लाई ढिलो बनाउन सक्छ।"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"अनुप्रयोगलाई मेमोरीमा आफैंको निरन्तरको अंश बनाउन अनुमति दिन्छ। यसले फोनलाई ढिला बनाएर अन्य अनुप्रयोगहरूमा मेमोरी SIMित गर्न सक्दछन्।"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"अग्रभूमिको सेवा सञ्चालन गर्नुहोस्"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"अनुप्रयोगलाई अग्रभूमिका सेवाहरू प्रयोग गर्ने अनुमति दिन्छ।"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"अनुप्रयोग भण्डारण ठाउँको मापन गर्नुहोस्"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"अनुप्रयोगलाई यसको कोड, डेटा, र क्यास आकारहरू पुनःप्राप्त गर्न अनुमति दिन्छ।"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"प्रणाली सेटिङहरू परिमार्जन गर्नुहोस्"</string>
@@ -395,11 +409,11 @@
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"अधिक स्थान प्रदायक आदेशहरू पहुँच गर्नुहोस्"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"अनुप्रयोगलाई अतिरिक्त स्थान प्रदायक आदेशहरू पहुँच गर्न अनुमति दिन्छ। यो अनुप्रयोगलाई GPS वा अन्य स्थान स्रोतहरूको संचालन साथै हस्तक्षेप गर्न अनुमति दिन सक्छ।"</string>
<string name="permlab_accessFineLocation" msgid="251034415460950944">"सटीक स्थान पहुँच गराउनुहोस् (GPS तथा नेटवर्कमा आधारित)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता GPS वा नेटवर्कको स्थानका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको फोनमा उपलब्ध हुनुपर्छ। यसले ब्याट्रीको खपत बढाउन सक्छ।"</string>
+ <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता GPS वा नेटवर्कको स्थानका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको फोनमा उपलब्ध हुनु पर्छ। यसले ब्याट्रीको खपत बढाउन सक्छ।"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"अनुमानित स्थान पहुँच गराउनुहोस् (नेटवर्कमा आधारित)"</string>
- <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको ट्याब्लेटमा उपलब्ध हुनुपर्छ।"</string>
- <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको TV मा उपलब्ध हुनुपर्छ।"</string>
- <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको फोनमा उपलब्ध हुनुपर्छ।"</string>
+ <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको ट्याब्लेटमा उपलब्ध हुनु पर्छ।"</string>
+ <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको TV मा उपलब्ध हुनु पर्छ।"</string>
+ <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको फोनमा उपलब्ध हुनु पर्छ।"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"तपाईँका अडियो सेटिङहरू परिवर्तन गर्नुहोस्"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"अनुप्रयोगलाई ग्लोबल अडियो सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै आवाजको मात्रा र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"अडियो रेकर्ड गर्नुहोस्"</string>
@@ -588,7 +602,7 @@
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"उपकरण विश्वव्यापी प्रोक्सी मिलाउनुहोस्"</string>
<string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"नीति सक्षम हुँदा प्रयोग गरिनको लागि यन्त्र ग्लोवल प्रोक्सी सेट गर्नुहोस्। केवल यन्त्र मालिकले ग्लोवल प्रोक्सी सेट गर्न सक्नुहुन्छ।"</string>
<string name="policylab_expirePassword" msgid="5610055012328825874">"स्क्रिन लक पासवर्ड म्याद समाप्ति सेट गर्नुहोस्"</string>
- <string name="policydesc_expirePassword" msgid="5367525762204416046">"स्क्रिन लक पासवर्ड, PIN, वा ढाँचा परिवर्तन कसरी बारम्बार परिवर्तन हुनुपर्छ परिवर्तन गर्नुहोस्।"</string>
+ <string name="policydesc_expirePassword" msgid="5367525762204416046">"स्क्रिन लक पासवर्ड, PIN, वा ढाँचा परिवर्तन कसरी बारम्बार परिवर्तन हुनु पर्छ परिवर्तन गर्नुहोस्।"</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"भण्डारण इन्क्रिप्सन मिलाउनुहोस्"</string>
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"भण्डार गरिएको डेटा इन्क्रिप्ट हुनु आवश्यक छ।"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"क्यामेरालाई असक्षम गराउनुहोस्"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ढाँचा अनलक।"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलक"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin अनलक"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Sim को Pin मार्फत अनलक गर्ने प्रक्रिया।"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Sim को Puk मार्फत अनलक गर्ने प्रक्रिया।"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवर्ड अनलक।"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ढाँचा क्षेत्र।"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"स्लाइड क्षेत्र।"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"क्लिपबोर्डमा प्रतिलिप गरिएको पाठ।"</string>
<string name="more_item_label" msgid="4650918923083320495">"बढी"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"मेनु+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"ठाउँ"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"प्रविष्टि गर्नुहोस्"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"मेटाउनुहोस्"</string>
@@ -1080,31 +1102,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"अद्यावधिकका लागि जाँच गर्नुहोस्"</string>
<string name="smv_application" msgid="3307209192155442829">"अनुप्रयोग <xliff:g id="APPLICATION">%1$s</xliff:g> (प्रक्रिया <xliff:g id="PROCESS">%2$s</xliff:g>) ले यसको स्वयं-लागु गरिएको स्ट्रिटमोड नीति उलङ्घन गरेको छ।"</string>
<string name="smv_process" msgid="5120397012047462446">"प्रक्रिया <xliff:g id="PROCESS">%1$s</xliff:g> यसको आफ्नै कडामोड नीतिका कारण उल्लङ्घन गरिएको छ।"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"एन्ड्रोइड अपग्रेड हुँदैछ…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android शुरू हुँदैछ..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"फोनको अद्यावधिक गरिँदै छ…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ट्याब्लेटको अद्यावधिक गरिँदै छ…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"यन्त्रको अद्यावधिक गरिँदै छ…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"फोन सुरु हुँदै छ…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ट्याब्लेट सुरु हुँदै छ…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"यन्त्र सुरु हुँदै छ…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"भण्डारण आफू अनुकूल गर्दै।"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android को अद्यावधिकलाई सम्पन्न गर्दै…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"स्तरवृद्धि सम्पन्न नभएसम्म केही अनुप्रयोगहरू राम्ररी काम नगर्न सक्छन्"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"प्रणालीको अद्यावधिक सम्पन्न गरिँदै छ…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> को स्तरवृद्धि हुँदैछ…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"अनुप्रयोग अनुकुल हुँदै <xliff:g id="NUMBER_0">%1$d</xliff:g> को <xliff:g id="NUMBER_1">%2$d</xliff:g>।"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> तयारी गर्दै।"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"सुरुवात अनुप्रयोगहरू।"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"बुट पुरा हुँदै।"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चलिरहेको छ"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"खेलमा फर्कन ट्याप गर्नुहोस्"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"खेल छनौट गर्नुहोस्‌"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"अझ राम्रो कार्यप्रदर्शनका लागि, कुनै एक समयमा यी खेलहरूमध्ये कुनै एउटा मात्र खुल्ला रहन सक्छ।"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> मा फर्कनुहोस्"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> खोल्नुहोस्"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> सुरक्षित नगरिकनै बन्द हुने छ"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ले मेमोरी सीमा नाघ्यो"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"हिप डम्पलाई संग्रह गरिएको छ, साझेदारी गर्न छुनुहोस्"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"हिप डम्प साझेदारी गर्नुहुन्छ?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"प्रक्रिया <xliff:g id="PROC">%1$s</xliff:g>ले यसको प्रक्रिया मेमोरी सीमा <xliff:g id="SIZE">%2$s</xliff:g> नाघेको छ। तपाईँको लागि विकासकर्तासँग साझेदारी गर्न एउटा हिप डम्प उपलब्ध छ। होसियार हुनुहोस्: यो हिप डम्पमा अनुप्रयोगको पहुँच भएको तपाईँको कुनै पनि व्यक्तिगत जानकारी हुन सक्छ।"</string>
<string name="sendText" msgid="5209874571959469142">"पाठको लागि एउटा प्रकार्य छान्नुहोस्"</string>
@@ -1139,12 +1159,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"खुला Wi‑Fi नेटवर्कमा जडान गर्नुहोस्"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"सेवा प्रदायकको Wi‑Fi नेटवर्कमा जडान गर्नुहोस्"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"खुला Wi‑Fi नेटवर्कमा जडान गर्दै"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi नेटवर्कमा जडान गरियो"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi नेटवर्कमा जडान गर्न सकिएन"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सबै नेटवर्कहरू हेर्न ट्याप गर्नुहोस्"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"जडान गर्नुहोस्"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"सबै नेटवर्कहरू"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सबै नेटवर्कहरू"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi स्वतः सक्रिय हुनेछ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"तपाईं कुनै सुरक्षित गरिएको उच्च गुणस्तरीय नेटवर्कको नजिक हुनुभएको अवस्थामा"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"फेरि सक्रिय नगर्नुहोला"</string>
@@ -1210,6 +1231,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"पुनः सुरु गर्नुहोस्"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"मोबाइल सेवा सक्रिय गर्नुहोस्"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"आफ्नो नयाँ SIM सक्रिय गर्न सेवा प्रदायकको अनुप्रयोग डाउनलोड गर्नुहोस्"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"आफ्नो नयाँ SIM सक्रिय गर्न <xliff:g id="APP_NAME">%1$s</xliff:g> अनुप्रयोग डाउनलोड गर्नुहोस्"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"अनुप्रयोग डाउनलोड गर्नुहोस्"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"नयाँ SIM घुसाइयो"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"यसलाई सेटअप गर्न ट्याप गर्नुहोस्"</string>
@@ -1228,13 +1250,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB मार्फत PTP सेवा सक्रिय गरियो"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB टेदरिङ सेवा सक्रिय गरियो"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB मार्फत MIDI सेवा सक्रिय गरियो"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB सहायक उपकरण मोड सक्रिय गरियो"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB सहायक उपकरण जडान गरियो"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"थप विकल्पहरूका लागि ट्याप गर्नुहोस्।"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"जडान गरिएको यन्त्र चार्ज गर्दै। थप विकल्पहरूका लागि ट्याप गर्नुहोस्।"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"एनालग अडियोको सहायक उपकरण पत्ता लाग्यो"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"संलग्न गरिएको यन्त्र यो फोनसँग कम्प्याटिबल छैन। थप जान्न ट्याप गर्नुहोस्।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गर्ने सुविधा सुचारू छ"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB डिबग गर्ने सुविधालाई असक्षम गर्न ट्याप गर्नुहोस्।"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB डिबग प्रक्रिया निष्क्रिय पार्न ट्याप गर्नुहोस्‌"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB डिबगिङलाई असक्षम पार्न ट्याप गर्नुहोस्।"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"बग रिपोर्ट लिँदै..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"बग रिपोर्टलाई साझेदारी गर्ने हो?"</string>
@@ -1253,7 +1275,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> अन्य अनुप्रयोगहरूमा देखिँदैछ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य अनुप्रयोगहरूमा देखिँदैछ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले यो विशेषता प्रयोग नगरेको चाहनुहुन्न भने सेटिङहरू खोली यसलाई निष्क्रिय पार्न ट्याप गर्नुहोस्।"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"निष्क्रिय पार्नुहोस्"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"निष्क्रिय पार्नुहोस्"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"तयारी गर्दै <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटिहरूको लागि जाँच गर्दै"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"नयाँ <xliff:g id="NAME">%s</xliff:g> भेटियो"</string>
@@ -1339,14 +1361,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN जडान सधै जोड्दै…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"सधैँ खुल्ला हुने VPN जोडिएको"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"सधैँ-सक्रिय रहने VPN सेवाबाट विच्छेद गरियो"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"सधैँ भरि VPN त्रुटिमा"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"नेटवर्क वा VPN सम्बन्धी सेटिङहरू परिवर्तन गर्नुहोस्"</string>
<string name="upload_file" msgid="2897957172366730416">"फाइल छान्नुहोस्"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"कुनै फाइल छानिएको छैन"</string>
<string name="reset" msgid="2448168080964209908">"रिसेट गर्नुहोस्"</string>
<string name="submit" msgid="1602335572089911941">"पेस गर्नुहोस्"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"कार मोड सक्षम पारियो।"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"कार मोडबाट बाहिर निस्कन ट्याप गर्नुहोस्।"</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"टेथर गर्ने वा हटस्पट सक्रिय"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"सेटअप गर्न ट्याप गर्नुहोस्।"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"टेदरिङलाई असक्षम पारिएको छ"</string>
@@ -1424,22 +1449,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ड्राइभ"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB भण्डारण"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"सम्पादन गर्नुहोस्"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"डेटा प्रयोग बारे सतर्कता"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"प्रयोग र सेटिङहरू हेर्न ट्याप गर्नुहोस्।"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G डेटा सीमा पुग्यो"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G डेटा सीमा पुग्यो"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"डेटासम्बन्धी चेतावनी"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"तपाईंले <xliff:g id="APP">%s</xliff:g> डेटा प्रयोग गर्नुभयो"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"मोबाइल डेटाको अधिकतम सीमा पुगेको छ"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi डेटा सीमा पुग्यो"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"तथ्याङ्क बाँकी चक्रको लागि रोकिएको छ"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G डेटा सीमा भन्दा पार भएको छ"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G डेटा SIMा नाघ्यो"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"मोवाइल डेटा SIMा नाघ्यो"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi डेटा SIMा नाघ्यो"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> उल्लेखित सीमा भन्दा बढी छ।"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"तपाईंको चक्रको बाँकी अवधिसम्मका लागि डेटा पज गरियो"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"तपाईंको मोबाइल डेटाको सीमा नाघ्यो"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"तपाईंको Wi-Fi डेटाको सीमा नाघ्यो"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"तपाईंले आफूले सेट गरेको सीमाभन्दा <xliff:g id="SIZE">%s</xliff:g> बढी डेटा प्रयोग गरिसक्नुभएको छ"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"पृष्ठभूमिका डेटा प्रतिबन्धित गरिएको छ"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"सीमिततालाई हटाउन ट्याप गर्नुहोस्।"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"धेरै मात्रामा डेटाको प्रयोग"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"तपाईं पछिल्ला केही दिनहरूमा सामान्यभन्दा धेरै डेटा प्रयोग गर्दै हुनुहुन्छ। प्रयोग तथा सेटिङहरू हेर्न ट्याप गर्नुहोस्।"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"मोबाइल डेटाको उच्च प्रयोग"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"तपाईंका अनुप्रयोगहरूले सामान्यभन्दा बढी डेटा प्रयोग गरेका छन्"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ले सामान्यभन्दा बढी डेटा प्रयोग गरेको छ"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"सुरक्षा प्रमाणपत्र"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"प्रमाणपत्र मान्य छ।"</string>
<string name="issued_to" msgid="454239480274921032">"द्वारा जारी गरिएको:"</string>
@@ -1636,7 +1658,7 @@
<string name="mediasize_unknown_portrait" msgid="3088043641616409762">"अज्ञात चित्र"</string>
<string name="mediasize_unknown_landscape" msgid="4876995327029361552">"अज्ञात परिदृश्य"</string>
<string name="write_fail_reason_cancelled" msgid="7091258378121627624">"रद्द गरियो"</string>
- <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामाग्री लेखनमा त्रुटि"</string>
+ <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामग्री लेखनमा त्रुटि"</string>
<string name="reason_unknown" msgid="6048913880184628119">"अज्ञात"</string>
<string name="reason_service_unavailable" msgid="7824008732243903268">"प्रिन्ट सेवा सक्षम गरिएको छैन"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g> सेवा स्थापित भयो"</string>
@@ -1675,7 +1697,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"तपाईंका प्रशासकले स्थापना गर्नुभएको"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"तपाईंका प्रशासकले अद्यावधिक गर्नुभएको"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"तपाईंका प्रशासकले मेट्नुभएको"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"ब्याट्रीको आयु सुधार्ने कार्यमा मद्दत गर्न ब्याट्री सेभरले तपाईंको यन्त्रको कार्यसम्पादन घटाउँछ र कम्पन, स्थानसम्बन्धी सेवा तथा पृष्ठभूमिको प्रायः जसो डेटा सीमित गर्दछ। तपाईंले सिंकमा भरपर्ने इमेल, सन्देश र अन्य अनुप्रयोगहरू नखोलेसम्म ती अद्यावधिक नहुन पनि सक्छन्\n\n तपाईंको यन्त्र चार्ज भइरहेको अवस्थामा ब्याट्री सेभर स्वत: निष्क्रिय हुन्छ।"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"डेटाको प्रयोगलाई कम गर्नमा मद्दतका लागि डेटा सर्भरले केही अनुप्रयोगहरूलाई पृष्ठभूमिमा डेटा पठाउन वा प्राप्त गर्नबाट रोक्दछ। तपाईँले हाल प्रयोग गरिरहनुभएको अनु्प्रयोगले डेटामाथि पहुँच राख्न सक्छ, तर त्यसले यो काम थोरै पटक गर्न सक्छ। उदाहरणका लागि यसको मतलब यो हुन सक्छ: तपाईँले छविहरूलाई ट्याप नगरेसम्म ती प्रदर्शन हुँदैनन्।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा सेभरलाई सक्रिय गर्ने हो?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"सक्रिय गर्नुहोस्"</string>
@@ -1687,9 +1710,9 @@
<item quantity="other">%1$d मिनेटका लागि (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> सम्म)</item>
<item quantity="one">१ मिनेटको लागि (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> सम्म)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other"> %1$d घण्टाको लागि (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> सम्म)</item>
- <item quantity="one">एक घण्टाको लागि (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> सम्म)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other"> %1$d घन्टाका लागि (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> सम्म)</item>
+ <item quantity="one">१ घन्टाका लागि (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> सम्म)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d घन्टाको लागि (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> सम्म)</item>
@@ -1703,9 +1726,9 @@
<item quantity="other">%d मिनेटका लागि</item>
<item quantity="one">१ मिनेटको लागि</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">%d घण्टाको लागि</item>
- <item quantity="one">एक घण्टाको लागि</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d घन्टाका लागि</item>
+ <item quantity="one">१ घन्टाका लागि</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d घन्टाका लागि</item>
@@ -1726,14 +1749,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारा मौन गरिएको"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ, र तपाईंले फ्याक्ट्री डाटा रिसेट नगर्दासम्म यो अस्थिर रहन्छ।"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ। विवरणहरूको लागि आफ्नो निर्मातासँग सम्पर्क गर्नुहोस्।"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD अनुरोध DIAL अनुरोधमा परिमार्जन गरिएको छ।"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD अनुरोध SS अनुरोधमा परिमार्जन गरिएको छ।"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD अनुरोध नयाँ USSD अनुरोधमा परिमार्जन गरिएको छ।"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD अनुरोधलाई भिडियो DIAL अनुरोधमा परिमार्जन गरियो।"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS अनुरोध DIAL अनुरोधमा परिमार्जन गरिएको छ।"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS अनुरोधलाई भिडियो  DIAL अनुरोधमा परिमार्जन गरियो।"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS अनुरोध USSD अनुरोधमा परिमार्जन गरिएको छ।"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS अनुरोध नयाँ SS अनुरोधमा परिमार्जन गरिएको छ।"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफाइल"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तृत गर्नुहोस्"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"संक्षिप्त गर्नुहोस्"</string>
@@ -1843,7 +1874,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"हानिकारक अनुप्रयोग भेटियो"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ले <xliff:g id="APP_2">%2$s</xliff:g> का स्लाइसहरू देखाउन चाहन्छ"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"सम्पादन गर्नुहोस्"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"कल तथा सूचनाहरू आउँदा कम्पन हुने छ"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"कल तथा सूचनाहरूलाई म्युट गरिने छ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"प्रणालीसम्बन्धी परिवर्तनहरू"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"बाधा नपुऱ्याउनुहोस्"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"तपाईंलाई ध्यान केन्द्रित गर्नमा मद्दत गर्नका लागि बाधा नपुर्‍याउनुहोस् मोडले सूचनाहरू लुकाइरहेको छ"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"यो नयाँ व्यवहार हो। परिवर्तन गर्न ट्याप गर्नुहोस्।"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"बाधा नपुर्‍याउनुहोस् मोड परिवर्तन भएको छ"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"अवरोधहरूका सम्बन्धमा गरिने व्यवहारसम्बन्धी सेटिङहरू जाँच गर्न ट्याप गर्नुहोस्"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"रोक लगाइएका कुराहरू जाँच गर्न ट्याप गर्नुहोस्‌।"</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index c0965e538d3a..11d0ee9d7872 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Beller-ID standaard ingesteld op \'onbeperkt\'. Volgende oproep: onbeperkt."</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Service niet voorzien."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"U kunt de instelling voor de beller-ID niet wijzigen."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Geen gegevensservice"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Geen noodoproepen"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Geen service voor mobiele data"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Noodoproepen niet beschikbaar"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Geen service voor spraakoproepen"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Geen service voor spraak-/noodoproepen"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Tijdelijk niet aangeboden door het mobiele netwerk op je locatie"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk niet bereiken"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Als je de ontvangst wilt verbeteren, kun je het netwerktype wijzigen dat is geselecteerd bij Instellingen &gt; Netwerk en internet &gt; Mobiele netwerken &gt; Voorkeursnetwerktype."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Bellen via wifi is actief"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Voor noodoproepen is een mobiel netwerk vereist."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Geen spraakservice of noodoproepen"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Tijdelijk uitgeschakeld door je provider"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Kan mobiel netwerk niet bereiken"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Probeer een ander voorkeursnetwerk. Tik om te wijzigen."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Noodoproepen niet beschikbaar"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Er kunnen geen noodoproepen worden gemaakt via wifi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Meldingen"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproep doorschakelen"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modus voor noodoproepen"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Roamingbanner aan"</string>
<string name="roamingText12" msgid="1189071119992726320">"Roamingbanner uit"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Service zoeken"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Bellen via wifi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Als je wilt bellen en berichten wilt verzenden via wifi, moet je eerst je provider vragen deze service in te stellen. Schakel bellen via wifi vervolgens opnieuw in via Instellingen. (Foutcode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registreer bij je provider (foutcode: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Bellen via wifi van %s"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Er worden te veel aanvragen verwerkt. Probeer het later opnieuw."</string>
<string name="notification_title" msgid="8967710025036163822">"Fout bij aanmelding voor \'<xliff:g id="ACCOUNT">%1$s</xliff:g>\'"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchroniseren"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchroniseren"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Te veel verwijderen voor <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Tabletgeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Horlogegeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Tv-opslag is vol. Verwijder een aantal bestanden om ruimte vrij te maken."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Door de beheerder van je werkprofiel"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Door <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Werkprofiel verwijderd"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Werkprofiel verwijderd vanwege ontbrekende beheer-app"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"De beheer-app van het werkprofiel ontbreekt of is beschadigd. Als gevolg hiervan zijn je werkprofiel en alle gerelateerde gegevens verwijderd. Neem contact op met je beheerder voor hulp."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Je werkprofiel is niet meer beschikbaar op dit apparaat"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Te veel wachtwoordpogingen"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Apparaat wordt beheerd"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Dit apparaat wordt beheerd door je organisatie. Het netwerkverkeer kan worden bijgehouden. Tik voor meer informatie."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Je apparaat wordt gewist"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"De beheer-app kan niet worden gebruikt. Je apparaat wordt nu gewist.\n\nNeem contact op met de beheerder van je organisatie als je vragen hebt."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"De beheer-app kan niet worden gebruikt. Je apparaat wordt nu gewist.\n\nNeem contact op met de beheerder van je organisatie als je vragen hebt."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Afdrukken uitgeschakeld door <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Ik"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tabletopties"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Vliegtuigmodus"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Vliegtuigmodus is AAN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Vliegtuigmodus is UIT"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterijbesparing"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterijbesparing is UIT"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterijbesparing is AAN"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Instellingen"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Helpen"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Spraakassistent"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Schakelen naar werkprofiel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacten"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"toegang krijgen tot je contacten"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Geef &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot je contacten"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Locatie"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"de locatie van dit apparaat openen"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Toestaan dat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; het volgende doet: toegang krijgen tot de locatie van dit apparaat?"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"toegang krijgen tot je agenda"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Geef &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot je agenda"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"Sms"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"sms\'jes verzenden en bekijken"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Sta &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om sms\'jes te verzenden en te bekijken"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Opslagruimte"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"toegang krijgen tot foto\'s, media en bestanden op je apparaat"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Geef &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot foto\'s, media en bestanden op je apparaat"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfoon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"audio opnemen"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Sta &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om audio op te nemen"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"foto\'s maken en video opnemen"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Sta &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om foto\'s te maken en video op te nemen"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefoon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefoneren en oproepen beheren"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Sta &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om telefoongesprekken te starten en te beheren"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Lichaamssensoren"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"toegang krijgen tot sensorgegevens over je vitale functies"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Geef &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot sensorgegevens over je vitale functies"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Content van vensters ophalen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"De content inspecteren van een venster waarmee je interactie hebt."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\'Verkennen via aanraking\' inschakelen"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Gebaren uitvoeren"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Kan tikken, vegen, samenknijpen en andere gebaren uitvoeren."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Vingerafdrukgebaren"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Kan gebaren registreren die op de vingerafdruksensor van het apparaat worden getekend."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Kan gebaren registreren die op de vingerafdruksensor van het apparaat worden getekend."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"statusbalk uitschakelen of wijzigen"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Hiermee kan de app de statusbalk uitschakelen of systeempictogrammen toevoegen en verwijderen."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"de statusbalk zijn"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Hiermee kan de app gedeelten van zichzelf persistent maken in het geheugen. Dit kan de hoeveelheid geheugen beperken die beschikbaar is voor andere apps, waardoor de tablet trager kan worden."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Hiermee kan de app gedeelten van zichzelf persistent maken in het geheugen. Dit kan de hoeveelheid geheugen beperken die beschikbaar is voor andere apps, waardoor de tv trager kan worden."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Hiermee kan de app gedeelten van zichzelf persistent maken in het geheugen. Dit kan de hoeveelheid geheugen beperken die beschikbaar is voor andere apps, waardoor de telefoon trager kan worden."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"service op de voorgrond uitvoeren"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Hiermee kan de app gebruikmaken van services op de voorgrond."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"opslagruimte van app meten"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Hiermee kan de app de bijbehorende code, gegevens en cachegrootten ophalen."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"systeeminstellingen aanpassen"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ontgrendeling via patroon."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ontgrendelen via gezichtsherkenning"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ontgrendeling via pincode."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Pincode-ontgrendeling voor simkaart."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Pukcode-ontgrendeling voor simkaart."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ontgrendeling via wachtwoord."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Tekengebied voor patroon."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Schuifgebied."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Tekst naar klembord gekopieerd."</string>
<string name="more_item_label" msgid="4650918923083320495">"Meer"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Functie +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"ruimte"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"invoeren"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"verwijderen"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Controleren op update"</string>
<string name="smv_application" msgid="3307209192155442829">"De app <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) heeft het zelf afgedwongen StrictMode-beleid geschonden."</string>
<string name="smv_process" msgid="5120397012047462446">"Het proces <xliff:g id="PROCESS">%1$s</xliff:g> heeft het zelf afgedwongen StrictMode-beleid geschonden."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android wordt bijgewerkt..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android wordt gestart…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefoon wordt geüpdatet…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet wordt geüpdatet…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Apparaat wordt geüpdatet…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefoon wordt gestart…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet wordt gestart…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Apparaat wordt gestart…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Opslagruimte wordt geoptimaliseerd."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-update voltooien…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Sommige apps werken mogelijk pas correct nadat de upgrade is voltooid"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Systeemupdate voltooien…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> upgraden…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="NUMBER_1">%2$d</xliff:g> optimaliseren."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> voorbereiden."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Apps starten."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Opstarten afronden."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> wordt uitgevoerd"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Tik om terug te keren naar de game"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Game kiezen"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Met het oog op de prestaties kun je slechts een van deze games tegelijkertijd openen."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Ga terug naar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> openen"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> wordt gesloten zonder op te slaan"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> heeft geheugenlimiet overschreden"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump is verzameld. Tik om te delen."</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Heap dump delen?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Het proces <xliff:g id="PROC">%1$s</xliff:g> heeft de procesgeheugenlimiet overschreden met <xliff:g id="SIZE">%2$s</xliff:g>. Een heap dump is voor u beschikbaar om te delen met de betreffende ontwikkelaar. Let op: Deze heap dump kan persoonlijke gegevens bevatten waartoe de app toegang heeft."</string>
<string name="sendText" msgid="5209874571959469142">"Een actie voor tekst selecteren"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Verbinding maken met een open wifi-netwerk"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Verbinden met wifi-netwerk van provider"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Verbinding maken met een open wifi-netwerk…"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Verbonden met een wifi-netwerk"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kan geen verbinding maken met het wifi-netwerk"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerken te bekijken"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Verbinding maken"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alle netwerken"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netwerken"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wifi wordt automatisch ingeschakeld"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Wanneer je in de buurt van een opgeslagen netwerk van hoge kwaliteit bent"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Niet weer inschakelen"</string>
@@ -1204,6 +1225,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Opnieuw starten"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobiele service activeren"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download de provider-app om je nieuwe simkaart te activeren"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Download de <xliff:g id="APP_NAME">%1$s</xliff:g>-app om je nieuwe simkaart te activeren"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"App downloaden"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nieuwe simkaart geplaatst"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tik om dit in te stellen"</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB ingeschakeld"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB-tethering ingeschakeld"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB ingeschakeld"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-accessoiremodus ingeschakeld"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB-accessoire verbonden"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tik voor meer opties."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Verbonden apparaat wordt opgeladen. Tik voor meer opties."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoog audioaccessoire gedetecteerd"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Het aangesloten apparaat werkt niet met deze telefoon. Tik voor meer informatie."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-foutopsporing verbonden"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Tik om USB-foutopsporing uit te schakelen."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Tik om USB-foutopsporing uit te schakelen"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecteer deze optie om USB-foutopsporing uit te schakelen."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Bugrapport genereren…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Bugrapport delen?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over andere apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"UITSCHAKELEN"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Uitschakelen"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> voorbereiden"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Controleren op fouten"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nieuwe <xliff:g id="NAME">%s</xliff:g> gedetecteerd"</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN-verbinding maken…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN-verbinding"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Verbinding met Always-on VPN verbroken"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Fout met Always-on VPN"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Netwerk- of VPN-instellingen wijzigen"</string>
<string name="upload_file" msgid="2897957172366730416">"Bestand kiezen"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Geen bestand geselecteerd"</string>
<string name="reset" msgid="2448168080964209908">"Resetten"</string>
<string name="submit" msgid="1602335572089911941">"Verzenden"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Automodus ingeschakeld"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Tik om de automodus te sluiten."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering of hotspot actief"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Tik om in te stellen."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering is uitgeschakeld"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB-drive"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-opslag"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Bewerken"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Melding voor datagebruik"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Tik voor gebruik en instellingen"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Gegevenslimiet van 2G-3G bereikt"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Gegevenslimiet van 4G bereikt"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Datawaarschuwing"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Je hebt <xliff:g id="APP">%s</xliff:g> aan data gebruikt"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobiele datalimiet bereikt"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wifi-gegevenslimiet bereikt"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Gegev. onderbr. voor rest cyclus"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Gegevenslimiet 2G-3G overschreden"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Gegevenslimiet 4G overschreden"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobiele datalimiet overschreden"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wifi-datalimiet overschreden"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> meer dan limiet."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Data onderbroken voor de rest van de factureringscyclus"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Mobiele datalimiet overschreden"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wifi-datalimiet overschreden"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Je hebt <xliff:g id="SIZE">%s</xliff:g> meer verbruikt dan je ingestelde limiet"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Achtergrondgegevens beperkt"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Tik om beperking te verwijderen."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Hoog datagebruik"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Je datagebruik in de afgelopen dagen is hoger dan normaal. Tik om gebruik en instellingen weer te geven."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Intensief mobiel datagebruik"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Je apps hebben meer data verbruikt dan normaal"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> heeft meer data verbruikt dan normaal"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Beveiligingscertificaat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Dit certificaat is geldig."</string>
<string name="issued_to" msgid="454239480274921032">"Uitgegeven voor:"</string>
@@ -1669,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Geïnstalleerd door je beheerder"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Geüpdatet door je beheerder"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Verwijderd door je beheerder"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Batterijbesparing beperkt de prestaties van je apparaat, de trilstand, locatieservices en de meeste achtergrondgegevens om de gebruiksduur van de batterij te verlengen.\n\nBatterijbesparing wordt automatisch uitgeschakeld terwijl je apparaat wordt opgeladen."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens verzenden of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Databesparing inschakelen?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Inschakelen"</string>
@@ -1681,9 +1704,9 @@
<item quantity="other">Gedurende %1$d min (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Gedurende 1 min (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d uur (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Eén uur (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">Gedurende %1$d uur (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Gedurende 1 uur (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Gedurende %1$d u (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1720,9 @@
<item quantity="other">Gedurende %d min</item>
<item quantity="one">Gedurende 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">%d uur</item>
- <item quantity="one">Eén uur</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">Gedurende %d uur</item>
+ <item quantity="one">Gedurende 1 uur</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Gedurende %d u</item>
@@ -1720,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"Gedempt door <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Er is een intern probleem met je apparaat. Het apparaat kan instabiel zijn totdat u het apparaat terugzet naar de fabrieksinstellingen."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Er is een intern probleem met je apparaat. Neem contact op met de fabrikant voor meer informatie."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD-verzoek is gewijzigd in DIAL-verzoek."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD-verzoek is gewijzigd in SS-verzoek."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD-verzoek is gewijzigd in nieuw USSD-verzoek."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD-verzoek is gewijzigd in Video DIAL-verzoek."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS-verzoek is gewijzigd in DIAL-verzoek."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS-verzoek is gewijzigd in Video DIAL-verzoek."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-verzoek is gewijzigd in USSD-verzoek."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-verzoek is gewijzigd in nieuw SS-verzoek."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Werkprofiel"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Uitvouwen"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Samenvouwen"</string>
@@ -1837,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Schadelijke app gevonden"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wil segmenten van <xliff:g id="APP_2">%2$s</xliff:g> weergeven"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Bewerken"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Trillen bij oproepen en meldingen"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Oproepen en meldingen zijn gedempt"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Systeemwijzigingen"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Niet storen"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"\'Niet storen\' verbergt meldingen zodat je je kunt concentreren"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Dit is nieuw gedrag. Tik om te wijzigen."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'Niet storen\' is gewijzigd"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tik om je gedragsinstellingen voor onderbrekingen te controleren"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Tik om te controleren wat er is geblokkeerd."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 5672d480fbd7..2864a85d945a 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ਪ੍ਰਤਿਬੰਧਿਤ ਨਾ ਕਰਨ ਲਈ ਕਾਲਰ ਆਈ.ਡੀ. ਪੂਰਵ-ਨਿਰਧਾਰਤ। ਅਗਲੀ ਕਾਲ: ਪ੍ਰਤਿਬੰਧਿਤ ਨਹੀਂ"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"ਸੇਵਾ ਪ੍ਰਬੰਧਿਤ ਨਹੀਂ ਹੈ।"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"ਤੁਸੀਂ ਕਾਲਰ ਆਈ.ਡੀ. ਸੈਟਿੰਗ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ਕੋਈ ਡਾਟਾ ਸੇਵਾ ਨਹੀਂ"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"ਸੰਕਟਕਾਲ ਵਿੱਚ ਕੋਈ ਕਾਲ ਨਹੀਂ"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"ਕੋਈ ਮੋਬਾਈਲ ਡਾਟਾ ਸੇਵਾ ਨਹੀਂ"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਿੰਗ ਉਪਲਬਧ ਨਹੀਂ"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ਕੋਈ ਆਵਾਜ਼ੀ ਸੇਵਾ ਨਹੀਂ"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ਕੋਈ ਆਵਾਜ਼ੀ/ਸੰਕਟਕਾਲੀਨ ਸੇਵਾ ਨਹੀਂ"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"ਤੁਹਾਡੇ ਟਿਕਾਣੇ \'ਤੇ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਵੱਲੋਂ ਉਪਲਬਧ ਨਹੀਂ ਕਰਵਾਈ ਗਈ"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"ਸਿਗਨਲ ਪ੍ਰਾਪਤੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਸੈਟਿੰਗਾਂ &gt; ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ &gt; ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ &gt; ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ \'ਤੇ ਜਾਓ ਅਤੇ ਚੁਣੀ ਗਈ ਕਿਸਮ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ ਕਿਰਿਆਸ਼ੀਲ ਹੈ"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਾਂ ਲਈ ਕਿਸੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ਕੋਈ ਅਵਾਜ਼ੀ ਸੇਵਾ ਜਾਂ ਸੰਕਟਕਾਲੀਨ ਕਾਲਿੰਗ ਨਹੀਂ"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਬੰਦ ਹੈ"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਨੂੰ ਬਦਲ ਕੇ ਦੇਖੋ। ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਿੰਗ ਉਪਲਬਧ ਨਹੀਂ"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"ਵਾਈ-ਫਾਈ ਰਾਹੀਂ ਸੰਕਟਕਾਲੀਨ ਕਾਲਾਂ ਨਹੀਂ ਕਰ ਸਕਦੇ"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ਸੁਚੇਤਨਾਵਾਂ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ਕਾਲ ਫਾਰਵਰਡਿੰਗ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਬੈਕ ਮੋਡ"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"ਰੋਮਿੰਗ ਬੈਨਰ ਚਾਲੂ"</string>
<string name="roamingText12" msgid="1189071119992726320">"ਰੋਮਿੰਗ ਬੈਨਰ ਬੰਦ"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ਸੇਵਾ ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"ਵਾਈ-ਫਾਈ ਤੋਂ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਸੁਨੇਹੇ ਭੇਜਣ ਦੇ ਲਈ, ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਆਪਣੇ ਕੈਰੀਅਰ ਨੂੰ ਇਸ ਸੇਵਾ ਦੀ ਸਥਾਪਨਾ ਕਰਨ ਲਈ ਕਹੋ। ਫਿਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ ਨੂੰ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰੋ। (ਗੜਬੜੀ ਕੋਡ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"ਆਪਣੇ ਕੈਰੀਅਰ ਨਾਲ ਪੰਜੀਕਰਨ ਕਰੋ (ਗੜਬੜ ਕੋਡ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਬੇਨਤੀਆਂ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> ਲਈ ਸਾਈਨਇਨ ਅਸ਼ੁੱਧੀ"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ਸਿੰਕ ਕਰੋ"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ਸਿੰਕ ਕਰੋ"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"ਬਹੁਤ ਜ਼ਿਆਦਾ <xliff:g id="CONTENT_TYPE">%s</xliff:g> ਮਿਟਾਏ।"</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ਟੈਬਲੈੱਟ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ਘੜੀ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"ਟੀਵੀ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ਮੁਤਾਬਕ"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਮਿਟਾਈ ਗਈ"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"ਗੁੰਮਸ਼ੁਦਾ ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਦੇ ਕਾਰਨ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਮਿਟਾਇਆ ਗਿਆ"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਜਾਂ ਤਾਂ ਗੁੰਮਸ਼ੁਦਾ ਹੈ ਜਾਂ ਖਰਾਬ ਹੈ। ਨਤੀਜੇ ਵਜੋਂ, ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਸਬੰਧਿਤ ਡਾਟਾ ਮਿਟਾਇਆ ਗਿਆ ਹੈ। ਸਹਾਇਤਾ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਹੁਣ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"ਕਈ ਵਾਰ ਗਲਤ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਗਿਆ"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"ਡੀਵਾਈਸ ਪ੍ਰਬੰਧਨ ਅਧੀਨ ਹੈ"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"ਤੁਹਾਡਾ ਸੰਗਠਨ ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ ਅਤੇ ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਮਿਟਾਇਆ ਜਾਏਗਾ"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਵਰਤੀ ਨਹੀਂ ਜਾ ਸਕਦੀ। ਹੁਣ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾਇਆ ਜਾਵੇਗਾ।\n\nਜੇਕਰ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਸਵਾਲ ਹਨ, ਤਾਂ ਆਪਣੀ ਸੰਸਥਾ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਵਰਤੀ ਨਹੀਂ ਜਾ ਸਕਦੀ। ਹੁਣ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾਇਆ ਜਾਵੇਗਾ।\n\nਜੇਕਰ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਸਵਾਲ ਹਨ, ਤਾਂ ਆਪਣੀ ਸੰਸਥਾ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> ਵੱਲੋਂ ਪ੍ਰਿੰਟ ਕਰਨਾ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string>
<string name="me" msgid="6545696007631404292">"ਮੈਂ"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ਟੈਬਲੈੱਟ ਵਿਕਲਪ"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ਏਅਰਪਲੇਨ ਮੋਡ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ਏਅਰਪਲੇਨ ਮੋਡ ਚਾਲੂ ਹੈ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ਏਅਰਪਲੇਨ ਮੋਡ ਬੰਦ ਹੈ"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ਬੈਟਰੀ ਸੇਵਰ"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਹੈ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ਸੈਟਿੰਗਾਂ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ਸਹਾਇਤਾ ਕਰੋ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਰਤੋ"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ਸੰਪਰਕ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"ਟਿਕਾਣਾ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਧਾਰਤ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚੋ"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਇਸ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ਕੈਲੰਡਰ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਤੁਹਾਡੇ ਕੈਲੰਡਰ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦੇਖੋ"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ SMS ਸੁਨੇਹੇ ਭੇਜਣ ਅਤੇ ਦੇਖਣ ਦਿਓ"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"ਸਟੋਰੇਜ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨਾ"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ, ਅਤੇ ਫ਼ਾਈਲਾਂ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"ਮਾਈਕ੍ਰੋਫੋਨ"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">" ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦਿਓ"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"ਕੈਮਰਾ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ਤਸਵੀਰਾਂ ਲੈਣ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਤਸਵੀਰਾਂ ਖਿੱਚਣ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦਿਓ"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"ਫ਼ੋਨ ਕਰੋ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦਿਓ"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"ਸਰੀਰ ਸੰਵੇਦਕ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ਆਪਣੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਚਿੰਨ੍ਹਾਂ ਬਾਰੇ ਸੰਵੇਦਕ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਤੁਹਾਡੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਲੱਛਣਾਂ ਸਬੰਧੀ ਸੈਂਸਰ ਡਾਟਾ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ਵਿੰਡੋ ਸਮੱਗਰੀ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨਾ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ਇੱਕ ਵਿੰਡੋ ਦੀ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰੋ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਅੰਤਰਕਿਰਿਆ ਕਰ ਰਹੇ ਹੋ"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ਐਕਸਪਲੋਰ ਬਾਈ ਟੱਚ ਚਾਲੂ ਕਰਨਾ"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ਸੰਕੇਤ ਕਰਦੀ ਹੈ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"ਟੈਪ ਕਰ ਸਕਦੀ ਹੈ, ਸਵਾਈਪ ਕਰ ਸਕਦੀ ਹੈ, ਚੂੰਢੀ ਭਰ ਸਕਦੀ ਹੈ, ਅਤੇ ਹੋਰ ਸੰਕੇਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੰਕੇਤ"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"ਡੀਵਾਈਸਾਂ ਦੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ \'ਤੇ ਕੀਤੇ ਗਏ ਸੰਕੇਤਾਂ ਨੂੰ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"ਡੀਵਾਈਸਾਂ ਦੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ \'ਤੇ ਕੀਤੇ ਗਏ ਸੰਕੇਤਾਂ ਨੂੰ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ਸਥਿਤੀ ਪੱਟੀ ਬੰਦ ਕਰੋ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰੋ"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ਐਪ ਨੂੰ ਸਥਿਤੀ ਪੱਟੀ ਨੂੰ ਚਾਲੂ ਕਰਨ ਜਾਂ ਸਿਸਟਮ ਪ੍ਰਤੀਕਾਂ ਨੂੰ ਜੋੜਨ ਅਤੇ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ਸਥਿਤੀ ਪੱਟੀ ਬਣਨ ਦਿਓ"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ਐਪ ਨੂੰ ਮੈਮਰੀ ਵਿੱਚ ਖੁਦ ਦੇ ਭਾਗਾਂ ਨੂੰ ਸਥਾਈ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਟੈਬਲੈੱਟ ਨੂੰ ਹੌਲੀ ਕਰਦੇ ਹੋਏ ਹੋਰਾਂ ਐਪਾਂ ਲਈ ਉਪਲਬਧ ਮੈਮਰੀ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦਾ ਹੈ।"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"ਐਪ ਨੂੰ ਮੈਮਰੀ ਵਿੱਚ ਖੁਦ ਦੇ ਭਾਗਾਂ ਨੂੰ ਸਥਾਈ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ TV ਨੂੰ ਹੌਲੀ ਕਰਦੇ ਹੋਏ ਹੋਰਾਂ ਐਪਸ ਤੇ ਉਪਲਬਧ ਮੈਮਰੀ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦਾ ਹੈ।"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ਐਪ ਨੂੰ ਮੈਮਰੀ ਵਿੱਚ ਖੁਦ ਦੇ ਭਾਗਾਂ ਨੂੰ ਸਥਾਈ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਫ਼ੋਨ ਨੂੰ ਹੌਲੀ ਕਰਦੇ ਹੋਏ ਹੋਰਾਂ ਐਪਾਂ ਤੇ ਉਪਲਬਧ ਮੈਮਰੀ ਨੂੰ ਸੀਮਿਤ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"ਫੋਰਗ੍ਰਾਉਂਡ ਸੇਵਾਵਾਂ ਚਲਾਓ"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"ਐਪ ਨੂੰ ਫੋਰਗ੍ਰਾਉਂਡ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦਿਓ।"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"ਐਪ ਸਟੋਰੇਜ ਜਗ੍ਹਾ ਮਾਪੋ"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"ਐਪ ਨੂੰ ਇਸਦਾ ਕੋਡ, ਡਾਟਾ ਅਤੇ ਕੈਸ਼ੇ ਆਕਾਰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰੋ"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ਪੈਟਰਨ ਅਣਲਾਕ।"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ਚਿਹਰਾ ਅਣਲਾਕ।"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ਪਿੰਨ ਅਣਲਾਕ।"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"ਸਿਮ ਪਿੰਨ ਅਣਲਾਕ।"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"ਸਿਮ Puk ਅਣਲਾਕ।"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ਪਾਸਵਰਡ ਅਣਲਾਕ।"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ਪੈਟਰਨ ਖੇਤਰ।"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ਖੇਤਰ ਸਲਾਈਡ ਕਰੋ।"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"ਟੈਕਸਟ ਕਲਿਪਬੋਰਡ ਤੇ ਕਾਪੀ ਕੀਤਾ।"</string>
<string name="more_item_label" msgid="4650918923083320495">"ਹੋਰ"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"ਮੀਨੂ+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"ਸਪੇਸ"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ਦਾਖਲ ਕਰੋ"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ਮਿਟਾਓ"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਕਰੋ"</string>
<string name="smv_application" msgid="3307209192155442829">"ਐਪ <xliff:g id="APPLICATION">%1$s</xliff:g> (ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROCESS">%2$s</xliff:g>) ਨੇ ਆਪਣੀ ਖੁਦ-ਲਾਗੂ ਕੀਤੀ ਸਟ੍ਰਿਕਟਮੋਡ ਨੀਤੀ ਦੀ ਉਲੰਘਣਾ ਕੀਤੀ ਹੈ।"</string>
<string name="smv_process" msgid="5120397012047462446">"ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROCESS">%1$s</xliff:g> ਨੇ ਆਪਣੀ ਖੁਦ-ਲਾਗੂ ਕੀਤੀ ਸਟ੍ਰਿਕਟਮੋਡ ਨੀਤੀ ਦੀ ਉਲੰਘਣਾ ਕੀਤੀ ਹੈ।"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android ਅਪਗ੍ਰੇਡ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ਫ਼ੋਨ ਅੱਪਡੇਟ ਹੋ ਰਿਹਾ ਹੈ…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ਟੈਬਲੈੱਟ ਅੱਪਡੇਟ ਹੋ ਰਿਹਾ ਹੈ…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"ਡੀਵਾਈਸ ਅੱਪਡੇਟ ਹੋ ਰਿਹਾ ਹੈ…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ਫ਼ੋਨ ਚਾਲੂ ਹੋ ਰਿਹਾ ਹੈ…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ਟੈਬਲੈੱਟ ਚਾਲੂ ਹੋ ਰਿਹਾ ਹੈ…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"ਡੀਵਾਈਸ ਚਾਲੂ ਹੋ ਰਿਹਾ ਹੈ…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ਸਟੋਰੇਜ ਅਨੁਕੂਲ ਹੋ ਰਹੀ ਹੈ।"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android ਅੱਪਡੇਟ ਮੁਕੰਮਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਕੁਝ ਐਪਾਂ ਅੱਪਗ੍ਰੇਡ ਪੂਰਾ ਹੋਣ ਤੱਕ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"ਸਿਸਟਮ ਅੱਪਡੇਟ ਪੂਰਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ਅੱਪਗ੍ਰੇਡ ਹੋ ਰਹੀ ਹੈ…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> <xliff:g id="NUMBER_1">%2$d</xliff:g> ਦਾ ਐਪ ਅਨੁਕੂਲ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> ਤਿਆਰ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ਐਪਸ ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ਬੂਟ ਪੂਰਾ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ਚੱਲ ਰਿਹਾ ਹੈ"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"ਗੇਮ \'ਤੇ ਵਾਪਸ ਜਾਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ਗੇਮ ਚੁਣੋ"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"ਬਿਹਤਰ ਪ੍ਰਦਰਸ਼ਨ ਲਈ, ਇੱਕ ਸਮੇਂ \'ਤੇ ਇਹਨਾਂ ਗੇਮਾਂ ਵਿੱਚੋਂ ਸਿਰਫ਼ ਇੱਕ ਹੀ ਖੋਲ੍ਹੀ ਜਾ ਸਕਦੀ ਹੈ।"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> \'ਤੇ ਵਾਪਸ ਜਾਓ"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> ਖੋਲ੍ਹੋ"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> ਰੱਖਿਅਤ ਕੀਤੇ ਬਿਨਾਂ ਬੰਦ ਹੋ ਜਾਵੇਗੀ"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਮੈਮਰੀ ਸੀਮਾ ਵਧ ਗਈ ਹੈ"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ਹੀਪ ਡੰਪ ਇਕੱਤਰ ਕੀਤਾ ਗਿਆ; ਸਾਂਝਾ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"ਕੀ ਹੀਪ ਡੰਪ ਸ਼ੇਅਰ ਕਰਨਾ ਹੈ?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"ਪ੍ਰਕਿਰਿਆ <xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਆਪਣੀ ਪ੍ਰਕਿਰਿਆ ਮੈਮਰੀ ਸੀਮਾ <xliff:g id="SIZE">%2$s</xliff:g> ਵਧ ਗਈ ਹੈ। ਇਸਦੇ ਵਿਕਾਸਕਾਰ ਨਾਲ ਸਾਂਝਾ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਹੀਪ ਡੰਪ ਉਪਲਬਧ ਹੈ। ਸਾਵਧਾਨ ਰਹੋ: ਇਸ ਹੀਪ ਡੰਪ ਵਿੱਚ ਤੁਹਾਡੀ ਕੋਈ ਵੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਹੋ ਸਕਦੀ ਹੈ, ਜਿਸ \'ਤੇ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਪਹੁੰਚ ਹੈ।"</string>
<string name="sendText" msgid="5209874571959469142">"ਲਿਖਤ ਲਈ ਕੋਈ ਕਾਰਵਾਈ ਚੁਣੋ"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ਖੁੱਲ੍ਹੇ ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਹੋਵੋ"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ਕੈਰੀਅਰ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ਖੁੱਲ੍ਹੇ ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ਸਾਰੇ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ਕਨੈਕਟ ਕਰੋ"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ਸਾਰੇ ਨੈੱਟਵਰਕ"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ਸਾਰੇ ਨੈੱਟਵਰਕ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ਵਾਈ‑ਫਾਈ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਚੱਲ ਪਵੇਗਾ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ ਰੱਖਿਅਤ ਕੀਤੇ ਉੱਚ-ਗੁਣਵੱਤਾ ਵਾਲੇ ਨੈੱਟਵਰਕ ਦੇ ਨੇੜੇ ਹੋਵੋ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ਵਾਪਸ ਚਾਲੂ ਨਾ ਕਰੋ"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"ਰੀਸਟਾਰਟ ਕਰੋ"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ਮੋਬਾਈਲ ਸੇਵਾ ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ਆਪਣੇ ਨਵੇਂ ਸਿਮ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਲਈ ਕੈਰੀਅਰ ਐਪ ਡਾਊਨਲੋਡ ਕਰੋ"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"ਆਪਣੇ ਨਵੇਂ ਸਿਮ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਲਈ <xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ ਡਾਊਨਲੋਡ ਕਰੋ"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ਐਪ ਡਾਊਨਲੋਡ ਕਰੋ"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ਨਵੀਂ SIM ਦਾਖਲ ਕੀਤੀ ਗਈ"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ਇਸ ਨੂੰ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB ਰਾਹੀਂ PTP ਚਾਲੂ ਹੈ"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB ਰਾਹੀਂ MIDI ਚਾਲੂ ਹੈ"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ਐਕਸੈਸਰੀ ਮੋਡ ਚਾਲੂ ਹੈ"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB ਐਕਸੈਸਰੀ ਕਨੈਕਟ ਹੋਈ"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ। ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ਐਨਾਲੌਗ ਆਡੀਓ ਉਪਸਾਧਨ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ਨੱਥੀ ਕੀਤਾ ਡੀਵਾਈਸ ਇਸ ਫ਼ੋਨ ਦੇ ਅਨੁਰੂਪ ਨਹੀਂ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB ਡੀਬੱਗਿੰਗ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB ਡੀਬੱਗਿੰਗ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB ਡੀਬੱਗਿੰਗ ਅਯੋਗ ਬਣਾਉਣ ਲਈ ਚੁਣੋ।"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"ਬੱਗ ਰਿਪਰੋਟ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"ਕੀ ਬੱਗ ਰਿਪੋਰਟ ਸਾਂਝੀ ਕਰਨੀ ਹੈ?"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰਾਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ।"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ਜੇਕਰ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ਬੰਦ ਕਰੋ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ਬੰਦ ਕਰੋ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ਤਿਆਰ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ਤਰੁੱਟੀਆਂ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"ਨਵੇਂ <xliff:g id="NAME">%s</xliff:g> ਦਾ ਪਤਾ ਲਗਾਇਆ ਗਿਆ"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਤੋਂ ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਅਸ਼ੁੱਧੀ"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Change network or VPN settings"</string>
<string name="upload_file" msgid="2897957172366730416">"ਫਾਈਲ ਚੁਣੋ"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ਕੋਈ ਫਾਈਲ ਨਹੀਂ ਚੁਣੀ ਗਈ"</string>
<string name="reset" msgid="2448168080964209908">"ਰੀਸੈੱਟ ਕਰੋ"</string>
<string name="submit" msgid="1602335572089911941">"ਪ੍ਰਸਤੁਤ ਕਰੋ"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"ਕਾਰ ਮੋਡ ਸਮਰਥਿਤ"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"ਕਾਰ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ਟੈਦਰਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ਡ੍ਰਾਇਵ"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB ਸਟੋਰੇਜ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ਸੰਪਾਦਨ ਕਰੋ"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">" ਡਾਟਾ ਵਰਤੋਂ ਚਿਤਾਵਨੀ"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"ਵਰਤੋਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ਡਾਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ਡਾਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋਈ"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ਡਾਟਾ ਚਿਤਾਵਨੀ"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"ਤੁਸੀਂ <xliff:g id="APP">%s</xliff:g> ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕੀਤੀ"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"ਮੋਬਾਈਲ ਡਾਟਾ ਸੀਮਾ ਸਮਾਪਤ ਹੋਈ"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ਵਾਈ-ਫਾਈ ਡਾਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"ਬਾਕੀ ਸਾਇਕਲ ਲਈ ਡਾਟਾ ਰੁਕ ਗਿਆ"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G ਡਾਟਾ ਸੀਮਾ ਵਧ ਗਈ"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ਡਾਟਾ ਸੀਮਾ ਵਧੀ"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"ਮੋਬਾਈਲ ਡਾਟਾ ਦੀ ਸੀਮਾ ਵਧ ਗਈ"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"ਵਾਈ-ਫਾਈ ਡਾਟਾ ਸੀਮਾ ਵਧ ਗਈ"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> ਤੋਂ ਵੱਧ ਨਿਰਦਿਸ਼ਟ ਸੀਮਾ।"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"ਤੁਹਾਡੀ ਬਾਕੀ ਮਿਆਦ ਲਈ ਡਾਟਾ ਰੋਕਿਆ ਗਿਆ"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"ਆਪਣੇ ਮੋਬਾਈਲ ਡਾਟੇ ਦੀ ਸੀਮਾ ਤੋਂ ਵੱਧ"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"ਵਾਈ-ਫਾਈ ਡਾਟੇ ਦੀ ਸੀਮਾ ਤੋਂ ਵੱਧ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"ਤੁਸੀਂ ਆਪਣੀ ਸੈੱਟ ਕੀਤੀ ਹੋਈ ਸੀਮਾ ਤੋਂ <xliff:g id="SIZE">%s</xliff:g> ਵੱਧ ਵਰਤੀ"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"ਪਿਛੋਕੜ ਡਾਟਾ ਪ੍ਰਤਿਬੰਧਿਤ"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"ਪਾਬੰਦੀ ਹਟਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"ਜ਼ਿਆਦਾ ਡਾਟਾ ਵਰਤੋਂ"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"ਪਿਛਲੇ ਕੁਝ ਦਿਨਾਂ ਤੋਂ ਤੁਹਾਡੇ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਆਮ ਨਾਲੋਂ ਜ਼ਿਆਦਾ ਹੈ। ਵਰਤੋਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ਮੋਬਾਈਲ ਡਾਟੇ ਦੀ ਜ਼ਿਆਦਾ ਵਰਤੋਂ"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"ਤੁਹਾਡੀਆਂ ਐਪਾਂ ਨੇ ਆਮ ਨਾਲੋਂ ਜ਼ਿਆਦਾ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਹੈ"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ਨੇ ਆਮ ਨਾਲੋਂ ਜ਼ਿਆਦਾ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਹੈ"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"ਸੁਰੱਖਿਆ ਪ੍ਰਮਾਣ-ਪੱਤਰ"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ਇਹ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਵੈਧ ਹੈ।"</string>
<string name="issued_to" msgid="454239480274921032">"ਨੂੰ ਜਾਰੀ ਕੀਤਾ ਗਿਆ:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਮਿਟਾਇਆ ਗਿਆ"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"ਬੈਟਰੀ ਲਾਈਫ਼ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਸਹਾਇਤਾ ਕਰਨ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਦਰਸ਼ਨ ਘਟਾਉਂਦਾ ਹੈ ਅਤੇ ਥਰਥਰਾਹਟ, ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਅਤੇ ਜ਼ਿਆਦਾਤਰ ਬੈਕਗ੍ਰਾਊਂਡ ਡਾਟੇ ਨੂੰ ਸੀਮਤ ਕਰਦਾ ਹੈ। ਈਮੇਲ, ਸੁਨੇਹਾ ਭੇਜਣ ਅਤੇ ਹੋਰ ਐਪਾਂ, ਜੋ ਸਮਕਾਲੀਕਰਨ \'ਤੇ ਨਿਰਭਰ ਹਨ, ਉਹ ਉਦੋਂ ਤੱਕ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਖੋਲ੍ਹਦੇ ਨਹੀਂ।\n\nਬੈਟਰੀ ਸੇਵਰ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਬੰਦ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੁੰਦਾ ਹੈ।"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤਮਾਨ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟਾ \'ਤੇ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਤਦ ਤੱਕ ਨਹੀਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤੇ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ਕੀ ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ਚਾਲੂ ਕਰੋ"</string>
@@ -1682,9 +1705,9 @@
<item quantity="one">%1$d ਮਿੰਟਾਂ ਲਈ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ਤੱਕ)</item>
<item quantity="other">%1$d ਮਿੰਟਾਂ ਲਈ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ਤੱਕ)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">%1$d ਘੰਟਿਆਂ ਤੱਕ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ਤੱਕ)</item>
- <item quantity="other">%1$d ਘੰਟਿਆਂ ਤੱਕ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ਤੱਕ)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">%1$d ਘੰਟੇ ਲਈ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ਤੱਕ)</item>
+ <item quantity="other">%1$d ਘੰਟਿਆਂ ਲਈ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ਤੱਕ)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">%1$d ਘੰਟਿਆਂ ਲਈ (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ਤੱਕ)</item>
@@ -1698,9 +1721,9 @@
<item quantity="one">%d ਮਿੰਟਾਂ ਲਈ</item>
<item quantity="other">%d ਮਿੰਟਾਂ ਲਈ</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">%d ਘੰਟਿਆਂ ਤੱਕ</item>
- <item quantity="other">%d ਘੰਟਿਆਂ ਤੱਕ</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">%d ਘੰਟੇ ਲਈ</item>
+ <item quantity="other">%d ਘੰਟਿਆਂ ਲਈ</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">%d ਘੰਟਿਆਂ ਲਈ</item>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ਵੱਲੋਂ ਮਿਊਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਇੱਕ ਅੰਦਰੂਨੀ ਸਮੱਸਿਆ ਹੈ ਅਤੇ ਇਹ ਅਸਥਿਰ ਹੋ ਸਕਦੀ ਹੈ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਨਹੀਂ ਕਰਦੇ।"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਇੱਕ ਅੰਦਰੂਨੀ ਸਮੱਸਿਆ ਸੀ। ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਨਿਰਮਾਤਾ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD ਬੇਨਤੀ DIAL ਬੇਨਤੀ ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD ਬੇਨਤੀ SS ਬੇਨਤੀ ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD ਬੇਨਤੀ ਨਵੀਂ USSD ਬੇਨਤੀ ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD ਬੇਨਤੀ ਨੂੰ ਸੋਧ ਕੇ ਵੀਡੀਓ ਡਾਇਲ ਬੇਨਤੀ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ।"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ਬੇਨਤੀ DIAL ਬੇਨਤੀ ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS ਬੇਨਤੀ ਨੂੰ ਸੋਧ ਕੇ ਵੀਡੀਓ ਡਾਇਲ ਬੇਨਤੀ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ।"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ਬੇਨਤੀ USSD ਬੇਨਤੀ ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ਬੇਨਤੀ ਨਵੀਂ SS ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ਵਿਸਤਾਰ ਕਰੋ"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ਸੁੰਗੇੜੋ"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ਹਾਨੀਕਾਰਕ ਐਪ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ਦੀ <xliff:g id="APP_2">%2$s</xliff:g> ਦੇ ਹਿੱਸੇ ਦਿਖਾਉਣ ਦੀ ਇੱਛਾ ਹੈ"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ਸੰਪਾਦਨ ਕਰੋ"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"ਕਾਲਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਦੀ ਥਰਥਰਾਹਟ ਹੋਵੇਗੀ"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ਕਾਲਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਨੂੰ ਮਿਊਟ ਕੀਤਾ ਜਾਵੇਗਾ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ਸਿਸਟਮ ਬਦਲਾਅ"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"ਧਿਆਨ ਲਗਾਉਣ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰਨ ਲਈ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਮੋਡ ਸੂਚਨਾਵਾਂ ਨੂੰ ਲੁਕਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ਇਹ ਨਵਾਂ ਵਤੀਰਾ ਹੈ। ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵਿਕਲਪ ਬਦਲ ਗਿਆ ਹੈ"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ਰੁਕਾਵਟਾਂ ਲਈ ਆਪਣੀਆਂ ਵਰਤਾਅ ਸੈਟਿੰਗਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"ਟੈਪ ਕਰਕੇ ਦੋਖੋ ਕਿ ਕਿਹੜੀਆਂ ਚੀਜ਼ਾਂ ਬਲਾਕ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ।"</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 2172aaed2687..d5515fe2a421 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -79,15 +79,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ID rozmówcy ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: nie zastrzeżony"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Usługa nie jest świadczona."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Nie możesz zmienić ustawienia ID rozmówcy."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Brak usługi transmisji danych"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Brak możliwości wykonywania połączeń alarmowych"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Brak komórkowej usługi transmisji danych"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Połączenia alarmowe są niedostępne"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Brak usługi połączeń głosowych"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Brak usługi połączeń głosowych/alarmowych"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Usługa tymczasowo nieoferowana przez sieć komórkową w Twojej lokalizacji"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Brak zasięgu sieci"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Aby poprawić odbiór, zmień typ sieci: wybierz Ustawienia &gt; Sieć i internet &gt; Sieci komórkowe &gt; Preferowany typ sieci."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Funkcja Połączenia przez Wi‑Fi jest aktywna"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Połączenia alarmowe wymagają sieci komórkowej."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Brak usługi połączeń głosowych i alarmowych"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Tymczasowo wyłączone przez operatora"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Brak zasięgu sieci komórkowej"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Spróbuj zmienić preferowaną sieć. Kliknij, by zmienić."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Połączenia alarmowe są niedostępne"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Nie można nawiązywać połączeń alarmowych przez Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerty"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Przekierowanie połączeń"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Tryb alarmowego połączenia zwrotnego"</string>
@@ -122,13 +122,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Baner roamingu włączony"</string>
<string name="roamingText12" msgid="1189071119992726320">"Baner roamingu wyłączony"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Wyszukiwanie usługi"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Połączenia przez Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Aby dzwonić i wysyłać wiadomości przez Wi-Fi, poproś swojego operatora o skonfigurowanie tej usługi. Potem ponownie włącz połączenia przez Wi-Fi w Ustawieniach. (Kod błędu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Rejestracja u operatora (kod błędu: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Połączenia przez Wi-Fi (%s)"</item>
@@ -162,8 +161,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Zbyt wiele żądań jest przetwarzanych. Spróbuj ponownie później."</string>
<string name="notification_title" msgid="8967710025036163822">"Błąd logowania na konto <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synchronizacja"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synchronizuj"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Zbyt wiele usuwanych <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Pamięć tabletu jest pełna. Usuń niektóre pliki, aby zwolnić miejsce."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Pamięć w zegarku jest pełna. Usuń niektóre pliki, by zwolnić miejsce."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Pamięć telewizora jest pełna. Usuń jakieś pliki, by zwolnić miejsce."</string>
@@ -178,14 +179,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Przez administratora Twojego profilu do pracy"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Przez <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Usunięto profil służbowy"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profil służbowy został usunięty z powodu braku aplikacji administratora"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Brakuje aplikacji administratora profilu do pracy lub jest ona uszkodzona. Dlatego Twój profil służbowy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Twój profil służbowy nie jest już dostępny na tym urządzeniu"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Zbyt wiele prób podania hasła"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Urządzenie jest zarządzane"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Twoja organizacja zarządza tym urządzeniem i może monitorować ruch w sieci. Kliknij, by dowiedzieć się więcej."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Twoje urządzenie zostanie wyczyszczone"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Tej aplikacji administratora nie można używać. Dane z urządzenia zostaną wykasowane.\n\nJeśli masz pytania, skontaktuj się z administratorem organizacji."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Nie można użyć aplikacji administratora. Dane z urządzenia zostaną wykasowane.\n\nJeśli masz pytania, skontaktuj się z administratorem organizacji."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Drukowanie wyłączone przez: <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Ja"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opcje tabletu"</string>
@@ -242,6 +242,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Tryb samolotowy"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Tryb samolotowy jest włączony"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Tryb samolotowy jest wyłączony"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Oszczędzanie baterii"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Oszczędzanie baterii WYŁ."</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Oszczędzanie baterii WŁ."</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ustawienia"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoc"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asystent głosowy"</string>
@@ -275,31 +278,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Przełącz na profil służbowy"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"dostęp do kontaktów"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Zezwalaj aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do kontaktów"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokalizacja"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"dostęp do informacji o lokalizacji tego urządzenia"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Zezwalaj aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do lokalizacji urządzenia"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendarz"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"dostęp do kalendarza"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Zezwalaj aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do kalendarza"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"wysyłanie i wyświetlanie SMS‑ów"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Zezwalaj aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na wysyłanie i wyświetlanie SMS-ów"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Pamięć wewnętrzna"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"dostęp do zdjęć, multimediów i plików na Twoim urządzeniu"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Zezwalaj aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do zdjęć, multimediów i plików na urządzeniu"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"nagrywanie dźwięku"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Zezwalaj aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na nagrywanie dźwięku"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Aparat"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"robienie zdjęć i nagrywanie filmów"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Zezwalaj aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na robienie zdjęć i nagrywanie filmów"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"nawiązywanie połączeń telefonicznych i zarządzanie nimi"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Zezwalaj aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na wykonywanie połączeń telefonicznych i zarządzanie nimi"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Czujniki na ciele"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"dostęp do danych czujnika podstawowych funkcji życiowych"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Zezwalaj aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do danych z czujnika podstawowych funkcji życiowych"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pobieranie zawartości okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Sprawdzanie zawartości okna, z którego korzystasz."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Włączenie czytania dotykiem"</string>
@@ -311,7 +323,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Obsługa gestów"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Obsługuje kliknięcia, przesunięcia, ściągnięcia palców i inne gesty."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gesty związane z odciskiem palca"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Może przechwytywać gesty wykonywane na czytniku linii papilarnych w urządzeniu."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Może przechwytywać gesty wykonywane na czytniku linii papilarnych w urządzeniu."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"wyłączanie lub zmienianie paska stanu"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Pozwala aplikacji na wyłączanie paska stanu oraz dodawanie i usuwanie ikon systemowych."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"działanie jako pasek stanu"</string>
@@ -362,6 +374,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Pozwala aplikacji na trwałe zapisywanie swoich fragmentów w pamięci. Może to zmniejszyć ilość pamięci dostępnej dla innych aplikacji i spowolnić działanie tabletu."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Pozwala aplikacji zapewnić nieusuwalność swoich fragmentów z pamięci. Może to ograniczyć ilość pamięci dostępną dla innych aplikacji i spowalniać działanie telewizora."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Pozwala aplikacji na trwałe zapisywanie swoich fragmentów w pamięci. Może to zmniejszyć ilość pamięci dostępnej dla innych aplikacji i spowolnić działanie telefonu."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"uruchom usługę na pierwszym planie"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Zezwala na korzystanie przez aplikację z usług na pierwszym planie."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"mierzenie rozmiaru pamięci aplikacji"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Pozwala aplikacji na pobieranie własnego kodu, danych oraz rozmiarów pamięci podręcznej."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modyfikowanie ustawień systemu"</string>
@@ -808,6 +822,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odblokowanie wzorem."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Rozpoznanie twarzy"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odblokowanie kodem PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Odblokowanie kodu PIN karty SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Odblokowanie kodu PUK karty SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odblokowanie hasłem."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Obszar wzoru."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Obszar przesuwania."</string>
@@ -869,6 +885,12 @@
<string name="text_copied" msgid="4985729524670131385">"Tekst został skopiowany do schowka."</string>
<string name="more_item_label" msgid="4650918923083320495">"Więcej"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funkcyjny+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"spacja"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"usuń"</string>
@@ -1114,31 +1136,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Sprawdź aktualizację"</string>
<string name="smv_application" msgid="3307209192155442829">"Aplikacja <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) naruszyła wymuszone przez siebie zasady StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> naruszył wymuszone przez siebie zasady StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android jest uaktualniany..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android się uruchamia…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefon się aktualizuje…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Tablet się aktualizuje…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Urządzenie się aktualizuje…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon się uruchamia…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Tablet się uruchamia…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Urządzenie się uruchamia…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optymalizacja pamięci."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Kończę aktualizowanie Androida…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Niektóre aplikacje mogą nie działać prawidłowo, dopóki nie zakończy się aktualizacja."</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Kończę aktualizację systemu…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Uaktualniam aplikację <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Optymalizowanie aplikacji <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Przygotowuję aplikację <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Uruchamianie aplikacji."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Kończenie uruchamiania."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Działa <xliff:g id="APP">%1$s</xliff:g>"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Kliknij, by wrócić do gry"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Wybierz grę"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Aby poprawić wydajność, otwarta może być tylko jedna z tych gier."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Wróć do aplikacji <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Otwórz aplikację <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"Aplikacja <xliff:g id="OLD_APP">%1$s</xliff:g> zostanie zamknięta bez zapisywania"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> przekroczył limit pamięci"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Pobrano zrzut sterty – kliknij, by go udostępnić"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Udostępnić zrzut stosu?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Proces <xliff:g id="PROC">%1$s</xliff:g> przekroczył swój limit pamięci, który wynosi <xliff:g id="SIZE">%2$s</xliff:g>. Możesz udostępnić zrzut stosu programiście procesu. Uwaga: ten zrzut może zawierać wszelkie dane osobowe, do których aplikacja ma dostęp."</string>
<string name="sendText" msgid="5209874571959469142">"Wybierz czynność, jaka ma zostać wykonana na tekście"</string>
@@ -1177,12 +1197,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Połącz się z otwartą siecią Wi-Fi"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Połącz się z siecią Wi‑Fi operatora"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Łączę się z otwartą siecią Wi-Fi"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Połączono z siecią Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nie udało się połączyć z siecią Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Kliknij, by zobaczyć wszystkie sieci"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Połącz"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Wszystkie sieci"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Wszystkie sieci"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi włączy się automatycznie"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Gdy znajdziesz się w pobliżu zapisanej sieci o mocnym sygnale"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Nie włączaj ponownie"</string>
@@ -1248,6 +1269,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Uruchom ponownie"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktywuj usługę sieci komórkowej"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Pobierz aplikację operatora, by aktywować nową kartę SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Pobierz aplikację <xliff:g id="APP_NAME">%1$s</xliff:g>, by aktywować nową kartę SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Pobierz aplikację"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Włożono nową kartę SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Kliknij, by skonfigurować"</string>
@@ -1266,13 +1288,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Tryb PTP przez USB włączony"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB włączony"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Tryb MIDI przez USB włączony"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Tryb akcesorium USB włączony"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Podłączono akcesorium USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Kliknij, by wyświetlić więcej opcji."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Ładowanie podłączonego urządzenia. Kliknij, by wyświetlić więcej opcji."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Wykryto analogowe urządzenie audio"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Podłączone urządzenie nie jest zgodne z tym telefonem. Kliknij, by dowiedzieć się więcej."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Podłączono moduł debugowania USB"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Kliknij, by wyłączyć debugowanie USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Kliknij, by wyłączyć debugowanie USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Wybierz, aby wyłączyć debugowanie USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Zgłaszam błąd…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Udostępnić raport o błędzie?"</string>
@@ -1291,7 +1313,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Wyświetlanie aplikacji <xliff:g id="NAME">%s</xliff:g> nad innymi"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Aplikacja <xliff:g id="NAME">%s</xliff:g> jest nad innymi"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jeśli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystała z tej funkcji, otwórz ustawienia i wyłącz ją."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"WYŁĄCZ"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Wyłącz"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Przygotowuję: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sprawdzanie w poszukiwaniu błędów"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Wykryto nowy nośnik: <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1377,14 +1399,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Łączę ze stałą siecią VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Połączono ze stałą siecią VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Rozłączono ze stałą siecią VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Błąd stałej sieci VPN"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Zmień ustawienia sieciowe lub ustawienia sieci VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Wybierz plik"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nie wybrano pliku"</string>
<string name="reset" msgid="2448168080964209908">"Resetuj"</string>
<string name="submit" msgid="1602335572089911941">"Prześlij"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Tryb samochodowy włączony"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Kliknij, by zakończyć tryb samochodowy."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Aktywny tethering lub punkt dostępu"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Kliknij, by skonfigurować."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering został wyłączony"</string>
@@ -1464,22 +1489,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Dysk USB (<xliff:g id="MANUFACTURER">%s</xliff:g>)"</string>
<string name="storage_usb" msgid="3017954059538517278">"Nośnik USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Edytuj"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alert użycia danych"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Kliknij, by wyświetlić użycie i ustawienia."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Osiągnięto limit danych 2G/3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Osiągnięto limit danych 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Ostrzeżenie dotyczące użycia danych"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Użycie danych: <xliff:g id="APP">%s</xliff:g>"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Osiągnięto limit mobilnej transmisji danych"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Osiągnięto limit danych Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Dane wstrzymane do końca cyklu"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Przekroczono limit danych 2G/3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Przekroczono limit danych 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Przekroczenie limitu danych"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Przekroczono limit danych Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> ponad określony limit"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Wstrzymano transmisję danych na resztę cyklu"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Przekroczono limit danych"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Przekroczono limit w Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Ustawiony limit został przekroczony o <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Dane w tle są ograniczone"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Kliknij, by usunąć ograniczenie."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Duże użycie danych"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Od kilku dni przesyłasz więcej danych niż zwykle. Kliknij, by wyświetlić użycie i ustawienia."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Wysokie użycie danych"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Aplikacje miały wyższe użycie danych niż zwykle"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"Aplikacja <xliff:g id="APP">%s</xliff:g> miała wyższe użycie danych niż zwykle"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certyfikat zabezpieczeń"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Certyfikat jest ważny."</string>
<string name="issued_to" msgid="454239480274921032">"Wystawiony dla:"</string>
@@ -1719,7 +1741,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Zainstalowany przez administratora"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Zaktualizowany przez administratora"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Usunięty przez administratora"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Aby wydłużyć czas pracy baterii, Oszczędzanie baterii ogranicza aktywność urządzenia, w tym wibracje, usługi lokalizacyjne i przetwarzanie większości danych w tle. Poczta, SMS-y i inne synchronizowane aplikacje mogą nie aktualizować swojej zawartości, dopóki ich nie otworzysz.\n\nOszczędzanie baterii wyłącza się automatycznie podczas ładowania urządzenia."</string>
+ <string name="battery_saver_description" msgid="4660824093877546730">"Aby wydłużyć czas pracy baterii, Oszczędzanie baterii ogranicza bądź wyłącza wibracje, usługi lokalizacyjne i przetwarzanie danych w tle. Poczta e-mail, SMS-y i inne synchronizowane aplikacje mogą nie aktualizować swojej zawartości, dopóki ich nie otworzysz.\n\nOszczędzanie baterii wyłącza się automatycznie podczas ładowania urządzenia."</string>
<string name="data_saver_description" msgid="6015391409098303235">"Oszczędzanie danych uniemożliwia niektórym aplikacjom wysyłanie i odbieranie danych w tle, zmniejszając w ten sposób ich użycie. Aplikacja, z której w tej chwili korzystasz, może uzyskiwać dostęp do danych, ale rzadziej. Może to powodować, że obrazy będą się wyświetlać dopiero po kliknięciu."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Włączyć Oszczędzanie danych?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Włącz"</string>
@@ -1735,11 +1757,11 @@
<item quantity="other">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">1 min (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="few">Przez %1$d godziny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">Przez %1$d godzin (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Przez %1$d godziny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Przez godzinę (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="few">Na %1$d godziny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="many">Na %1$d godzin (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Na %1$d godziny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">Na godzinę (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="few">%1$d godz. (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1759,11 +1781,11 @@
<item quantity="other">%d min</item>
<item quantity="one">1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="few">Przez %d godziny</item>
- <item quantity="many">Przez %d godzin</item>
- <item quantity="other">Przez %d godziny</item>
- <item quantity="one">Przez godzinę</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="few">Na %d godziny</item>
+ <item quantity="many">Na %d godzin</item>
+ <item quantity="other">Na %d godziny</item>
+ <item quantity="one">Na godzinę</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="few">%d godz.</item>
@@ -1786,14 +1808,14 @@
<string name="muted_by" msgid="6147073845094180001">"Ściszone przez: <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"W Twoim urządzeniu wystąpił problem wewnętrzny. Może być ono niestabilne, dopóki nie przywrócisz danych fabrycznych."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"W Twoim urządzeniu wystąpił problem wewnętrzny. Skontaktuj się z jego producentem, by otrzymać szczegółowe informacje."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Żądanie USSD zostało zmienione na żądanie DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Żądanie USSD zostało zmienione na żądanie SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Żądanie USSD zostało zmienione na nowe żądanie USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Żądanie USSD zostało zmienione na żądanie Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Żądanie SS zostało zmienione na żądanie DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Żądanie SS zostało zmienione na żądanie Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Żądanie SS zostało zmienione na żądanie USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Żądanie SS zostało zmienione na nowe żądanie SS."</string>
+ <string name="stk_cc_ussd_to_dial" msgid="5214333646366591205">"Żądanie USSD zmienione na zwykłe połączenie"</string>
+ <string name="stk_cc_ussd_to_ss" msgid="4884994189414782605">"Żądanie USSD zmienione na żądanie SS"</string>
+ <string name="stk_cc_ussd_to_ussd" msgid="5728637484565449312">"Zmieniono na nowe żądanie USSD"</string>
+ <string name="stk_cc_ussd_to_dial_video" msgid="4134455726513175559">"Żądanie USSD zmienione na rozmowę wideo"</string>
+ <string name="stk_cc_ss_to_dial" msgid="1360775164651754978">"Żądanie SS zmienione na zwykłe połączenie"</string>
+ <string name="stk_cc_ss_to_dial_video" msgid="6577956662913194947">"Żądanie SS zmienione na rozmowę wideo"</string>
+ <string name="stk_cc_ss_to_ussd" msgid="5614626512855868785">"Żądanie SS zmienione na żądanie USSD"</string>
+ <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Zmieniono na nowe żądanie SS"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil służbowy"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Rozwiń"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Zwiń"</string>
@@ -1907,7 +1929,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Wykryto szkodliwą aplikację"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikacja <xliff:g id="APP_0">%1$s</xliff:g> chce pokazywać wycinki z aplikacji <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edytuj"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Wibracje przy połączeniach i powiadomieniach"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Wyciszenie połączeń i powiadomień"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Zmiany w systemie"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Nie przeszkadzać"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"W trybie Nie przeszkadzać powiadomienia są ukrywane, by Cię nie rozpraszać"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"To nowe działanie. Kliknij, by zmienić."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Zmiany w trybie Nie przeszkadzać"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Kliknij, by sprawdzić ustawienia zachowania w przypadku zakłóceń"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Kliknij, by sprawdzić, co jest zablokowane."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 5ab8d3380095..338084680c1a 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"O ID do chamador assume o padrão de não restrito. Próxima chamada: Não restrita"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"O serviço não foi habilitado."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Não é possível alterar a configuração de identificação de chamadas."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Sem serviço de dados"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Sem chamada de emergência"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Nenhum serviço móvel de dados"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Chamadas de emergência indisponíveis"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sem serviço de voz"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente bloqueado pela rede móvel no seu local"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Para melhorar a recepção, tente alterar o tipo selecionado em Config. &gt; Rede e Internet &gt; Redes móveis &gt; Tipo de rede preferencial."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"A chamada no Wi‑Fi está ativa"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"As chamadas de emergência exigem uma rede móvel."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nenhum serviço de voz nem chamada de emergência"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Temporariamente desativado pela sua operadora"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Não foi possível acessar a rede móvel"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tente alterar a rede preferencial. Toque para alterar."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Chamadas de emergência indisponíveis"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Não é possível fazer chamadas de emergência por Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de roaming ativado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de roaming desativado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Pesquisando serviço"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chamadas por Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente a chamada no Wi-Fi nas configurações. Código de erro: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registre-se junto à sua operadora (Código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s chamada Wi-Fi"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Há muitas solicitações sendo processadas. Tente novamente mais tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Erro de login para <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronizar"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronizar"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Muitas exclusões de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"O armazenamento do tablet está cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"O armazenamento da TV está cheio. Exclua alguns arquivos para liberar espaço."</string>
@@ -174,7 +175,6 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Pelo administrador do seu perfil de trabalho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Perfil de trabalho excluído"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Perfil de trabalho excluído devido à ausência de um app para administrador"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"O app para administrador do perfil de trabalho não foi encontrado ou está corrompido. Consequentemente, seu perfil de trabalho e os dados relacionados foram excluídos. Entre em contato com seu administrador para receber assistência."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Seu perfil de trabalho não está mais disponível neste dispositivo"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Muitas tentativas de senha"</string>
@@ -272,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Alternar para o perfil de trabalho"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acesse seus contatos"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse seus contatos"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Local"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acesse o local do dispositivo"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse a localização deste dispositivo"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acesse sua agenda"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse sua agenda"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"envie e veja mensagens SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envie e veja mensagens SMS"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Armazenamento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acesse fotos, mídia e arquivos do dispositivo"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse fotos, mídia e arquivos no seu dispositivo"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"grave áudio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; grave áudio"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Câmera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tire fotos e grave vídeos"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tire fotos e grave vídeos"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faça e gerencie chamadas telefônicas"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; faça e gerencie chamadas telefônicas"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acesse dados do sensor sobre seus sinais vitais"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse os dados do sensor sobre seus sinais vitais"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar cont. da janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo da janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
@@ -870,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Texto copiado para a área de transferência."</string>
<string name="more_item_label" msgid="4650918923083320495">"Mais"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espaço"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"excluir"</string>
@@ -1081,21 +1096,14 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Verificar atualizações"</string>
<string name="smv_application" msgid="3307209192155442829">"O app <xliff:g id="APPLICATION">%1$s</xliff:g>, processo <xliff:g id="PROCESS">%2$s</xliff:g>, violou a política StrictMode imposta automaticamente."</string>
<string name="smv_process" msgid="5120397012047462446">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> violou a política StrictMode imposta automaticamente."</string>
- <!-- no translation found for android_upgrading_title (7513829952443484438) -->
- <skip />
- <!-- no translation found for android_upgrading_title (4503169817302593560) -->
- <skip />
- <!-- no translation found for android_upgrading_title (7009520271220804517) -->
- <skip />
- <!-- no translation found for android_start_title (4536778526365907780) -->
- <skip />
- <!-- no translation found for android_start_title (4929837533850340472) -->
- <skip />
- <!-- no translation found for android_start_title (7467484093260449437) -->
- <skip />
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"O smartphone está sendo atualizado…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"O tablet está sendo atualizado…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"O dispositivo está sendo atualizado…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"O smartphone está iniciando…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"O tablet está iniciando…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"O dispositivo está iniciando…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Otimizando o armazenamento."</string>
- <!-- no translation found for android_upgrading_notification_title (1511552415039349062) -->
- <skip />
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Concluindo atualização do sistema…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> está fazendo upgrade…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Otimizando app <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
@@ -1109,7 +1117,8 @@
<string name="new_app_action" msgid="6694851182870774403">"Abrir <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="5894852887817332322">"O app <xliff:g id="OLD_APP">%1$s</xliff:g> será fechado sem salvar"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite de memória"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"O despejo de heap foi coletado. Toque para compartilhar"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Compartilhar despejo de heap?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"O processo <xliff:g id="PROC">%1$s</xliff:g> excedeu seu limite de memória de <xliff:g id="SIZE">%2$s</xliff:g>. Um despejo de heap está disponível para compartilhamento com o desenvolvedor. Tenha cuidado: esse despejo de heap pode conter informações pessoais às quais o aplicativo tem acesso."</string>
<string name="sendText" msgid="5209874571959469142">"Escolha uma ação para o texto"</string>
@@ -1144,13 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectar-se a uma rede Wi‑Fi aberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectar à rede Wi‑Fi da operadora"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectando-se a uma rede Wi‑Fi aberta"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a uma rede Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível conectar-se à rede Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
- <!-- no translation found for wifi_available_action_all_networks (4368435796357931006) -->
- <skip />
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quando você estiver perto de uma rede salva de alta qualidade"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Não ativar novamente"</string>
@@ -1199,7 +1208,7 @@
<string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envia uma grande quantidade de mensagens SMS. Quer permitir que este app continue enviando mensagens?"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"Permitir"</string>
<string name="sms_control_no" msgid="625438561395534982">"Negar"</string>
- <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; deseja enviar uma mensagem para &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; quer enviar uma mensagem para &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
<string name="sms_short_code_details" msgid="5873295990846059400">"Isso "<b>"pode resultar em cobranças"</b>" na conta de seu dispositivo móvel."</string>
<string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"Isso resultará em cobranças na conta de seu dispositivo móvel."</b></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Enviar"</string>
@@ -1235,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB ativado"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB ativado"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB ativado"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modo de acessório USB ativado"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Acessório USB conectado"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toque para ver mais opções."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Carregando dispositivo conectado. Toque para ver mais opções."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detectado"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Toque para desativar a depuração USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecione para desativar a depuração USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Gerando relatório do bug..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Compartilhar relatório do bug?"</string>
@@ -1346,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre ativa conectando..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa conectada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectado da VPN sempre ativa"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro na VPN sempre ativa"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Alterar configurações de VPN ou rede"</string>
<string name="upload_file" msgid="2897957172366730416">"Escolher arquivo"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string>
<string name="reset" msgid="2448168080964209908">"Redefinir"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo carro ativado"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toque para sair do modo carro."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Vínculo ou ponto de acesso ativo"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
@@ -1679,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Excluído pelo seu administrador"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Para ajudar a melhorar a duração da bateria, a Economia de bateria reduz o desempenho do seu dispositivo e limita a vibração, os serviços de localização e a maioria dos dados em segundo plano. E-mails, mensagens e outros apps que dependem da sincronização podem não ser atualizados, a menos que você os abra.\n\nA Economia de bateria é desativada automaticamente quando o dispositivo está sendo carregado."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode significar que as imagens não serão exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1691,9 +1704,9 @@
<item quantity="one">Por %1$d min (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Por %1$d min (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">Por %1$d horas (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Por %1$d horas (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">Por %1$d hora (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Por %1$d horas (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">Por %1$d horas (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1707,8 +1720,8 @@
<item quantity="one">Por %d min</item>
<item quantity="other">Por %d min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">Por %d horas</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">Por %d hora</item>
<item quantity="other">Por %d horas</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
@@ -1730,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Há um problema interno com seu dispositivo. Ele pode ficar instável até que você faça a redefinição para configuração original."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Há um problema interno com seu dispositivo. Entre em contato com o fabricante para saber mais detalhes."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"A solicitação USSD foi modificada para a solicitação DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"A solicitação USSD foi modificada para a solicitação SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"A solicitação USSD foi modificada para a nova solicitação USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"A solicitação USSD foi modificada para a solicitação DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"A solicitação SS foi modificada para a solicitação DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"A solicitação SS foi modificada para a solicitação DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"A solicitação SS foi modificada para a solicitação USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"A solicitação SS foi modificada para a nova solicitação SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Recolher"</string>
@@ -1847,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"App nocivo detectado"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes do app <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Chamadas e notificações farão o dispositivo vibrar"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Chamadas e notificações ficarão silenciadas"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Alterações do sistema"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Não perturbe"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"O modo \"Não perturbe\" está ocultando notificações para ajudar você a se concentrar"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é um novo comportamento. Toque para alterar."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo \"Não perturbe\" foi alterado"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toque para verificar suas configurações de comportamento para interrupções"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toque para verificar o que está bloqueado."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index a3c8087139ad..324b36fbee94 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ID do autor da chamada é predefinido com não restrito. Chamada seguinte: Não restrita"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Serviço não fornecido."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Não pode alterar a definição da identificação de chamadas."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Sem serviço de dados"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Sem chamadas de emergência"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Sem serviço de dados móveis"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Chamadas de emergência indisponíveis"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sem serviço de voz"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente não disponibilizado pela rede móvel na sua localização"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não é possível ligar à rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Para melhorar a receção, experimente alterar o tipo selecionado em Definições &gt; Rede e Internet &gt; Redes móveis &gt; Tipo de rede preferido."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"As chamadas Wi‑Fi estão ativas."</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"As chamadas de emergência necessitam de uma rede móvel."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Sem serviço de voz ou chamadas de emergência"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Serviço temporariamente desativado pelo operador."</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Não é possível estabelecer ligação à rede móvel."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Experimente alterar a rede preferida. Toque para alterar."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Chamadas de emergência indisponíveis"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Não é possível efetuar chamadas de emergência através de Wi‑Fi."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Reencaminhamento de chamadas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de chamada de retorno de emergência"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Faixa de Roaming activada"</string>
<string name="roamingText12" msgid="1189071119992726320">"Faixa de Roaming desativada"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"A procurar Serviço"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chamadas Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para fazer chamadas e enviar mensagens por Wi-Fi, comece por pedir ao seu operador para configurar este serviço. De seguida, nas Definições, ative novamente as Chamadas Wi-Fi. (Código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registar-se junto do seu operador (código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Chamadas por Wi-Fi da %s"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Existem demasiados pedidos em processamento. Tente novamente mais tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Erro de início de sessão de <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronização"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronização"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Demasiadas eliminações de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Não é possível sincronizar"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Tentativa de eliminar demasiados conteúdos do <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"O armazenamento do tablet está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"O armazenamento de visualizações está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"O armazenamento da TV está cheio. Elimine alguns ficheiros para libertar espaço."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Pelo gestor do seu perfil de trabalho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Perfil de trabalho eliminado"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Perfil de trabalho eliminado devido a aplicação de administração em falta"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"A aplicação de administração do perfil de trabalho está em falta ou danificada. Consequentemente, o seu perfil de trabalho e os dados relacionados foram eliminados. Contacte o gestor para obter assistência."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"O seu perfil de trabalho já não está disponível neste dispositivo"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Demasiadas tentativas de introdução da palavra-passe"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"O dispositivo é gerido"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"A sua entidade gere este dispositivo e pode monitorizar o tráfego de rede. Toque para obter mais detalhes."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"O seu dispositivo será apagado"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Não é possível utilizar a aplicação de administração. O seu dispositivo será agora apagado.\n\nSe tiver questões, contacte o gestor da entidade."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Não é possível utilizar a aplicação de administrador. O seu dispositivo será agora apagado.\n\nSe tiver questões, contacte o administrador da entidade."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Impressão desativada por <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Eu"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opções do tablet"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo de avião"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo de voo está ativado"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo de voo está desativado"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Poupança de bateria"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Poupança de bateria DeSATIVADA"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Poupança de bateria ATIVADA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Definições"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. de voz"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Mudar para o perfil de trabalho"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"aceder aos contactos"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda aos seus contactos"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda aos seus contactos?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Localização"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"aceder à localização do seu dispositivo"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda à localização deste dispositivo"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda à localização deste dispositivo?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendário"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"aceder ao calendário"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda ao calendário"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda ao calendário?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar e ver mensagens SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envie e veja mensagens SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envie e veja mensagens SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Armazenamento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"aceder a fotos, multimédia e ficheiros no dispositivo"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda a fotos, multimédia e ficheiros no dispositivo"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda a fotos, multimédia e ficheiros no dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"gravar áudio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; grave áudio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; grave áudio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Câmara"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tirar fotos e gravar vídeos"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tire fotos e grave vídeos"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tire fotos e grave vídeo?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telemóvel"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"fazer e gerir chamadas"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; faça e gira chamadas telefónicas"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; faça e gira chamadas telefónicas?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores de corpo"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"aceder a dados do sensor acerca dos seus sinais vitais"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda aos dados do sensor acerca dos seus sinais vitais"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda aos dados do sensor acerca dos seus sinais vitais?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Obter conteúdo da janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo de uma janela com a qual está a interagir."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar Através do Toque"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Realizar gestos"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"É possível tocar, deslizar rapidamente, juntar os dedos e realizar outros gestos"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestos de impressão digital"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Pode capturar gestos realizados no sensor de impressões digitais do dispositivo."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Pode capturar gestos realizados no sensor de impressões digitais do dispositivo."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desativar ou modificar barra de estado"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite à aplicação desativar a barra de estado ou adicionar e remover ícones do sistema."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ser apresentada na barra de estado"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que a aplicação torne partes de si mesma persistentes na memória. Isto pode limitar a disponibilidade da memória para outras aplicações, tornando o tablet mais lento."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite à aplicação tornar partes de si própria persistentes na memória. Isto pode limitar a memória disponível para outras aplicações, o que torna a TV mais lenta."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permite que a aplicação torne partes de si mesma persistentes na memória. Isto pode limitar a disponibilidade da memória para outras aplicações, tornando o telemóvel mais lento."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"executar serviço em primeiro plano"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Permite que a aplicação utilize serviços em primeiro plano."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"medir espaço de armazenamento da aplicação"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permite à aplicação obter o código, os dados e o tamanhos de cache da mesma"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modificar as definições do sistema"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio através de sequência."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueio através do rosto."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio através de PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Desbloqueio do SIM através de PIN."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Desbloqueio do PUK do SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueio através de palavra-passe."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área da sequência."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslize."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Texto copiado para a área de transferência."</string>
<string name="more_item_label" msgid="4650918923083320495">"Mais"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Função +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espaço"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"introduzir"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"eliminar"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Verificar se existem atualizações"</string>
<string name="smv_application" msgid="3307209192155442829">"A aplicação <xliff:g id="APPLICATION">%1$s</xliff:g> (processo <xliff:g id="PROCESS">%2$s</xliff:g>) violou a política StrictMode auto-imposta."</string>
<string name="smv_process" msgid="5120397012047462446">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> violou a política StrictMode auto-imposta."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"O Android está a ser atualizado..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"O Android está a iniciar…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"O telemóvel está a atualizar…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"O tablet está a atualizar…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"O dispositivo está a atualizar…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"O telemóvel está a iniciar…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"O tablet está a iniciar…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"O dispositivo está a iniciar…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"A otimizar o armazenamento."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"A terminar a atualização do Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Algumas aplicações podem não funcionar corretamente enquanto a atualização não for concluída"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"A concluir a atualização do sistema…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"O <xliff:g id="APPLICATION">%1$s</xliff:g> está a ser atualizado…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"A otimizar a aplicação <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"A preparar o <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"A iniciar aplicações"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"A concluir o arranque."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Toque para regressar ao jogo."</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Selecionar jogo"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Para um melhor desempenho, só pode abrir um destes jogos de cada vez."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Regressar à aplicação <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Abrir a aplicação <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"A aplicação <xliff:g id="OLD_APP">%1$s</xliff:g> vai fechar sem guardar."</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite da memória"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Foi recolhida a captura da área dinâmica para dados. Toque para partilhar."</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Foi recolhida a captura da área dinâmica para dados. Toque para partilhar."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Pretende partilhar a captura da área dinâmica para dados?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"O processo <xliff:g id="PROC">%1$s</xliff:g> excedeu o respetivo limite de memória do processo de <xliff:g id="SIZE">%2$s</xliff:g>. Está disponível uma captura da área dinâmica para dados para partilhar com o respetivo programador. Tenha atenção: esta captura da área dinâmica para dados pode conter algumas das suas informações pessoais a que a aplicação tem acesso."</string>
<string name="sendText" msgid="5209874571959469142">"Escolha uma ação para o texto"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ligar à rede Wi-Fi aberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Estabelecer ligação à rede Wi‑Fi do operador"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"A ligar à rede Wi-Fi aberta…"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ligado à rede Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível ligar à rede Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Ligar"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas as redes"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quando estiver próximo de uma rede de alta qualidade guardada."</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Não reativar"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Ativar o serviço móvel"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Transfira a aplicação do operador para ativar o seu novo SIM."</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Transfira a aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> para ativar o novo SIM."</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Transferir aplicação"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Novo SIM inserido"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Toque para configurar"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"O PTP por USB está ativado"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"A ligação USB via telemóvel está ativada"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"O MIDI através de USB está ativado"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"O modo de acessório USB está ativado"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Acessório USB ligado"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toque para obter mais opções."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"A carregar o dispositivo ligado. Toque para obter mais opções."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detetado"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo ligado não é compatível com este telemóvel. Toque para saber mais."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB ligada"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Toque para desativar a depuração USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecione para desativar a depuração por USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"A criar relatório de erro…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Pretende partilhar o relatório de erro?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"A aplicação <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras aplicações"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"O <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras aplic."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se não pretende que a aplicação <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desligar"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"A preparar o <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"A verificar a presença de erros"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detetado"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"A ligar VPN sempre ativa..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa ligada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desligado da VPN sempre ativada"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro da VPN sempre ativa"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Não é possível estabelecer ligação à VPN sempre ativada"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Alterar as notificações da rede ou da VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Escolher ficheiro"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Não foi selecionado nenhum ficheiro"</string>
<string name="reset" msgid="2448168080964209908">"Repor"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo automóvel ativado"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toque para sair do modo automóvel."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"A aplicação de condução está em execução."</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Toque para sair da aplicação de condução."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Ligação ponto a ponto ou hotspot activos"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"A ligação (à Internet) via telemóvel está desativada."</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Unidade USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alerta de utilização de dados"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Toque para ver a utilização e definições"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Limite de dados 2G/3G atingido"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Limite de dados 4G atingido"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Aviso de dados"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Utilizou <xliff:g id="APP">%s</xliff:g> de dados."</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Limite de dados móveis atingido"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Limite de dados Wi-Fi atingido"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Dados parados no resto do ciclo"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Limite de dados 2G-3G excedido"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Limite de dados 4G excedido"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Limite de dados móveis excedido"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Limite de dados Wi-Fi excedido"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> acima do limite especificado."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Dados em pausa no resto do ciclo."</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Acima do limite de dados móveis"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Acima do limite de dados Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Ultrapassou em <xliff:g id="SIZE">%s</xliff:g> o limite definido."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Dados em seg. plano restringidos"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Toque para remover a restrição."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Elevada utilização de dados"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"A sua utilização de dados ao longo dos últimos dias é superior ao normal. Toque para ver a utilização e as definições."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Utilização elevada de dados móveis"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"As suas aplicações utilizaram mais dados do que o habitual."</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"A aplicação <xliff:g id="APP">%s</xliff:g> utilizou mais dados do que o habitual."</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificado de segurança"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Este certificado é válido."</string>
<string name="issued_to" msgid="454239480274921032">"Emitido para:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu gestor"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu gestor"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado pelo seu gestor"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Para ajudar a melhorar a autonomia da bateria, a Poupança de bateria reduz o desempenho do seu dispositivo e limita a vibração, os serviços de localização e a maioria dos dados em segundo plano. O email, as mensagens e outras aplicações que dependem da sincronização poderão não ser atualizados, exceto se os abrir.\n\nA Poupança de bateria desliga-se automaticamente quando o dispositivo está a carregar."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas aplicações enviem ou recebam dados em segundo plano. Uma determinada aplicação que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar a Poupança de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">Durante %1$d min (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Durante 1 min (até à(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">Durante %1$d horas (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante uma hora (até à(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">Durante 1 hora (até à(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Durante %1$d h (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">Durante %d min</item>
<item quantity="one">Durante 1 min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Durante %d horas</item>
- <item quantity="one">Durante uma hora</item>
+ <item quantity="one">Durante 1 hora</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Durante %d h</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Existe um problema interno no seu dispositivo e pode ficar instável até efetuar uma reposição de dados de fábrica."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Existe um problema interno no seu dispositivo. Contacte o fabricante para obter mais informações."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"O pedido USSD foi modificado para um pedido DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"O pedido USSD foi modificado para um pedido SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"O pedido USSD foi modificado para um novo pedido USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"O pedido USSD foi modificado para um pedido Video DIAL."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"O pedido SS foi modificado para um pedido DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"O pedido SS foi modificado para um pedido Video DIAL."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"O pedido SS foi modificado para um pedido USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"O pedido SS foi modificado para um novo pedido SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Reduzir"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplicação prejudicial detetada"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"A aplicação <xliff:g id="APP_0">%1$s</xliff:g> pretende mostrar partes da aplicação <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"As chamadas e as notificações vibram."</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"É desativado o som das chamadas e das notificações."</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Alterações ao sistema"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Não incomodar"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Para se concentrar, o modo Não incomodar está a ocultar as notificações"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é um comportamento novo. Toque para alterar."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo Não incomodar foi alterado"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toque para verificar se existem interrupções nas suas definições de comportamento."</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toque para verificar o que está bloqueado."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistema"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Definições"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 45512a567b73..338084680c1a 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"O ID do chamador assume o padrão de não restrito. Próxima chamada: Não restrita"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"O serviço não foi habilitado."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Não é possível alterar a configuração de identificação de chamadas."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Sem serviço de dados"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Sem chamada de emergência"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Nenhum serviço móvel de dados"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Chamadas de emergência indisponíveis"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sem serviço de voz"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente bloqueado pela rede móvel no seu local"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Para melhorar a recepção, tente alterar o tipo selecionado em Config. &gt; Rede e Internet &gt; Redes móveis &gt; Tipo de rede preferencial."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"A chamada no Wi‑Fi está ativa"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"As chamadas de emergência exigem uma rede móvel."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nenhum serviço de voz nem chamada de emergência"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Temporariamente desativado pela sua operadora"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Não foi possível acessar a rede móvel"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tente alterar a rede preferencial. Toque para alterar."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Chamadas de emergência indisponíveis"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Não é possível fazer chamadas de emergência por Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner de roaming ativado"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner de roaming desativado"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Pesquisando serviço"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chamadas por Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente a chamada no Wi-Fi nas configurações. Código de erro: <xliff:g id="CODE">%1$s</xliff:g>"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Registre-se junto à sua operadora (Código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s chamada Wi-Fi"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Há muitas solicitações sendo processadas. Tente novamente mais tarde."</string>
<string name="notification_title" msgid="8967710025036163822">"Erro de login para <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronizar"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronizar"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Muitas exclusões de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"O armazenamento do tablet está cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"O armazenamento da TV está cheio. Exclua alguns arquivos para liberar espaço."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Pelo administrador do seu perfil de trabalho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Perfil de trabalho excluído"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Perfil de trabalho excluído devido à ausência de um app para administrador"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"O app para administrador do perfil de trabalho não foi encontrado ou está corrompido. Consequentemente, seu perfil de trabalho e os dados relacionados foram excluídos. Entre em contato com seu administrador para receber assistência."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Seu perfil de trabalho não está mais disponível neste dispositivo"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Muitas tentativas de senha"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"O dispositivo é gerenciado"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Sua organização gerencia este dispositivo e pode monitorar o tráfego de rede. Toque para ver detalhes."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Seu dispositivo será limpo"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Não é possível usar o app para administrador. Seu dispositivo passará por uma limpeza agora.\n\nEm caso de dúvidas, entre em contato com o administrador da sua organização."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Não é possível usar o aplicativo para administrador. Seu dispositivo passará por uma limpeza agora.\n\nEm caso de dúvidas, entre em contato com o administrador da sua organização."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Impressão desativada por <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Eu"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opções do tablet"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avião"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avião ATIVADO"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avião DESATIVADO"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Economia de bateria"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"A Economia de bateria está DESATIVADA"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"A Economia de bateria está ATIVADA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Configurações"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ajuda de voz"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Alternar para o perfil de trabalho"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acesse seus contatos"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse seus contatos"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Local"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acesse o local do dispositivo"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse a localização deste dispositivo"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acesse sua agenda"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse sua agenda"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"envie e veja mensagens SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envie e veja mensagens SMS"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Armazenamento"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acesse fotos, mídia e arquivos do dispositivo"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse fotos, mídia e arquivos no seu dispositivo"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"grave áudio"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; grave áudio"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Câmera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tire fotos e grave vídeos"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tire fotos e grave vídeos"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faça e gerencie chamadas telefônicas"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; faça e gerencie chamadas telefônicas"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acesse dados do sensor sobre seus sinais vitais"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse os dados do sensor sobre seus sinais vitais"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar cont. da janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo da janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Fazer gestos"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Toque, deslize, faça gestos de pinça e faça outros gestos."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gestos de impressão digital"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Pode captar gestos realizados no sensor de impressão digital do dispositivo."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Pode captar gestos realizados no sensor de impressão digital do dispositivo."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desativar ou modificar a barra de status"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite que o app desative a barra de status ou adicione e remova ícones do sistema."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"ser a barra de status"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que o app torne partes de si mesmo persistentes na memória. Pode limitar a memória disponível para outros apps, deixando o tablet mais lento."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite que o app torne partes de si mesmo persistentes na memória. Isso pode limitar a memória disponível para outros apps, deixando a TV mais lenta."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permite que o app torne partes de si mesmo persistentes na memória. Pode limitar a memória disponível para outros apps, deixando o telefone mais lento."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"executar serviço em primeiro plano"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Permite que o app use serviços em primeiro plano."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"medir o espaço de armazenamento do app"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permite que o app recupere o código, os dados e os tamanhos de cache"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modificar configurações do sistema"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio com padrão."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueio facial."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio com PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Desbloqueio com PIN do SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Desbloqueio com PUK do SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueio com senha."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área do padrão."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslize."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Texto copiado para a área de transferência."</string>
<string name="more_item_label" msgid="4650918923083320495">"Mais"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"espaço"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"excluir"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Verificar atualizações"</string>
<string name="smv_application" msgid="3307209192155442829">"O app <xliff:g id="APPLICATION">%1$s</xliff:g>, processo <xliff:g id="PROCESS">%2$s</xliff:g>, violou a política StrictMode imposta automaticamente."</string>
<string name="smv_process" msgid="5120397012047462446">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> violou a política StrictMode imposta automaticamente."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"O Android está sendo atualizado..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"O Android está iniciando..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"O smartphone está sendo atualizado…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"O tablet está sendo atualizado…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"O dispositivo está sendo atualizado…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"O smartphone está iniciando…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"O tablet está iniciando…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"O dispositivo está iniciando…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Otimizando o armazenamento."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Concluindo atualização do Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Alguns apps podem não funcionar corretamente até que a atualização seja concluída"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Concluindo atualização do sistema…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> está fazendo upgrade…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Otimizando app <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Concluindo a inicialização."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Toque para voltar ao jogo"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Escolha o jogo"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Para ter um melhor desempenho, apenas um desses jogos pode ser aberto por vez."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Voltar para o app <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Abrir <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"O app <xliff:g id="OLD_APP">%1$s</xliff:g> será fechado sem salvar"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite de memória"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"O despejo de heap foi coletado. Toque para compartilhar"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Compartilhar despejo de heap?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"O processo <xliff:g id="PROC">%1$s</xliff:g> excedeu seu limite de memória de <xliff:g id="SIZE">%2$s</xliff:g>. Um despejo de heap está disponível para compartilhamento com o desenvolvedor. Tenha cuidado: esse despejo de heap pode conter informações pessoais às quais o aplicativo tem acesso."</string>
<string name="sendText" msgid="5209874571959469142">"Escolha uma ação para o texto"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectar-se a uma rede Wi‑Fi aberta"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectar à rede Wi‑Fi da operadora"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectando-se a uma rede Wi‑Fi aberta"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a uma rede Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível conectar-se à rede Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas as redes"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quando você estiver perto de uma rede salva de alta qualidade"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Não ativar novamente"</string>
@@ -1187,7 +1208,7 @@
<string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envia uma grande quantidade de mensagens SMS. Quer permitir que este app continue enviando mensagens?"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"Permitir"</string>
<string name="sms_control_no" msgid="625438561395534982">"Negar"</string>
- <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; deseja enviar uma mensagem para &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
+ <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; quer enviar uma mensagem para &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
<string name="sms_short_code_details" msgid="5873295990846059400">"Isso "<b>"pode resultar em cobranças"</b>" na conta de seu dispositivo móvel."</string>
<string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"Isso resultará em cobranças na conta de seu dispositivo móvel."</b></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Enviar"</string>
@@ -1204,6 +1225,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Ativar serviço móvel"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Faça o download do app da operadora para ativar seu novo SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Faça o download do app <xliff:g id="APP_NAME">%1$s</xliff:g> para ativar seu novo SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Fazer download do app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Novo SIM inserido"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Toque para configurar"</string>
@@ -1222,13 +1244,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB ativado"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB ativado"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB ativado"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modo de acessório USB ativado"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Acessório USB conectado"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toque para ver mais opções."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Carregando dispositivo conectado. Toque para ver mais opções."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detectado"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Toque para desativar a depuração USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Toque para desativar a depuração USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selecione para desativar a depuração USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Gerando relatório do bug..."</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Compartilhar relatório do bug?"</string>
@@ -1247,7 +1269,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se você não deseja que o <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desativar"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Procurando erros"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detectado"</string>
@@ -1333,14 +1355,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre ativa conectando..."</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa conectada"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Desconectado da VPN sempre ativa"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro na VPN sempre ativa"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Alterar configurações de VPN ou rede"</string>
<string name="upload_file" msgid="2897957172366730416">"Escolher arquivo"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string>
<string name="reset" msgid="2448168080964209908">"Redefinir"</string>
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Modo carro ativado"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toque para sair do modo carro."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Vínculo ou ponto de acesso ativo"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toque para configurar."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tethering desativado"</string>
@@ -1418,22 +1443,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Drive USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alerta de uso de dados"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Toque para ver uso e config."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Limite de dados 2G-3G atingido"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Limite de dados 4G atingido"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Aviso de dados"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Você usou <xliff:g id="APP">%s</xliff:g> de dados"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Limite de dados móveis atingido"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Limite de dados Wi-Fi atingido"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Dados pausados no resto do ciclo"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Limite de dados 2G-3G excedido"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Limite de dados 4G excedido"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Limite de dados do celular excedido"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Limite de dados Wi-Fi excedido"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> acima do limite especificado."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Uso de dados pausado pelo restante do seu ciclo"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Acima do limite de dados móveis"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Acima do limite de dados Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Você ultrapassou <xliff:g id="SIZE">%s</xliff:g> do limite definido"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Dados de segundo plano restritos"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Toque para remover a restrição."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Uso de dados excessivo"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Seu uso de dados nos últimos dias é maior que o normal. Toque para ver o uso e as configurações."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Alto uso de dados móveis"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Seus apps usaram mais dados do que o normal"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"O app <xliff:g id="APP">%s</xliff:g> usou mais dados do que o normal"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificado de segurança"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Este certificado é válido."</string>
<string name="issued_to" msgid="454239480274921032">"Emitido para:"</string>
@@ -1669,7 +1691,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Excluído pelo seu administrador"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Para ajudar a melhorar a duração da bateria, a Economia de bateria reduz o desempenho do seu dispositivo e limita a vibração, os serviços de localização e a maioria dos dados em segundo plano. E-mails, mensagens e outros apps que dependem da sincronização podem não ser atualizados, a menos que você os abra.\n\nA Economia de bateria é desativada automaticamente quando o dispositivo está sendo carregado."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode significar que as imagens não serão exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
@@ -1681,9 +1704,9 @@
<item quantity="one">Por %1$d min (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Por %1$d min (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">Por %1$d horas (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Por %1$d horas (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">Por %1$d hora (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="other">Por %1$d horas (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">Por %1$d horas (até <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,8 +1720,8 @@
<item quantity="one">Por %d min</item>
<item quantity="other">Por %d min</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">Por %d horas</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">Por %d hora</item>
<item quantity="other">Por %d horas</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
@@ -1720,14 +1743,22 @@
<string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Há um problema interno com seu dispositivo. Ele pode ficar instável até que você faça a redefinição para configuração original."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Há um problema interno com seu dispositivo. Entre em contato com o fabricante para saber mais detalhes."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"A solicitação USSD foi modificada para a solicitação DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"A solicitação USSD foi modificada para a solicitação SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"A solicitação USSD foi modificada para a nova solicitação USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"A solicitação USSD foi modificada para a solicitação DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"A solicitação SS foi modificada para a solicitação DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"A solicitação SS foi modificada para a solicitação DIAL de vídeo."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"A solicitação SS foi modificada para a solicitação USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"A solicitação SS foi modificada para a nova solicitação SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Recolher"</string>
@@ -1837,7 +1868,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"App nocivo detectado"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes do app <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Chamadas e notificações farão o dispositivo vibrar"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Chamadas e notificações ficarão silenciadas"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Alterações do sistema"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Não perturbe"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"O modo \"Não perturbe\" está ocultando notificações para ajudar você a se concentrar"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Este é um novo comportamento. Toque para alterar."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo \"Não perturbe\" foi alterado"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toque para verificar suas configurações de comportamento para interrupções"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Toque para verificar o que está bloqueado."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 0e25356c2617..33bcb11fecb1 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -78,15 +78,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ID-ul apelantului este nerestricționat în mod prestabilit. Apelul următor: nerestricționat"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Nu se asigură accesul la acest serviciu."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Nu puteți să modificați setarea pentru ID-ul apelantului."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Fără serviciu de date"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Fără apeluri de urgență"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Fără serviciu de date mobile"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Apelurile de urgență nu sunt disponibile"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Fără servicii vocale"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Fără servicii vocale/de urgență"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Momentan nu este oferit de rețeaua mobilă în locația dvs."</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nu se poate stabili conexiunea la rețea"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Pentru o recepție mai bună, încercați să schimbați tipul selectat în Setări &gt; Rețea și internet &gt; Rețele mobile &gt; Tip preferat de rețea."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Apelarea prin Wi-Fi este activă"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Apelurile de urgență necesită o rețea mobilă."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Fără servicii de voce sau apeluri de urgență"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Dezactivat temporar de operator"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Nu se poate stabili conexiunea la rețeaua mobilă"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Încercați să schimbați rețeaua preferată. Atingeți pentru a schimba."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Apelurile de urgență nu sunt disponibile"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Nu puteți efectua apeluri de urgență prin Wi-Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerte"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Redirecționarea apelurilor"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod de apelare inversă de urgență"</string>
@@ -121,13 +121,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Banner roaming activat"</string>
<string name="roamingText12" msgid="1189071119992726320">"Banner roaming dezactivat"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Se caută serviciul"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Apelare prin Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Pentru a efectua apeluri și a trimite mesaje prin Wi-Fi, mai întâi solicitați configurarea acestui serviciu la operator. Apoi, activați din nou apelarea prin Wi-Fi din Setări. (Cod de eroare: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Înregistrați-vă la operator (cod de eroare: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Apelare prin Wi-Fi %s"</item>
@@ -161,8 +160,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Există prea multe solicitări în curs de procesare. Încercați din nou mai târziu."</string>
<string name="notification_title" msgid="8967710025036163822">"Eroare de conectare pentru <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sincronizare"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sincronizare"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Prea multe ștergeri <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Nu se poate sincroniza"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Ați încercat să ștergeți prea multe <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Stocarea pe tabletă este plină. Ștergeți câteva fișiere pentru a elibera spațiu."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Spațiul de stocare de pe ceas este plin! Ștergeți câteva fișiere pentru a elibera spațiu."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Spațiul de stocare al televizorului este plin. Ștergeți câteva fișiere pentru a elibera spațiu."</string>
@@ -176,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"De administratorul profilului dvs. de serviciu"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"De <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profilul de serviciu a fost șters"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profilul de serviciu a fost șters, deoarece aplicația de administrare lipsește"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Aplicația de administrare a profilului de serviciu lipsește sau este deteriorată. Prin urmare, profilul de serviciu și datele asociate au fost șterse. Pentru asistență, contactați administratorul."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Profilul de serviciu nu mai este disponibil pe acest dispozitiv"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Prea multe încercări de introducere a parolei"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Dispozitivul este gestionat"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Organizația dvs. gestionează acest dispozitiv și poate monitoriza traficul în rețea. Atingeți pentru mai multe detalii."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Datele de pe dispozitiv vor fi șterse"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Aplicația de administrare nu poate fi utilizată. Dispozitivul va fi șters.\n\nDacă aveți întrebări, contactați administratorul organizației dvs."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Aplicația de administrare nu poate fi utilizată. Dispozitivul va fi șters.\n\nDacă aveți întrebări, contactați administratorul organizației dvs."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Printare dezactivată de <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Eu"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opțiuni tablet PC"</string>
@@ -239,6 +237,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mod Avion"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modul Avion este ACTIVAT"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modul avion este DEZACTIVAT"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Economisirea energiei"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Economisirea bateriei este dezactivată"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Economisirea bateriei este activată"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Setări"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistență"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistent vocal"</string>
@@ -272,31 +273,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Comutați la profilul de serviciu"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Persoane de contact"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceseze persoanele de contact"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze agenda"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze agenda?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Locație"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceseze locația acestui dispozitiv"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze locația acestui dispozitiv"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze locația acestui dispozitiv?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceseze calendarul"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze calendarul"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze calendarul?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"trimită și să vadă mesajele SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să trimită și să vadă mesajele SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să trimită și să vadă mesajele SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Stocare"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"acceseze fotografiile, conținutul media și fișierele de pe dispozitiv"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze fotografiile, conținutul media și fișierele de pe dispozitiv"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze fotografiile, conținutul media și fișierele de pe dispozitiv?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"înregistreze sunet"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Pemiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să înregistreze conținut audio"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Pemiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să înregistreze conținut audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera foto"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografieze și să înregistreze videoclipuri"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să facă fotografii și să înregistreze videoclipuri"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să facă fotografii și să înregistreze videoclipuri?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"inițieze și să gestioneze apeluri telefonice"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să inițieze și să gestioneze apeluri telefonice"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să inițieze și să gestioneze apeluri telefonice?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Senzori corporali"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceseze datele de la senzori despre semnele vitale"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze datele de la senzori despre semnele vitale"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze datele de la senzori despre semnele dvs. vitale?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperează conținutul ferestrei"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspectează conținutul unei ferestre cu care interacționați."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activează funcția Explorați prin atingere"</string>
@@ -308,7 +309,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Folosiți gesturi"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Se poate atinge, glisa, ciupi și se pot folosi alte gesturi."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gesturi ce implică amprente"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Poate reda gesturile făcute pe senzorul de amprentă al dispozitivelor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Poate reda gesturile făcute pe senzorul de amprentă al dispozitivului."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"dezactivare sau modificare bare de stare"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Permite aplicației să dezactiveze bara de stare sau să adauge și să elimine pictograme de sistem."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"să fie bara de stare"</string>
@@ -359,6 +360,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite aplicației să declare persistente în memorie anumite părți ale sale. Acest lucru poate limita memoria disponibilă pentru alte aplicații și poate încetini funcționarea tabletei."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permite aplicației să declare persistente în memorie anumite părți ale sale. Acest lucru poate limita memoria disponibilă pentru alte aplicații și poate încetini funcționarea televizorului."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permite aplicației să declare persistente în memorie anumite părți ale sale. Acest lucru poate limita memoria disponibilă pentru alte aplicații și poate încetini funcționarea telefonului."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"să ruleze serviciul în prim plan"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Permite aplicației să utilizeze serviciile din prim-plan."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"măsurare spațiu de stocare al aplicației"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permite aplicației să preia dimensiunile codului, ale datelor și ale memoriei cache"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modifică setări de sistem"</string>
@@ -805,6 +808,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Deblocare cu model."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Deblocare facială."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Deblocare cu PIN."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Deblocare PIN pentru cardul SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Deblocare PUK pentru cardul SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Deblocare cu parolă."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zonă model."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zonă glisare."</string>
@@ -866,6 +871,12 @@
<string name="text_copied" msgid="4985729524670131385">"Text copiat în clipboard."</string>
<string name="more_item_label" msgid="4650918923083320495">"Mai multe"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Meniu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Funcție+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"spațiu"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1094,31 +1105,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Căutați actualizări"</string>
<string name="smv_application" msgid="3307209192155442829">"Aplicația <xliff:g id="APPLICATION">%1$s</xliff:g> (procesul <xliff:g id="PROCESS">%2$s</xliff:g>) a încălcat propria politică StrictMode."</string>
<string name="smv_process" msgid="5120397012047462446">"Procesul <xliff:g id="PROCESS">%1$s</xliff:g> a încălcat propria politică StrictMode."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android trece la o versiune superioară..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android pornește..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Se actualizează telefonul.…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Se actualizează tableta…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Se actualizează dispozitivul.…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Pornește telefonul…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Pornește tableta…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Pornește dispozitivul…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Se optimizează stocarea."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Se finalizează actualizarea Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Este posibil ca unele aplicații să nu funcționeze corespunzător până când nu se finalizează upgrade-ul"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Se finalizează actualizarea sistemului…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"Se face upgrade pentru <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Se optimizează aplicația <xliff:g id="NUMBER_0">%1$d</xliff:g> din <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Se pregătește <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Se pornesc aplicațiile."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Se finalizează pornirea."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Rulează <xliff:g id="APP">%1$s</xliff:g>"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Atingeți pentru a reveni la joc"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Alegeți jocul"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Pentru o performanță mai bună, se poate deschide un singur joc odată."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Reveniți la <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Deschideți <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> se va închide fără să salveze"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a depășit limita de memorie"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Datele privind memoria au fost culese; atingeți pentru a trimite"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Datele privind memoria au fost culese. Atingeți pentru a trimite."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Trimiteți datele privind memoria?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Procesul <xliff:g id="PROC">%1$s</xliff:g> și-a depășit limita de memorie de <xliff:g id="SIZE">%2$s</xliff:g>. Sunt disponibile datele privind memoria, pe care le puteți trimite dezvoltatorului. Atenție: aceste date privind memoria pot conține informațiile personale la care aplicația are acces."</string>
<string name="sendText" msgid="5209874571959469142">"Alegeți o acțiune pentru text"</string>
@@ -1155,12 +1163,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectați-vă la o rețea Wi‑Fi deschisă"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectați-vă la rețeaua Wi-Fi a operatorului"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Se stabilește conexiunea la o rețea Wi‑Fi deschisă"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"S-a realizat conexiunea la rețeaua Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nu s-a putut stabili conexiunea la rețeaua Wi-Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Atingeți pentru a vedea toate rețelele"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectați-vă"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Toate rețelele"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Toate rețelele"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi se va activa automat"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Când vă aflați lângă o rețea salvată, de înaltă calitate"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Nu reactivați"</string>
@@ -1226,6 +1235,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Reporniți"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activați serviciul mobil"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descărcați aplicația operatorului pentru a vă activa noul card SIM"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Descărcați aplicația <xliff:g id="APP_NAME">%1$s</xliff:g> pentru a vă activa noul card SIM"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descărcați aplicația"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"S-a introdus un card SIM nou"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Atingeți pentru a-l configura"</string>
@@ -1244,13 +1254,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP prin USB este activat"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Tetheringul prin USB este activat"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI prin USB este activat"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modul Accesoriu USB este activat"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Accesoriu USB conectat"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Atingeți pentru mai multe opțiuni."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Se încarcă dispozitivul conectat. Atingeți pentru mai multe opțiuni."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"S-a detectat un accesoriu audio analogic"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Dispozitivul atașat nu este compatibil cu acest telefon. Atingeți pentru a afla mai multe."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Remedierea erorilor prin USB este conectată"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Atingeți ca să dezactivați remedierea erorilor prin USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Atingeți pentru a dezactiva remedierea erorilor prin USB."</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Selectați pentru a dezactiva remedierea erorilor prin USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Se creează un raport de eroare…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Trimiteți raportul de eroare?"</string>
@@ -1269,7 +1279,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> se afișează peste alte aplicații"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se afișează peste aplicații"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Dacă nu doriți ca <xliff:g id="NAME">%s</xliff:g> să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEZACTIVAȚI"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Dezactivați"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Se pregătește <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Se verifică dacă există erori"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"A fost detectat un nou <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1355,14 +1365,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Se efectuează conectarea la rețeaua VPN activată permanent…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Conectat(ă) la rețeaua VPN activată permanent"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Deconectat de la rețeaua VPN activată permanent"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Eroare de rețea VPN activată permanent"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Nu s-a putut conecta la rețeaua VPN activată permanent"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Modificați setările de rețea sau VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Alegeți un fișier"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Nu au fost găsite fișiere"</string>
<string name="reset" msgid="2448168080964209908">"Resetați"</string>
<string name="submit" msgid="1602335572089911941">"Trimiteți"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mod Mașină activat"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Atingeți ca să ieșiți din modul Mașină."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Aplicația pentru condus rulează"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Atingeți ca să ieșiți din aplicația pentru condus."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Tethering sau hotspot activ"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Atingeți ca să configurați."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Tetheringul este dezactivat"</string>
@@ -1441,22 +1451,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Unitate USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Dsipozitiv de stocare USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Editați"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Alertă pentru utilizarea datelor"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Atingeți ca să vedeți utilizarea/setările."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Ați atins limita de date 2G-3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Ați atins limita de date 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Avertisment pentru date"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Ați folosit <xliff:g id="APP">%s</xliff:g> din date"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"S-a atins limita de date mobile"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Ați atins limita de date Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"S-au întrerupt datele pentru restul ciclului"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"S-a depășit limita de date 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"S-a depășit limita de date 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"S-a depășit limit. date mobile"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"S-a depășit limita de date Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> peste limita specificată."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Datele au fost întrerupte pentru restul ciclului"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Peste limita de date mobile"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Peste limita de date Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Ați depășit limita stabilită cu <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Datele de fundal restricționate"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Atingeți ca să eliminați restricția."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Utilizare mare a datelor"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Utilizarea datelor în ultimele zile este mai mare decât în mod normal. Atingeți pentru a vedea utilizarea și setările."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Utilizare mare de date mobile"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Aplicațiile dvs. au utilizat mai multe date decât de obicei"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> a utilizat mai multe date decât de obicei"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificat de securitate"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Certificatul este valid."</string>
<string name="issued_to" msgid="454239480274921032">"Emis către:"</string>
@@ -1694,7 +1701,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalat de administratorul dvs."</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizat de administratorul dvs."</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Șters de administratorul dvs."</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Pentru a îmbunătăți autonomia bateriei, economisirea bateriei reduce performanțele dispozitivului și limitează vibrațiile, serviciile de localizare și majoritatea datelor de fundal. Este posibil ca e-mailurile, mesageria și alte aplicații care depind de sincronizare să nu se actualizeze dacă nu le deschideți.\n\nEconomisirea bateriei se dezactivează automat când dispozitivul se încarcă."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosiți poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingeți."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Activați Economizorul de date?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activați"</string>
@@ -1708,7 +1716,7 @@
<item quantity="other">Pentru %1$d min. (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Pentru 1 min. (până la <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="few">Timp de %1$d ore (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Timp de %1$d de ore (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Timp de o oră (până la <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
@@ -1728,7 +1736,7 @@
<item quantity="other">Pentru %d min.</item>
<item quantity="one">Pentru 1 min.</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="few">Timp de %d ore</item>
<item quantity="other">Timp de %d de ore</item>
<item quantity="one">Timp de o oră</item>
@@ -1753,14 +1761,22 @@
<string name="muted_by" msgid="6147073845094180001">"Dezactivate de <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"A apărut o problemă internă pe dispozitiv, iar acesta poate fi instabil până la revenirea la setările din fabrică."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"A apărut o problemă internă pe dispozitiv. Pentru detalii, contactați producătorul."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Solicitarea USSD este modificată într-o solicitare DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Solicitarea USSD este modificată într-o solicitare SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Solicitarea USSD este modificată într-o nouă solicitare USSD."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Solicitarea USSD este modificată într-o solicitare DIAL video."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Solicitarea SS este modificată într-o solicitare DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Solicitarea SS este modificată într-o solicitare DIAL video."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Solicitarea SS este modificată într-o solicitare USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Solicitarea SS este modificată într-o nouă solicitare SS."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil de serviciu"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Extindeți"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Restrângeți"</string>
@@ -1872,7 +1888,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplicație dăunătoare detectată"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vrea să afișeze porțiuni din <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editați"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Apelurile și notificările vor vibra"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Apelurile și notificările vor avea sunetul dezactivat"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Modificări de sistem"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Nu deranja"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Funcția Nu deranja ascunde notificările pentru a vă ajuta să vă concentrați"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Acesta este un comportament nou. Atingeți pentru a schimba."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Funcția Nu deranja s-a schimbat"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Atingeți pentru a verifica setările de comportament pentru întreruperi"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Atingeți pentru a verifica ce este blocat."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Sistem"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Setări"</string>
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 7106d9ddc778..2a6c5047054f 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"අමතන්නාගේ ID සුපුරුදු අනුව සීමා වී නැත. මීළඟ ඇමතුම: සීමා කර ඇත"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"සේවාවන් සපයා නැත."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"අමතන්නාගේ ID සැකසීම ඔබට වෙනස්කල නොහැක."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"දත්ත සේවාව නැත"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"හදිසි ඇමතුම් නැත"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"ජංගම දත්ත සේවාව නැත"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"හදිසි ඇමතුම් ලබා ගත නොහැකිය"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"හඬ සේවාව නැත"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"හඬ/හදිසි සේවාව නොමැත"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"ඔබේ ස්ථානයේ ජංගම ජාලය මගින් තාවකාලිකව පිරිනොනමයි"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ජාලය වෙත ළඟා විය නොහැකිය"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"ප්‍රතිග්‍රහණය වැඩි දියුණු කිරීමට, සැකසීම් &gt; ජාලය සහ අන්තර්ජාලය &gt; ජංගම ජාල &gt; වඩා කැමති ජාල වර්ගය තුළ තෝරන ලද වර්ගය වෙනස් කිරීම උත්සාහ කරන්න."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi ඇමතීම සක්‍රියයි"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"හදිසි ඇමතුම්වලට ජංගම ජාලයක් අවශ්‍යයි"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"හඬ සේවා හෝ හදිසි ඇමතුම් නොමැත"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"ඔබේ වාහකය විසින් තාවකාලිකව ක්‍රියාවිරහිත කරන ලදී"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ජංගම ජාලය වෙත ළඟා විය නොහැකිය"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"කැමති ජාලය වෙනස් කිරීමට උත්සාහ කරන්න. වෙනස් කිරීමට තට්ටු කරන්න."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"හදිසි ඇමතුම් ලබා ගත නොහැකිය"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi-Fi හරහා හදිසි ඇමතුම් ලබා ගත නොහැකිය"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ඇඟවීම්"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ඇමතුම ප්‍රතියොමු කිරීම"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"හදිසි අවස්ථා පසු ඇමතුම් ප්‍රකාරය"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"රෝමිං බැනරය සක්‍රීයයි"</string>
<string name="roamingText12" msgid="1189071119992726320">"රෝමිං බැනරය අක්‍රියයි"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"සේවාව සඳහා සොයමින්"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi ඇමතීම"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi හරහා ඇමතුම් සිදු කිරීමට සහ පණිවිඩ යැවීමට, පළමුව මෙම සේවාව පිහිටුවන ලෙස ඔබේ වාහකයෙන් ඉල්ලන්න. අනතුරුව සැකසීම් වෙතින් Wi-Fi ඇමතුම නැවත ක්‍රියාත්මක කරන්න. (දෝෂ කේතය <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"ඔබගේ වාහකය සමඟ ලියාපදිංචි වන්න (දෝෂ කේතය: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi අමතමින්"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"ඉල්ලීම් විශාල ප්‍රමාණයක් ක්‍රියාත්මක වෙමින් පවතියි. පසුව නැවත උත්සාහ කරන්න."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> සඳහා පුරනය වීමේ දෝෂයක්"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"සමමුහුර්ත කිරීම"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"සමමුහුර්ත කරන්න"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> මැකීම් වැඩිය"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"සමමුහුර්ත කළ නොහැකිය"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"ඉතා වැඩි <xliff:g id="CONTENT_TYPE">%s</xliff:g> මැකීමට උත්සාහ කරන ලදී."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ටැබ්ලට් ආචයනය පිරි ඇත. ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ඔරලෝසුවේ ආචනයනය පිරී ඇත. ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"රූපවාහිනී ගබඩාව පිරී ඇත. අවකාශය හිස් කිරීමට තව ගොනු මකා දමන්න."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"ඔබේ කාර්යාල පැතිකඩ පරිපාලක මඟින්"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> වෙතින්"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"කාර්යාල පැතිකඩ මකා දමන ලදි"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"පරිපාලක යෙදුමක් නොමැති වීමෙන් කාර්යාල පැතිකඩ මකා දමන ලදි"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"කාර්යාල පැතිකඩ පාලක යෙදුම නොමැති හෝ දූෂණය වී ඇත. ප්‍රතිඵලයක් ලෙස ඔබගේ කාර්යාල පැතිකඩ සහ අදාළ දත්ත මකා දමා ඇත. සහය සඳහා ඔබගේ පරිපාලකයා සම්බන්ධ කර ගන්න."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"ඔබේ කාර්යාල පැතිකඩ මෙම උපාංගය මත තවදුරටත් ලබා ගැනීමට නොහැකිය"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"මුරපද උත්සාහ කිරීම් ඉතා වැඩි ගණනකි"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"උපාංගය කළමනාකරණය කෙරේ"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"ඔබගේ ආයතනය මෙම උපාංගය කළමනාකරණය කරන අතර එය ජාල තදබදය නිරීක්ෂණය කළ හැක. විස්තර සඳහා තට්ටු කරන්න."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"ඔබගේ උපාංගය මකා දැමෙනු ඇත"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"පරිපාලක යෙදුම භාවිතා කළ නොහැක. ඔබගේ උපාංගය දැන් මකා දමනු ඇත.\n\nඔබට ප්‍රශ්න තිබේ නම්, ඔබගේ සංවිධානයේ පරිපාලකව අමතන්න."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"පරිපාලක යෙදුම භාවිතා කළ නොහැකිය. ඔබේ උපාංගය දැන් මකා දමනු ඇත.\n\nඔබට ප්‍රශ්න තිබේ නම්, ඔබේ සංවිධානයේ පරිපාලකට අමතන්න."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> විසින් මුද්‍රණය කිරීම අබල කර ඇත."</string>
<string name="me" msgid="6545696007631404292">"මම"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ටැබ්ලට විකල්ප"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"අහස්යානා ආකාරය"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"අහස්යානා ආකාරය සක්‍රීයයි."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"අහස්යානා අකාරය අක්‍රියයි"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"බැටරි සුරැකුම"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"බැටරි සුරැකුම ක්‍රියාවිරහිතයි"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"බැටරි සුරැකුම ක්‍රියාත්මකයි"</string>
<string name="global_action_settings" msgid="1756531602592545966">"සැකසීම්"</string>
<string name="global_action_assist" msgid="3892832961594295030">"සහාය දීම"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"හඬ සහායක"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"කාර්යාල පැතිකඩ වෙත මාරු වන්න"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"සම්බන්ධතා"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"ඔබේ සම්බන්ධතාවලට පිවිසෙන්න"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; වෙත ඔබගේ සබඳතා ප්‍රවේශ කිරීමට අවසර දෙන්න"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත ඔබගේ සබඳතා වෙත ප්‍රවේශ වීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ස්ථානය"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"මෙම උපාංගයේ ස්ථානයට ප්‍රවේශ කරන්න"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; වෙත මෙම උපාංගයේ ස්ථානය ලබා ගැනීමට අවසර දෙන්න"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත මෙම උපාංගයේ ස්ථානය ලබා ගැනීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"දින දර්ශනය"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ඔබේ දින දර්ශනයට පිවිසෙන්න"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; වෙත ඔබගේ දින දර්ශනය ප්‍රවේශ කිරීමට අවසර දෙන්න"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත ඔබගේ දින දර්ශනය ප්‍රවේශ කිරීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"කෙටි පණිවිඩ"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS පණිවිඩ යැවීම සහ බැලීම"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; වෙත SMS පණිවිඩ යැවීමට සහ බැලීමට අවසර දෙන්න"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත SMS පණිවිඩ යැවීමට සහ බැලීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ආචයනය"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"ඔබේ උපාංගයේ ඇති ඡායාරූප, මාධ්‍ය සහ ගොනුවලට පිවිසීම"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; වෙත ඔබගේ උපාංගය තුළ ඇති ඡායාරූප, මාධ්‍ය, සහ ගොනු ප්‍රවේශ කිරීමට අවසර දෙන්න"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත ඔබගේ උපාංගය තුළ ඇති ඡායාරූප, මාධ්‍ය, සහ ගොනු වෙත ප්‍රවේශ වීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"මයික්‍රොෆෝනය"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ශ්‍රව්‍ය පටිගත කරන්න"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; වෙත ශබ්දය පටි ගත කිරීමට අවසර දෙන්න"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත ශබ්දය පටි ගත කිරීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"කැමරාව"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"පින්තූර ගැනීම සහ වීඩියෝ පටිගත කිරීම"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; වෙත පින්තූර සහ වීඩියෝ ගැනීමට අවසර දෙන්න"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත පින්තූර සහ වීඩියෝ ගැනීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"දුරකථනය"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"දුරකථන ඇමතුම් සිදු කිරීම සහ කළමනාකරණය කිරීම"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; වෙත දුරකථන ඇමතුම් ලබා ගැනීමට සහ කළමනාකරණය කිරීමට අවසර දෙන්න"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත දුරකථන ඇමතුම් ලබා ගැනීමට සහ කළමනාකරණය කිරීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ශරීර සංවේදක"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ඔබේ ජෛව ලක්ෂණ පිළිබඳ සංවේදක දත්ත වෙත පිවිසෙන්න"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; වෙත ඔබගේ ජෛව ලක්ෂණ පිළිබඳ සංවේදක දත්ත ප්‍රවේශ කිරීමට අවසර දෙන්න"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත ඔබගේ ජෛව ලක්ෂණ පිළිබඳ සංවේදක දත්ත වෙත ප්‍රවේශ වීමට ඉඩ දෙන්නද?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"කවුළු අන්න්තර්ගතය ලබාගන්න"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ඔබ අන්තර්ක්‍රියාකාරී වන කවුළුවේ අන්තර්ගතය පරීක්ෂා කරන්න."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ස්පර්ශයෙන් ගවේෂණය සක්‍රිය කරන්න"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"අභින සිදු කරන්න"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"තට්ටු කිරීමට, ස්වයිප් කිරීමට, පින්ච් කිරීමට, සහ වෙනත් අභින සිදු කිරීමට හැකිය."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ඇඟිලි සලකුණු ඉංගිත"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"උපාංග ඇඟිලි සලකුණු සංවේදකය මත සිදු කරන ඉංගිත ග්‍රහණය කළ හැකිය."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"උපාංගයෙහි ඇඟිලි සලකුණු සංවේදකය මත සිදු කරන ඉංගිත ග්‍රහණය කළ හැකිය."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"තත්ව තීරුව අබල කරන්න හෝ වෙනස් කරන්න"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"තත්ව තීරුව අක්‍රිය කිරීමට හෝ පද්ධති නිරූපක එකතු හෝ ඉවත් කිරීමට යෙදුමට අවසර දේ."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"තත්ත්ව තීරුව බවට පත්වීම"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"මතකයේ පවතින එහි කොටස් නොනැසී පැවතීමට යෙදුමට අවසර දෙන්න. වෙනත් යෙදුම් වලට මතකය සීමා කිරීමෙන් ටැබ්ලටය පමා කිරීම මගින් මෙමගින් කළ හැක."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"යෙදුමේ කොටසක් මතකය තුළ එයට ස්ථාවර තබාගැනීමට යෙදුමට ඉඩ දෙන්න. මෙය වෙනත් යෙදුම් වලට තිබෙන මතකය සීමා කරයි සහ රූපවාහිනිය මන්දගාමී කරයි."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"යෙදුමට තම කොටස් මතකය තුල නොබිඳීව රඳා පවත්වාගෙන යාමට අවසර දෙන්න. මෙය දුරකථනය මන්දගාමී කරමින් අනෙකුත් උපාංගයන් සඳහා ඉතිරි මතකය සීමා කිරීමට හැක."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"පෙරබිම් සේවාව ධාවනය කරන්න"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"පෙරබිම් සේවා භාවිත කිරීමට යෙදුමට ඉඩ දෙයි."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"යෙදුම් ආචයනයේ ඉඩ ප්‍රමාණය මැනීම"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"යෙදුමකට එහි කේතය, දත්ත සහ හැඹිලි ප්‍රමාණ ලබාගැනීමට අවසර දෙන්න."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"පද්ධති සැකසීම් වෙනස් කිරීම"</string>
@@ -804,6 +807,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"රටා අගුළු ඇරීම."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"මුහුණ භාවිතයෙන් අඟුළු හැරීම."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN අගුළු ඇරීම."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Sim Pin අගුලු දැමීම."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Sim Puk අගුලු දැමීම."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"මුරපද අගුළු ඇරීම."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"රටා ප්‍රදේශය."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"සර්පණ ප්‍රදේශය."</string>
@@ -865,6 +870,12 @@
<string name="text_copied" msgid="4985729524670131385">"පෙළ පසුරු පුවරුවට පිටපත් කරන ලදි."</string>
<string name="more_item_label" msgid="4650918923083320495">"තව"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"මෙනුව+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"ඇතුල් කරන්න"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"මකන්න"</string>
@@ -1076,31 +1087,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"යාවත්කාලීන සඳහා පරික්ෂා කරන්න"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> යෙදුම (<xliff:g id="PROCESS">%2$s</xliff:g> ක්‍රියාවලිය) එහි StrictMode කොන්දේසිය උල්ලංඝනය කර ඇත."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> ක්‍රියාවලිය එහි StrictMode කොන්දේසිය උල්ලංඝනය කර ඇත."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android උත්ශ්‍රේණි වෙමින් පවතී..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android ආරම්භ කරමින්…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"දුරකථනය යාවත්කාලීන කරමින්..."</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ටැබ්ලට් පරිගණකය යාවත්කාලීන කරමින්..."</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"උපාංගය යාවත්කාලීන කරමින්..."</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"දුරකථනය ආරම්භ කරමින්…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ටැබ්ලට් පරිගණකය ආරම්භ කරමින්…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"උපාංගය ආරම්භ කරමින්…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"ආචයනය ප්‍රශස්තිකරණය කිරීම."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android යාවත්කාලීනය අවසන් කරමින්…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"උත්ශ්‍රේණි කිරීම අවසන් වන තෙක් සමහර යෙදුම් නිසි ලෙස ක්‍රියා නොකළ හැකිය"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"පද්ධති යාවත්කාලීනය අවසන් කරමින්…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> උත්ශ්‍රේණි කරමින්…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> කින් <xliff:g id="NUMBER_0">%1$d</xliff:g> වැනි යෙදුම ප්‍රශස්ත කරමින්."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> සූදානම් කරමින්."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"යෙදුම් ආරම්භ කරමින්."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ඇරඹුම අවසාන කරමින්."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ධාවනය වෙමින්"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"ක්‍රීඩාව වෙත ආපසු යාමට තට්ටු කරන්න"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"ක්‍රීඩාව තෝරන්න"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"වඩාත් හොඳ ක්‍රියාකාරීත්වයකට, වරකට මෙම ක්‍රීඩා එකක් පමණක් විවෘත කළ හැකිය."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> වෙත අාපසු යන්න"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> විවෘත කරන්න"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"සුරැකීමෙන් තොරව <xliff:g id="OLD_APP">%1$s</xliff:g> වැසෙනු ඇත"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> මතකයේ සීමාව ඉක්මවා ඇත"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ඉවත දැමීම් ගොඩ රැස් කර ඇත. බෙදා ගැනීමට තට්ටු කරන්න"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"ඉවත දැමීම් ගොඩ රැස් කරන ලදී. බෙදා ගැනීමට තට්ටු කරන්න"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"සංච නික්ෂේපය බෙදාගන්න ද?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> ක්‍රියාවලිය එහි ක්‍රියාවලියේ <xliff:g id="SIZE">%2$s</xliff:g> මතකය ඉක්මවා ඇත. ඔබට එහි වර්ධකයන් සමග බෙදාගැනීමට සංච නික්ෂේපයක් ඇත. ප්‍රවේසම් වන්න: මෙම යෙදුම පිවිසිය හැකි ඔබගේ පෞද්ගලික තොරතුරු මෙම සංච නික්ෂේපයෙහි අඩංගු වී තිබිය හැකිය."</string>
<string name="sendText" msgid="5209874571959469142">"පෙළ සඳහා ක්‍රියාව තෝරන්න"</string>
@@ -1135,12 +1143,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"විවෘත Wi-Fi ජාලය වෙත සම්බන්ධ වෙන්න"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"වාහක Wi-Fi ජාලයට සම්බන්ධ වන්න"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"විවෘත Wi-Fi ජාලය වෙත සම්බන්ධ වෙමින්"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi-Fi ජාලයක් වෙත සම්බන්ධ විය"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi ජාලයක් වෙත සම්බන්ධ විය නොහැකි විය"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"සියලු ජාල බැලීමට තට්ටු කරන්න"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"සම්බන්ධ කරන්න"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"සියලු ජාල"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"සියලු ජාල"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ස්වයංක්‍රියව ක්‍රියාත්මක වනු ඇත"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ඔබ උසස් තත්ත්වයේ සුරැකි ජාලයක් අවට සිටින විට"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"නැවත ක්‍රියාත්මක නොකරන්න"</string>
@@ -1206,6 +1215,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"යළි අරඹන්න"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ජංගම සේවාව සක්‍රිය කරන්න"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ඔබගේ නව SIM කාඩ්පත සක්‍රිය කිරීමට වාහක යෙදුම බාගන්න"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"ඔබේ නව SIM එක භාවිත කිරීමට <xliff:g id="APP_NAME">%1$s</xliff:g> යෙදුම බාගන්න"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"යෙදුම බාගන්න"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"නව SIM ඇතුළු කරන්න"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"එය පිහිටුවීමට තට්ටු කරන්න"</string>
@@ -1224,13 +1234,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB හරහා PTP ක්‍රියාත්මකයි"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ටෙදරින් ක්‍රියාත්මකයි"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB හරහා MIDI ක්‍රියාත්මකයි"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB උපාංග ප්‍රකාරය ක්‍රියාත්මකයි"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB උපාංගය සම්බන්ධ කර ඇත"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"තවත් විකල්ප සඳහා තට්ටු කරන්න."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"සම්බන්ධිත උපාංගය ආරෝපණය කරමින්. තවත් විකල්ප සඳහා තට්ටු කරන්න."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ප්‍රතිසම ශ්‍රව්‍ය උපාංගය අනාවරණය කර ගන්නා ලදී"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"මෙම දුරකථනය සමඟ සම්බන්ධිත උපාංගය නොගැළපෙයි. තව දැන ගැනීමට තට්ටු කරන්න."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB නිදොස්කරණය සම්බන්ධිතයි"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB නිදොස්කරණය අබල කිරීමට තට්ටු කරන්න."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB නිදොස් කිරීම ක්‍රියාවිරහිත කිරීමට තට්ටු කරන්න"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB නිදොස්කරණය අබල කිරීමට තෝරන්න."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"දෝෂ වාර්තාවක් ගනිමින්…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"දෝෂ වාර්තාව බෙදා ගන්නද?"</string>
@@ -1249,7 +1259,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> සංදර්ශනය කරමින්"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> දිස් වේ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ඔබට <xliff:g id="NAME">%s</xliff:g> මෙම විශේෂාංගය භාවිත කිරීමට අවශ්‍ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්‍රියාවිරහිත කරන්න."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ක්‍රියා විරහිත කරන්න"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ක්‍රියාවිරහිත කරන්න"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> සූදානම් කරමින්"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"වැරදි සඳහා පරීක්ෂා කරමින්"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"නව <xliff:g id="NAME">%s</xliff:g> අනාවරණය කරන ලදි"</string>
@@ -1335,14 +1345,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"සැමවිටම VPN සම්බන්ධ වෙමින්…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"නිරතුරුවම VPN සම්බන්ධ කර ඇත"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"සැම විට ක්‍රියාත්මක VPN වෙතින් විසන්ධි විය"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"සැමවිට සක්‍රිය VPN දෝෂය"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"සැම විට ක්‍රියාත්මක VPN වෙත සම්බන්ධ විය නොහැකිය"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"ජාලය හෝ VPN සැකසීම් වෙනස් කරන්න"</string>
<string name="upload_file" msgid="2897957172366730416">"ගොනුව තෝරන්න"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ගොනුවක් තෝරාගෙන නැත"</string>
<string name="reset" msgid="2448168080964209908">"යළි පිහිටුවන්න"</string>
<string name="submit" msgid="1602335572089911941">"යොමු කරන්න"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"මෝටර් රථ ආකාරය සබල කර ඇත"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"මෝටර් රථ ප්‍රකාරයෙන් ඉවත් වීමට තට්ටු කරන්න."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"රියදුරු යෙදුම ධාවනය වේ."</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"රියදුරු යෙදුමෙන් පිටවීම සඳහා තට්ටු කරන්න."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ටෙදරින් හෝ හොට්ස්පොට් සක්‍රීයයි"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"පිහිටුවීමට තට්ටු කරන්න."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ටෙදරින් අබල කර ඇත"</string>
@@ -1420,22 +1430,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB ධාවකය"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB ආචයනය"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"සංස්කරණය"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"දත්ත භාවිතය ගැන ඇඟවීම"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"භාවිතය සහ සැකසීම් බැලීමට තට්ටු කරන්න."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G දත්ත සීමාවට ළඟාවී ඇත"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G දත්ත සීමාවට ළඟාවී ඇත"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"දත්ත අනතුරු ඇඟවීම"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"ඔබ දත්ත <xliff:g id="APP">%s</xliff:g> භාවිත කර ඇත"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"ජංගම දත්ත සීමාවට ළඟාවී ඇත"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi දත්ත සීමාවට ළඟාවී ඇත"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"විරාම චක්‍රය සඳහා දත්ත විරාමය කරන ලදි"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G දත්ත සීමාව ඉක්මවන ලදි"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G දත්ත සීමාව ඉක්මවා යන ලදි"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"ජංගම දත්ත සීමාව ඉක්මවා යන ලදි"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi දත්ත සීමාව ඉක්මවා යන ලදි"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"සඳහන් කළ සීමාවට වඩා <xliff:g id="SIZE">%s</xliff:g> වැඩිය."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"ඔබේ චක්‍රයේ ඉතිරි කාලය සඳහා දත්ත විිරාම කරන ලදී"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"ජංගම දත්ත සීමාව ඉක්මවා ඇත"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"ඔබේ Wi-Fi දත්ත සීමාව ඉක්මවා ඇත"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"ඔබේ සැකසූ සීමාවට වඩා <xliff:g id="SIZE">%s</xliff:g> ක් ඉක්මවා ඇත"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"පසුබිම් දත්ත සිමා කරන ලදි"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"සීමා කිරීම ඉවත් කිරීමට තට්ටු කරන්න."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"විශාල දත්ත භාවිතය"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"පසුගිය දින කිහිපය පුරා ඔබගේ දත්ත භාවිතය සාමාන්‍යයට වඩා වැඩිය. භාවිතය සහ සැකසීම් බැලීම සඳහා තට්ටු කරන්න."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ඉහළ ජංගම දත්ත භාවිතය"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"යෙදුම සාමාන්‍ය ප්‍රමාණයට වඩා වැඩිපුර දත්ත භාවිත කර ඇත"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> සාමාන්‍ය ප්‍රමාණයට වඩා වැඩිපුර දත්ත භාවිත කර ඇත"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"ආරක්‍ෂිත සහතිකය"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"මෙම සහතිකය වලංගුයි."</string>
<string name="issued_to" msgid="454239480274921032">"ලබාදුන්නේ:"</string>
@@ -1671,7 +1678,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ඔබගේ පරිපාලක මඟින් ස්ථාපනය කර ඇත"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"ඔබගේ පරිපාලක මඟින් යාවත්කාලීන කර ඇත"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ඔබගේ පරිපාලක මඟින් මකා දමා ඇත"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"බැටරි ආයු කාලය වැඩිදියුණු කිරීමට උදවු කිරීමට, බැටරි සුරැකුම ඔබේ උපාංගයේ ක්‍රියාකාරීත්වය අඩුකරන අතර කම්පනය, පිහිටීම් සේවා, සහ බොහෝමයක් පසුබිම් දත්ත සීමා කරයි. ඔබ ඒවා විවෘත නොකරන්නේ නම් මිස ඊ-තැපැල්, පණිවිඩකරණය, සහ සමමුහුර්ත කිරීම මත රඳා පවතින වෙනත් යෙදුම් යාවත්කාලීන නොවිය හැකිය.\n\nඔබේ උපාංගය ආරෝපණය වන විට බැටරි සුරැකුම ස්වයංක්‍රියව ක්‍රියාත්මක වේ."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"දත්ත භාවිතය අඩු කිරීමට උදවු වීමට, දත්ත සුරැකුම සමහර යෙදුම් පසුබිමින් දත්ත යැවීම සහ ලබා ගැනීම වළක්වයි. ඔබ දැනට භාවිත කරන යෙදුමකට දත්ත වෙත පිවිසීමට හැකිය, නමුත් එසේ කරන්නේ කලාතුරකින් විය හැකිය. මෙයින් අදහස් වන්නේ, උදාහරණයක් ලෙස, එම රූප ඔබ ඒවාට තට්ටු කරන තෙක් සංදර්ශනය නොවන බවය."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"දත්ත සුරැකුම ක්‍රියාත්මක කරන්නද?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ක්‍රියාත්මක කරන්න"</string>
@@ -1683,9 +1691,9 @@
<item quantity="one">විනාඩි %1$d ක් සඳහා (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> තෙක්)</item>
<item quantity="other">විනාඩි %1$d ක් සඳහා (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> තෙක්)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="one">පැය %1$d ක් සඳහා (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> තෙක්)</item>
- <item quantity="other">පැය %1$d ක් සඳහා (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> තෙක්)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="one">පැය 1ක් සඳහාr (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> තෙක්)</item>
+ <item quantity="other">පැය 1ක් සඳහාr (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> තෙක්)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="one">පැය %1$d ක් සඳහා (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> තෙක්)</item>
@@ -1699,9 +1707,9 @@
<item quantity="one">විනාඩි %d ක් සඳහා</item>
<item quantity="other">විනාඩි %d ක් සඳහා</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="one">පැය %d ක් සඳහා</item>
- <item quantity="other">පැය %d ක් සඳහා</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="one">පැය %dක් සඳහා</item>
+ <item quantity="other">පැය %dක් සඳහා</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="one">පැය %d ක් සඳහා</item>
@@ -1722,14 +1730,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> විසින් නිශ්ශබ්ද කරන ලදි"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"ඔබේ උපාංගය සමගින් ගැටලුවක් ඇති අතර, ඔබේ කර්මාන්තශාලා දත්ත යළි සකසන තෙක් එය අස්ථායි විය හැකිය."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"ඔබේ උපාංගය සමගින් අභ්‍යන්තර ගැටලුවක් ඇත. විස්තර සඳහා ඔබේ නිෂ්පාදක අමතන්න."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD ඉල්ලීම DIAL ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD ඉල්ලීම SS ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD ඉල්ලීම නව USSD ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD ඉල්ලීම Video DIAL ඉල්ලීම ලෙස වෙනස් කර ඇත."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS ඉල්ලීම DIAL ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS ඉල්ලීම Video DIAL ඉල්ලීම ලෙස වෙනස් කර ඇත."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ඉල්ලීම USSD ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ඉල්ලීම නව DIAL ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"කාර්යාල පැතිකඩ"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"දිග හරින්න"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"හකුළන්න"</string>
@@ -1839,7 +1855,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"හානිකර යෙදුමක් අනාවරණය කර ගන්නා ලදී"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> හට කොටස් <xliff:g id="APP_2">%2$s</xliff:g>ක් පෙන්වීමට අවශ්‍යයි"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"සංස්කරණය"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"ඇමතුම් සහ දැනුම්දීම් කම්පනය වනු ඇත"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"ඇමතුම් සහ දැනුම්දීම් නිහඬ වනු ඇත"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"පද්ධති වෙනස් කිරීම්"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"බාධා නොකරන්න"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"බාධා නොකරන්න ඔබට අවධානය යොමු කිරීමට උදවු කිරීම සඳහා දැනුම් දීම් සඟවමින්"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"මෙය නව හැසිරීමකි. වෙනස් කිරීමට තට්ටු කරන්න."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"බාධා නොකරන්න වෙනස් කර ඇත"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"බාධා කිරීම් සඳහා ඔබේ හැසිරීම් සැකසීම් පරීක්ෂා කිරීමට තට්ටු කරන්න"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"අවහිර කර ඇති දේ පරීක්ෂා කිරීමට තට්ටු කරන්න."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"පද්ධතිය"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"සැකසීම්"</string>
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index e251ca411b18..d8d474d12200 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"அழைப்பாளர் ஐடி ஆனது வரையறுக்கப்படவில்லை என்பதற்கு இயல்பாக அமைக்கப்பட்டது. அடுத்த அழைப்பு: வரையறுக்கப்படவில்லை"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"சேவை ஒதுக்கப்படவில்லை."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"அழைப்பாளர் ஐடி அமைப்பை மாற்ற முடியாது."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"தரவுச் சேவை இல்லை"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"அவசர அழைப்பு வசதி இல்லை"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"மொபைல் டேட்டா சேவையைப் பயன்படுத்த முடியாது"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"அவசர அழைப்பைச் செய்ய முடியாது"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"குரல் சேவை இல்லை"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"குரல்/அவசரச் சேவை இல்லை"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"தற்காலிகமாக உங்கள் இருப்பிடத்தில் மொபைல் நெட்வொர்க் வழங்கவில்லை"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"இணைய இணைப்பை நன்றாகக் கிடைப்பதற்கு, அமைப்புகள் &gt; நெட்வொர்க் &amp; இண்டர்நெட் &gt; மொபைல் நெட்வொர்க்குகள் &gt; முன்னுரிமை நெட்வொர்க் வகை என்பதற்குச் சென்று, தேர்ந்தெடுத்த வகையை மாற்றவும்."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"வைஃபை அழைப்பு இயக்கத்தில் உள்ளது"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"அவசர அழைப்புகளுக்கு, மொபைல் நெட்வொர்க் தேவை."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"குரல் சேவையைப் பயன்படுத்த முடியாது அல்லது அவசர அழைப்பைச் செய்ய முடியாது"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"உங்கள் மொபைல் நிறுவனம் தற்காலிகமாக ஆஃப் செய்துள்ளது"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"மொபைல் நெட்வொர்க் கிடைக்கவில்லை"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"விருப்ப நெட்வொர்க்கை மாற்றவும். மாற்ற, தட்டவும்."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"அவசர அழைப்பைச் செய்ய முடியாது"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"வைஃபை மூலம் அவசர அழைப்புகளைச் செய்ய முடியாது"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"விழிப்பூட்டல்கள்"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"அழைப்புப் பகிர்வு"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"அவசரகாலத் திரும்ப அழைக்கும் பயன்முறை"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"ரோமிங் பேனர் இயக்கத்தில் உள்ளது"</string>
<string name="roamingText12" msgid="1189071119992726320">"ரோமிங் பேனர் முடக்கப்பட்டது"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"சேவையைத் தேடுகிறது"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"வைஃபை அழைப்பு"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"வைஃபை மூலம் அழைக்கவும் செய்திகளை அனுப்பவும், முதலில் தொலைத்தொடர்பு நிறுவனத்திடம் இந்தச் சேவையை அமைக்குமாறு கேட்கவும். பிறகு அமைப்புகளில் மீண்டும் வைஃபை அழைப்பை இயக்கவும். (பிழைக் குறியீடு <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"உங்கள் தொலைத்தொடர்பு நிறுவனத்தில் பதிவுசெய்யவும் (பிழைக் குறியீடு: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s வைஃபை அழைப்பு"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"மிக அதிகமான கோரிக்கைகள் செயல்படுத்தப்படுகின்றன. பிறகு முயற்சிக்கவும்."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> க்கான உள்நுழைவு பிழை"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ஒத்திசை"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ஒத்திசை"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"அதிகப்படியான <xliff:g id="CONTENT_TYPE">%s</xliff:g> நீக்கங்கள்."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"டேப்லெட் சேமிப்பிடம் நிரம்பியது. இடத்தைக் காலியாக்க சில கோப்புகளை அழிக்கவும்."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"வாட்ச் சேமிப்பிடம் நிரம்பியது. இடத்தைக் காலியாக்க சில கோப்புகளை நீக்கவும்."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"டிவி சேமிப்பகம் நிரம்பியது. இடத்தை உருவாக்க, சில கோப்புகளை நீக்கவும்."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"உங்கள் பணி விவர நிர்வாகி கண்காணிக்கிறார்"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> இன் படி"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"பணி சுயவிவரம் நீக்கப்பட்டது"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"நிர்வாகிப் பயன்பாடு இல்லாததால், பணி விவரம் நீக்கப்பட்டது"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"பணி விவர நிர்வாகிப் பயன்பாடு இல்லை அல்லது அது சிதைந்துள்ளது. இதன் விளைவாக, உங்கள் பணி விவரமும் அதனுடன் தொடர்புடைய தரவும் நீக்கப்பட்டன. உதவிக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"இந்தச் சாதனத்தில் இனி பணி விவரம் கிடைக்காது"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"கடவுச்சொல்லை அதிக முறை தவறாக முயற்சித்துவிட்டீர்கள்"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"சாதனம் நிர்வகிக்கப்படுகிறது"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"உங்கள் நிறுவனம் இந்தச் சாதனத்தை நிர்வகிக்கும், அத்துடன் அது நெட்வொர்க் ட்ராஃபிக்கைக் கண்காணிக்கலாம். விவரங்களுக்கு, தட்டவும்."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"சாதனத் தரவு அழிக்கப்படும்"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"நிர்வாகிப் பயன்பாட்டைப் பயன்படுத்த முடியாது. இப்போது உங்கள் சாதனம் அழிக்கப்படும்.\n\nஏதேனும் கேள்விகள் இருப்பின், உங்கள் நிறுவனத்தின் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"நிர்வாகிப் பயன்பாட்டை உபயோகிக்க முடியாது. இப்போது, உங்கள் சாதனம் ஆரம்ப நிலைக்கு மீட்டமைக்கப்படும்.\n\nஏதேனும் கேள்விகள் இருப்பின், உங்கள் நிறுவனத்தின் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"பிரிண்ட் செய்வதை <xliff:g id="OWNER_APP">%s</xliff:g> தடுத்துள்ளது."</string>
<string name="me" msgid="6545696007631404292">"நான்"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"டேப்லெட் விருப்பங்கள்"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"விமானப் பயன்முறை"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"விமானப் பயன்முறை இயக்கத்தில் உள்ளது"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"விமானப் பயன்முறை முடக்கத்தில் உள்ளது"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"பேட்டரி சேமிப்பான்"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"பேட்டரி சேமிப்பான் ஆஃப் செய்யப்பட்டுள்ளது"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டுள்ளது"</string>
<string name="global_action_settings" msgid="1756531602592545966">"அமைப்பு"</string>
<string name="global_action_assist" msgid="3892832961594295030">"உதவி"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"குரல் உதவி"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"பணிச் சுயவிவரத்திற்கு மாற்றவும்"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"தொடர்புகள்"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"தொடர்புகளை அணுக வேண்டும்"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"தொடர்புகளை அணுக, &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;க்கு அனுமதி வழங்கவும்"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"இருப்பிடம்"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"இந்தச் சாதனத்தின் இருப்பிடத்தை அறிந்து கொள்ளலாம்"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"இந்தச் சாதனத்தின் இருபிடத்தை அணுக, &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;க்கு அனுமதி வழங்கவும்"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"கேலெண்டர்"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"கேலெண்டரை அணுகலாம்"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"கேலெண்டரை அணுக, &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;க்கு அனுமதி வழங்கவும்"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS அனுப்பலாம், வந்த SMSகளைப் பார்க்கலாம்"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"SMS செய்திகளை அனுப்பவும், அவற்றைப் பார்க்கவும், &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;க்கு அனுமதி வழங்கவும்"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"சேமிப்பிடம்"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"உங்கள் சாதனத்தில் உள்ள படங்கள், மீடியா மற்றும் கோப்புகளை அணுக வேண்டும்"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"சாதனத்தில் உள்ள படங்கள், மீடியா, கோப்புகள் ஆகியவற்றை அணுக, &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;க்கு அனுமதி வழங்கவும்"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"மைக்ரோஃபோன்"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ஒலிப் பதிவு செய்யலாம்"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"ஆடியோவைப் பதிவுசெய்ய, &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;க்கு அனுமதி வழங்கவும்"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"கேமரா"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"படங்கள் மற்றும் வீடியோக்கள் எடுக்கலாம்"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"படங்களை எடுக்கவும் வீடியோவைப் பதிவுசெய்யவும், &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;க்கு அணுகல் வழங்கவும்"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"ஃபோன்"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"யாரையும் தொலைபேசியில் அழைக்கலாம்"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"மொபைல் அழைப்புகளைச் செய்யவும், அவற்றை நிர்வகிக்கவும், &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;க்கு அனுமதி வழங்கவா"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"உடல் சென்சார்கள்"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"உங்கள் உடல் இயக்கம் பற்றி உணர்விகள் கூறும் தகவலைப் பார்க்கலாம்"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"உடலியக்கக் குறிகள் பற்றிய உணர்வித் தரவை அணுக, &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;க்கு அனுமதி வழங்கவும்"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"சாளர உள்ளடக்கத்தைப் பெறும்"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"நீங்கள் பணியாற்றி கொண்டிருக்கும் சாளரத்தின் உள்ளடக்கத்தைப் பார்க்கலாம்."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"தொடுவதன் மூலம் அறிவதை இயக்கும்"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"சைகைகளைச் செயல்படுத்துதல்"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"தட்டலாம், ஸ்வைப் செய்யலாம், பின்ச் செய்யலாம் மற்றும் பிற சைகைகளைச் செயல்படுத்தலாம்."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"கைரேகை சைகைகள்"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"சாதனத்தின் கைரேகை சென்சார் மேல் செய்யப்படும் சைகைகளைப் படமெடுக்க முடியும்."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"சாதனத்தின் கைரேகை உணர்விமேல் செய்யப்படும் சைகைகளைக் கேப்ட்சர் செய்ய முடியும்."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"நிலைப் பட்டியை முடக்குதல் அல்லது மாற்றுதல்"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"நிலைப் பட்டியை முடக்க அல்லது முறைமையில் ஐகான்களைச் சேர்க்க மற்றும் அகற்ற பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"நிலைப் பட்டியில் இருக்கும்"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"நினைவகத்தில் நிலையாக இருக்கும் தன்னுடைய பகுதிகளை உருவாக்கப் பயன்பாட்டை அனுமதிக்கிறது. இதனால பிற பயன்பாடுகளுக்குக் கிடைக்கும் நினைவகம் வரையறுக்கப்பட்டு, டேப்லெட்டின் வேகத்தைக் குறைக்கலாம்."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"பயன்பாடு தனது உள்ளடக்கத்தை நினைவகத்தில் தொடர்ந்து வைத்திருக்க, அனுமதிக்கிறது. பிற பயன்பாடுகளுக்கென இருக்கும் நினைவகத்தை இது கட்டுப்படுத்தி, டிவியின் செயல்திறனைக் குறைக்கலாம்."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"நினைவகத்தில் நிலையாக இருக்கும் தன்னுடைய பகுதிகளை உருவாக்கப் பயன்பாட்டை அனுமதிக்கிறது. இதனால பிற பயன்பாடுகளுக்குக் கிடைக்கும் நினைவகம் வரையறுக்கப்பட்டு, மொபைலின் வேகத்தைக் குறைக்கலாம்"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"முன்புலத்தில் இயங்கும் சேவையை இயக்குதல்"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"முன்புலத்தில் இயங்கும் சேவைகளை உபயோகிக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"பயன்பாட்டுச் சேமிப்பு இடத்தை அளவிடல்"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"பயன்பாடு, அதன் குறியீடு, தரவு, மற்றும் தற்காலிகச் சேமிப்பு அளவுகளை மீட்டெடுக்க அனுமதிக்கிறது"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"சாதன அமைப்புகளை மாற்றுதல்"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"வடிவம் மூலம் திறத்தல்."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"முகத்தால் திறத்தல்."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin மூலம் திறத்தல்."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"சிம்மைத் திறக்கும் பின்."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"சிம்மைத் திறக்கும் Puk."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"கடவுச்சொல் மூலம் திறத்தல்."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"வடிவப் பகுதி."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ஸ்லைடு பகுதி."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"உரை கிளிப்போர்டிற்கு நகலெடுக்கப்பட்டது."</string>
<string name="more_item_label" msgid="4650918923083320495">"மேலும்"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"மெனு+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"மெட்டா மற்றும்"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"கண்ட்ரோல் மற்றும்"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"ஆல்ட் மற்றும்"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"ஷிஃப்ட் மற்றும்"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"சிம்பல் மற்றும்"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"ஃபங்ஷன் மற்றும்"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"இடைவெளி"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"உள்ளிடு"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"நீக்கு"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"புதுப்பிப்பு உள்ளதா எனப் பார்"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> பயன்பாடு (செயல்முறை <xliff:g id="PROCESS">%2$s</xliff:g>), தனது சுய-செயலாக்க StrictMode கொள்கையை மீறியது."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> செயல்முறை, தனது சுய-செயலாக்க StrictMode கொள்கையை மீறியது."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android மேம்படுத்தப்படுகிறது…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android துவங்குகிறது..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"மொபைல் புதுப்பிக்கப்படுகிறது…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"டேப்லெட் புதுப்பிக்கப்படுகிறது…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"சாதனம் புதுப்பிக்கப்படுகிறது…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"மொபைல் தொடங்குகிறது…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"டேப்லெட் தொடங்குகிறது…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"சாதனம் தொடங்குகிறது…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"சேமிப்பகத்தை உகந்ததாக்குகிறது."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android புதுப்பிப்பை நிறைவுசெய்கிறது…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"மேம்படுத்துவது முடியும் வரை, சில பயன்பாடுகள் சரியாக வேலைசெய்யாமல் போகக்கூடும்"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"சிஸ்டம் புதுப்பிப்பை நிறைவுசெய்கிறது…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g>ஐ மேம்படுத்துகிறது…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g> பயன்பாட்டை ஒருங்கிணைக்கிறது."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g>ஐத் தயார்செய்கிறது."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"பயன்பாடுகள் தொடங்கப்படுகின்றன."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"துவக்குதலை முடிக்கிறது."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> இயங்குகிறது"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"கேமிற்குச் செல்ல, தட்டவும்"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"கேமைத் தேர்வுசெய்க"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"சிறந்த செயல்திறனுக்காக, இந்த கேம்களில் ஏதேனும் ஒன்றை மட்டுமே ஒரு நேரத்தில் திறக்கவும்."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> பயன்பாட்டிற்குச் செல்"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> பயன்பாட்டைத் திற"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"சேமிக்கப்படாமலேயே <xliff:g id="OLD_APP">%1$s</xliff:g> மூடப்படும்"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"நினைவக வரம்பை <xliff:g id="PROC">%1$s</xliff:g> மீறியது"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ஹீப் டம்ப் சேகரிக்கப்பட்டது; பகிர, தட்டவும்"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"ஹீப் டம்பைப் பகிரவா?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="SIZE">%2$s</xliff:g> அளவான தனது செயலாக்க நினைவக வரம்பை <xliff:g id="PROC">%1$s</xliff:g> செயலாக்கம் மீறியது. உங்களுக்கான ஹீப் டம்பினை அதன் டெவெலப்பருடன் பகிரலாம். கவனம்: பயன்பாடு அணுகும் விதத்தில், உங்களைப் பற்றிய எந்தத் தனிப்பட்ட தகவலும் இந்த ஹீப் டம்பில் இருக்கலாம் என்பதை நினைவில்கொள்ளவும்."</string>
<string name="sendText" msgid="5209874571959469142">"உரைக்கான செயலைத் தேர்வுசெய்யவும்"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"திறந்த வைஃபை நெட்வொர்க்குடன் இணைக்கவும்"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"தொலைத்தொடர்பு சேவை வழங்கும் நிறுவனத்தின் வைஃபை நெட்வொர்க்குடன் இணைக்கிறது"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"திறந்த வைஃபை நெட்வொர்க்குடன் இணைக்கிறது"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"வைஃபை நெட்வொர்க்குடன் இணைக்கப்பட்டது"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"வைஃபை நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"எல்லா நெட்வொர்க்குகளையும் பார்க்க, தட்டவும்"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"இணை"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"எல்லா நெட்வொர்க்குகளும்"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"எல்லா நெட்வொர்க்குகளும்"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"வைஃபை தானாக ஆன் ஆகும்"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"சேமித்த, உயர்தர நெட்வொர்க்கிற்கு அருகில் இருக்கும்போது"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"மீண்டும் ஆன் செய்யாதே"</string>
@@ -1204,7 +1225,8 @@
<string name="sim_added_message" msgid="6599945301141050216">"மொபைல் நெட்வொர்க்கை அணுக உங்கள் சாதனத்தை மறுதொடக்கம் செய்யவும்."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"மீண்டும் தொடங்கு"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"மொபைல் சேவையை இயக்கு"</string>
- <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"உங்கள் புதிய சிம்மை இயக்க, தொலைத்தொடர்பு நிறுவனத்தின் பயன்பாட்டைப் பதிவிறக்கவும்"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"உங்கள் புதிய சிம்மை இயக்க, மொபைல் நிறுவனத்தின் பயன்பாட்டைப் பதிவிறக்கவும்"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"உங்கள் புதிய சிம்மை இயக்க, <xliff:g id="APP_NAME">%1$s</xliff:g> பயன்பாட்டைப் பதிவிறக்கவும்"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"பயன்பாட்டைப் பதிவிறக்கு"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"புதிய சிம் செருகப்பட்டது"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"அமைக்க, தட்டவும்"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB மூலமாக PTP பயன்முறை ஆன் செய்யப்பட்டது"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB இணைப்பு முறை ஆன் செய்யப்பட்டது"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB மூலமாக MIDI பயன்முறை ஆன் செய்யப்பட்டது"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB கருவிப் பயன்முறை ஆன் செய்யப்பட்டுள்ளது"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB துணைக்கருவி இணைக்கப்பட்டது"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"மேலும் விருப்பங்களுக்கு, தட்டவும்."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"இணைக்கப்பட்ட சாதனத்தைச் சார்ஜ் செய்கிறது. கூடுதல் விருப்பங்களுக்கு, தட்டவும்."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"அனலாக் ஆடியோ துணைக்கருவி கண்டறியப்பட்டது"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"இணைத்துள்ள சாதனமானது இந்த மொபைலுடன் இணங்கவில்லை. மேலும் அறிய, தட்டவும்."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB பிழைத் திருத்தம் இணைக்கப்பட்டது"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB பிழைத் திருத்தத்தை முடக்க, தட்டவும்."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB பிழைத் திருத்தத்தை ஆஃப் செய்ய, தட்டவும்"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB பிழைத்திருத்தத்தை முடக்க, தேர்ந்தெடுக்கவும்."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"பிழை அறிக்கையை எடுக்கிறது…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"பிழை அறிக்கையைப் பகிரவா?"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> பிற பயன்பாடுகளின் மீது தோன்றுகிறது"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> பிற ஆப்ஸின் மீது தோன்றுகிறது"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"முடக்கு"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ஆஃப் செய்"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> தயாராகிறது"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"பிழைகள் உள்ளதா எனப் பார்க்கிறது"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"புதிய <xliff:g id="NAME">%s</xliff:g> கண்டறியப்பட்டது"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"எப்போதும் இயங்கும் VPN உடன் இணைக்கிறது…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"எப்போதும் இயங்கும் VPN இணைக்கப்பட்டது"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"எப்போதும் இயக்கத்தில் இருக்கும்படி அமைத்த VPN இலிருந்து துண்டிக்கப்பட்டது"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"எப்போதும் இயங்கும் VPN பிழை"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"நெட்வொர்க் அல்லது VPN அமைப்புகளை மாற்றவும்"</string>
<string name="upload_file" msgid="2897957172366730416">"கோப்பைத் தேர்வுசெய்"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"எந்தக் கோப்பும் தேர்வுசெய்யப்படவில்லை"</string>
<string name="reset" msgid="2448168080964209908">"மீட்டமை"</string>
<string name="submit" msgid="1602335572089911941">"சமர்ப்பி"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"கார் பயன்முறை இயக்கப்பட்டது"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"கார் பயன்முறையிலிருந்து வெளியேற, தட்டவும்."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"டெதெரிங்/ஹாட்ஸ்பாட் இயங்குகிறது"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"அமைக்க, தட்டவும்."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"இணைப்பு முறை முடக்கப்பட்டுள்ளது"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB டிரைவ்"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB சேமிப்பிடம்"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"திருத்து"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"தரவுப் பயன்பாடு குறித்த எச்சரிக்கை"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"தரவு உபயோகம், அமைப்புகளைப் பார்க்க, தட்டவும்."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G தரவு வரம்பைக் கடந்தது"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G தரவு வரம்பைக் கடந்தது"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"டேட்டா உபயோக எச்சரிக்கை"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> டேட்டா பயன்படுத்தியுள்ளீர்கள்"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"மொபைல் டேட்டா வரம்பை அடைந்தது"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"வைஃபை தரவு வரம்பைக் கடந்தது"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"மீதமுள்ள சுழற்சிக்கு தரவு இடைநிறுத்தப்பட்டது"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G தரவு வரம்பு கடந்தது"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G தரவு வரம்பு கடந்தது"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"மொபைல் டேட்டா வரம்பு கடந்தது"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"வைஃபை தரவு வரம்பு கடந்தது"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"குறிப்பிட்ட வரம்பைவிட <xliff:g id="SIZE">%s</xliff:g> கூடுதல்."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"உங்கள் பில்லிங் சுழற்சியில் மீதமுள்ள நாட்களுக்கு டேட்டா நிறுத்திவைக்கப்பட்டுள்ளது"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"டேட்டா உபயோகம்: வரம்பைவிட அதிகம்"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"வைஃபை உபயோகம் வரம்பைவிட அதிகம்"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"நீங்கள் அமைத்த வரம்பைவிட <xliff:g id="SIZE">%s</xliff:g> அதிகமாகப் பயன்படுத்தியுள்ளீர்கள்"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"பின்புல வரம்பு வரையறுக்கப்பட்டது"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"வரம்பை அகற்ற, தட்டவும்."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"அதிகப்படியான டேட்டா உபயோகம்"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"உங்களின் டேட்டா உபயோகம் கடந்த சில நாட்களில் வழக்கத்தை விட அதிகரித்துள்ளது. உபயோகம் மற்றும் அமைப்புகளைப் பார்க்க, தட்டவும்."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"மிகுதியான மொபைல் டேட்டா பயன்பாடு"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"உங்கள் ஆப்ஸ், வழக்கத்தைவிட அதிகமான டேட்டாவைப் பயன்படுத்தியுள்ளன"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"வழக்கத்தைவிட அதிகமான டேட்டாவை, <xliff:g id="APP">%s</xliff:g> பயன்படுத்தியுள்ளது"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"பாதுகாப்பு சான்றிதழ்"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"இந்தச் சான்றிதழ் சரியானது."</string>
<string name="issued_to" msgid="454239480274921032">"இதற்கு வழங்கப்பட்டது:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"உங்கள் நிர்வாகி நிறுவியுள்ளார்"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"உங்கள் நிர்வாகி புதுப்பித்துள்ளார்"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"உங்கள் நிர்வாகி நீக்கியுள்ளார்"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"சாதனத்தின் பேட்டரி ஆயுளை அதிகரிப்பதற்காக, பேட்டரி சேமிப்பான் உங்கள் சாதனத்தின் செயல்திறனைச் சற்றே குறைத்து, அதிர்வு, இருப்பிடச் சேவைகள் மற்றும் பெரும்பாலான பின்புலத் தரவு போன்றவற்றைக் கட்டுப்படுத்துகிறது. ஒத்திசைவைச் சார்ந்திருக்கும் மின்னஞ்சல், செய்தியிடல் மற்றும் பிற ஆப்ஸ் ஆகியவற்றை நீங்கள் திறக்காதவரை, அவை ஒத்திசைக்கப்படாமல் இருக்கும்.\n\nஉங்கள் ஃபோன் சார்ஜ் செய்யப்படும்போது, பேட்டரி சேமிப்பான் தானாகவே ஆஃப் செய்யப்படும்."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"டேட்டா பயன்பாட்டைக் குறைப்பதற்கு உதவ, பின்புலத்தில் டேட்டாவை அனுப்புவது அல்லது பெறுவதிலிருந்து சில பயன்பாடுகளை டேட்டா சேமிப்பான் தடுக்கும். தற்போது பயன்படுத்தும் பயன்பாடானது எப்போதாவது டேட்டாவை அணுகலாம். எடுத்துக்காட்டாக, படங்களை நீங்கள் தட்டும் வரை அவை காட்டப்படாது."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"டேட்டா சேமிப்பானை இயக்கவா?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"இயக்கு"</string>
@@ -1682,9 +1705,9 @@
<item quantity="other">%1$d நிமிடங்களுக்கு (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> வரை)</item>
<item quantity="one">1 நிமிடத்திற்கு (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> வரை)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d மணிநேரத்திற்கு (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> வரை)</item>
- <item quantity="one">ஒரு மணிநேரத்திற்கு (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> வரை)</item>
+ <item quantity="one">1 மணிநேரத்திற்கு (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> வரை)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d மணிநேரத்திற்கு (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> வரை)</item>
@@ -1698,9 +1721,9 @@
<item quantity="other">%d நிமிடங்களுக்கு</item>
<item quantity="one">1 நிமிடத்திற்கு</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d மணிநேரத்திற்கு</item>
- <item quantity="one">ஒரு மணிநேரத்திற்கு</item>
+ <item quantity="one">1 மணிநேரத்திற்கு</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d மணிநேரத்திற்கு</item>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ஒலியடக்கினார்"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது, அதனை ஆரம்பநிலைக்கு மீட்டமைக்கும் வரை நிலையற்று இயங்கலாம்."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது. விவரங்களுக்கு சாதன தயாரிப்பாளரைத் தொடர்புகொள்ளவும்."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD கோரிக்கையானது DIAL கோரிக்கைக்கு மாற்றப்பட்டது."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD கோரிக்கையானது SS கோரிக்கைக்கு மாற்றப்பட்டது."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD கோரிக்கையானது புதிய USSD கோரிக்கைக்கு மாற்றப்பட்டது."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD கோரிக்கையானது வீடியோ DIAL கோரிக்கைக்கு மாற்றப்பட்டது."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS கோரிக்கையானது DIAL கோரிக்கைக்கு மாற்றப்பட்டது."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS கோரிக்கையானது வீடியோ DIAL கோரிக்கைக்கு மாற்றப்பட்டது."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS கோரிக்கையானது USSD கோரிக்கைக்கு மாற்றப்பட்டது."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS கோரிக்கையானது புதிய SS கோரிக்கைக்கு மாற்றப்பட்டது."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"பணி சுயவிவரம்"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"விரிவாக்கும்"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"சுருக்கும்"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"தீங்கிழைக்கும் பயன்பாடு உள்ளது"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க, <xliff:g id="APP_0">%1$s</xliff:g> அனுமதி கேட்கிறது"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"திருத்து"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு அதிரும்"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு ஒலியை முடக்கும்"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"சிஸ்டம் மாற்றங்கள்"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"தொந்தரவு செய்ய வேண்டாம்"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"உங்கள் கவனம் சிதறாமல் இருப்பதற்கு, \'தொந்தரவு செய்ய வேண்டாம்\' பயன்முறையானது அறிவிப்புகளை மறைக்கிறது"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"இது புதிய செயல்பாடாகும். மாற்ற, தட்டவும்."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"தொந்தரவு செய்ய வேண்டாம் அமைப்புகள் மாற்றப்பட்டன"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"உங்களுக்கு வரும் அறிவிப்புக் குறுக்கீடுகளின் செயல்பாட்டு அமைப்புகளைச் சரிபார்க்க, தட்டவும்"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"எவற்றையெல்லாம் தடுக்கிறது என்பதைப் பார்க்க, தட்டவும்."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index b05ce97c3fca..720f096714d1 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"కాలర్ ID డిఫాల్ట్‌గా అపరిమితానికి ఉంటుంది. తర్వాత కాల్: అపరిమితం"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"సేవ కేటాయించబడలేదు."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"మీరు కాలర్ ID సెట్టింగ్‌ను మార్చలేరు."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"డేటా సేవ లేదు"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"అత్యవసర కాలింగ్ సదుపాయం లేదు"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"మొబైల్ డేటా సేవ లేదు"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"అత్యవసర కాలింగ్ అందుబాటులో లేదు"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"వాయిస్ సేవ లేదు"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"వాయిస్/అత్యవసర సేవ లేదు"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"మీ స్థానంలో మొబైల్ నెట్‌వర్క్ ద్వారా తాత్కాలికంగా అందించబడదు"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"నెట్‌వర్క్‌ను చేరుకోలేరు"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"స్వీకరణను మెరుగుపరచాలంటే, సెట్టింగ్‌లు &gt; నెట్‌వర్క్ &amp; ఇంటర్నెట్ &gt; మొబైల్ నెట్‌వర్క్‌లు &gt; ప్రాధాన్య నెట్‌వర్క్ రకంలో మీరు ఎంచుకున్న రకాన్ని మార్చి ప్రయత్నించండి."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi-Fi కాలింగ్ సక్రియంగా ఉంది"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"అత్యవసర కాల్‌లకు మొబైల్ నెట్‌వర్క్ అవసరమవుతుంది."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"వాయిస్ సేవ లేదా అత్యవసర కాలింగ్ లేదు"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"మీ క్యారియర్ తాత్కాలికంగా ఆఫ్ చేయబడింది"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"మొబైల్ నెట్‌వర్క్ అందుబాటులో లేదు"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ప్రాధాన్య నెట్‌వర్క్‌ను మార్చుకోవడానికి ప్రయత్నించండి. మార్చడానికి నొక్కండి."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"అత్యవసర కాలింగ్ అందుబాటులో లేదు"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi-Fiతో అత్యవసర కాల్‌లు చేయలేరు"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"హెచ్చరికలు"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"కాల్ ఫార్వార్డింగ్"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"అత్యవసర కాల్‌బ్యాక్ మోడ్"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"రోమింగ్ బ్యానర్ ఆన్‌లో ఉంది"</string>
<string name="roamingText12" msgid="1189071119992726320">"రోమింగ్ బ్యానర్ ఆఫ్‌లో ఉంది"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"సేవ కోసం శోధిస్తోంది"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi కాలింగ్"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fiతో కాల్‌లను చేయడానికి మరియు సందేశాలను పంపించడానికి, మొదట ఈ సేవను సెటప్ చేయాల్సిందిగా మీ క్యారియర్‌‌కి చెప్పండి. ఆ తర్వాత సెట్టింగ్‌ల నుండి Wi-Fi కాలింగ్‌ని మళ్లీ ఆన్ చేయండి. (లోపం కోడ్: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"మీ క్యారియర్‌తో నమోదు చేయండి (ఎర్రర్ కోడ్: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi కాలింగ్"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"చాలా ఎక్కువ అభ్యర్థనలు ప్రాసెస్ చేయబడుతున్నాయి. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g>కు సైన్‌ఇన్ ఎర్రర్"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"సమకాలీకరణ"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"సమకాలీకరణ"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"చాలా ఎక్కువ <xliff:g id="CONTENT_TYPE">%s</xliff:g> తొలగింపులు."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"టాబ్లెట్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌లను తొలగించండి."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌లను తొలగించండి."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"టీవీ నిల్వ నిండింది. ఖాళీ స్థలం కోసం కొన్ని ఫైల్‌లను తొలగించండి."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"మీ కార్యాలయ ప్రొఫైల్ నిర్వాహకుల ద్వారా"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ద్వారా"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"కార్యాలయ ప్రొఫైల్ తొలగించబడింది"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"నిర్వాహక యాప్ లేనందున కార్యాలయ ప్రొఫైల్ తొలగించబడింది"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"కార్యాలయ ప్రొఫైల్ నిర్వాహక యాప్ లేదు లేదా పాడైంది. తత్ఫలితంగా, మీ కార్యాలయ ప్రొఫైల్ మరియు సంబంధిత డేటా తొలగించబడ్డాయి. సహాయం కోసం మీ నిర్వాహకులను సంప్రదించండి."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"ఈ పరికరంలో మీ కార్యాలయ ప్రొఫైల్ ఇప్పుడు అందుబాటులో లేదు"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"చాలా ఎక్కువ పాస్‌వర్డ్ ప్రయత్నాలు చేసారు"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"పరికరం నిర్వహించబడింది"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"మీ సంస్థ ఈ పరికరాన్ని నిర్వహిస్తుంది మరియు నెట్‌వర్క్ ట్రాఫిక్‌ని పర్యవేక్షించవచ్చు. వివరాల కోసం నొక్కండి."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"మీ పరికరంలోని డేటా తొలగించబడుతుంది"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"నిర్వాహక యాప్‌ ఉపయోగించడం సాధ్యపడదు. మీ డివైజ్‌లోని డేటా ఇప్పుడు తొలగించబడుతుంది.\n\nమీకు సందేహాలుంటే, మీ సంస్థ యొక్క నిర్వాహకులను సంప్రదించండి."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"నిర్వాహక యాప్‌ ఉపయోగించడం సాధ్యపడదు. మీ పరికరంలోని డేటా ఇప్పుడు తొలగించబడుతుంది.\n\nమీకు ప్రశ్నలు ఉంటే, మీ సంస్థ యొక్క నిర్వాహకులను సంప్రదించండి."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"ముద్రణ <xliff:g id="OWNER_APP">%s</xliff:g> ద్వారా నిలిపివేయబడింది."</string>
<string name="me" msgid="6545696007631404292">"నేను"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"టాబ్లెట్ ఎంపికలు"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ఎయిర్‌ప్లేన్ మోడ్"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ఎయిర్‌ప్లేన్ మోడ్ ఆన్‌లో ఉంది"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ఎయిర్‌ప్లేన్ మోడ్ ఆఫ్‌లో ఉంది"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"బ్యాటరీ సేవర్"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"బ్యాటరీ సేవర్ ఆఫ్‌లో ఉంది"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"బ్యాటరీ సేవర్ ఆన్‌లో ఉంది"</string>
<string name="global_action_settings" msgid="1756531602592545966">"సెట్టింగ్‌లు"</string>
<string name="global_action_assist" msgid="3892832961594295030">"సహాయం"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"వాయిస్ అసిస్టెంట్"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"కార్యాలయ ప్రొఫైల్‌కి మార్చు"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"పరిచయాలు"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"మీ పరిచయాలను యాక్సెస్ చేయడానికి"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఉపయోగించి, మీ పరిచయాలను యాక్సెస్ చేయండి"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"స్థానం"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఉపయోగించి, ఈ పరికరం యొక్క స్థానాన్ని యాక్సెస్ చేయండి"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"క్యాలెండర్"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"మీ క్యాలెండర్‌ను యాక్సెస్ చేయడానికి"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఉపయోగించి, మీ క్యాలెండర్‌ను యాక్సెస్ చేయండి"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS సందేశాలను పంపడం మరియు వీక్షించడం"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఉపయోగించి, SMS సందేశాలను పంపండి మరియు వీక్షించండి"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"నిల్వ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్‌లను యాక్సెస్ చేయడానికి"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఉపయోగించి, మీ పరికరంలో ఫోటోలు, మీడియా మరియు ఫైల్‌లను యాక్సెస్ చేయండి"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"మైక్రోఫోన్"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ఆడియోను రికార్డ్ చేయడానికి"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఉపయోగించి, ఆడియోని రికార్డ్ చేయండి"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"కెమెరా"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"చిత్రాలను తీయడానికి మరియు వీడియోను రికార్డ్ చేయడానికి"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఉపయోగించి, చిత్రాలను తీయండి మరియు వీడియోని రికార్డ్ చేయండి"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"ఫోన్"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ఫోన్ కాల్‌లు చేయడం మరియు నిర్వహించడం"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఉపయోగించి, ఫోన్ కాల్‌లను చేయండి మరియు నిర్వహించండి"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"శరీర సెన్సార్‌లు"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేస్తుంది"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఉపయోగించి, మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేయండి"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"విండో కంటెంట్‍ను తిరిగి పొందుతుంది"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"మీరు పరస్పర చర్య చేస్తున్న విండో కంటెంట్‌‍ను పరిశీలిస్తుంది."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"తాకడం ద్వారా విశ్లేషణను ప్రారంభిస్తుంది"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"సంజ్ఞలను చేయడం"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"నొక్కగలరు, స్వైప్ చేయగలరు, స్క్రీన్‌పై రెండు వేళ్లను ఉంచి ఆ వేళ్లను దగ్గరకు లేదా దూరానికి లాగగలరు మరియు ఇతర సంజ్ఞలను చేయగలరు."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"వేలిముద్ర సంజ్ఞలు"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"పరికరాల వేలిముద్ర సెన్సార్‌లో నిర్వహించిన సంజ్ఞలను క్యాప్చర్ చేయవచ్చు."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"పరికర వేలిముద్ర సెన్సార్‌లో ఉపయోగించిన సంజ్ఞలను క్యాప్చర్ చేయవచ్చు."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"స్థితి బార్‌ను నిలిపివేయడం లేదా సవరించడం"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"స్థితి బార్‌ను నిలిపివేయడానికి లేదా సిస్టమ్ చిహ్నాలను జోడించడానికి మరియు తీసివేయడానికి యాప్‌ను అనుమతిస్తుంది."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"స్థితి పట్టీగా ఉండటం"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"యాప్‌, దాని భాగాలు మెమరీలో ఉండేలా చేయడానికి దానిని అనుమతిస్తుంది. ఇది ఇతర యాప్‌లకు అందుబాటులో ఉన్న మెమరీని ఆక్రమిస్తుంది, టాబ్లెట్ నెమ్మదిగా పని చేస్తుంది."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"యాప్‌ దానిలోని కొన్ని భాగాలను మెమరీలో ఉంచడానికి దాన్ని అనుమతిస్తుంది. ఇది టీవీ నెమ్మదిగా పని చేసేలా చేస్తూ ఇతర అనువర్తనాలకు అందుబాటులో ఉన్న మెమరీని పరిమితం చేయవచ్చు."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"యాప్‌, దాని భాగాలు మెమరీలో ఉండేలా చేయడానికి దానిని అనుమతిస్తుంది. ఇది ఇతర యాప్‌లకు అందుబాటులో ఉన్న మెమరీని ఆక్రమిస్తుంది, ఫోన్ నెమ్మదిగా పని చేస్తుంది."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"సేవని ముందు భాగంలో అమలు చేయడం"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"ముందు భాగంలో సేవలను ఉపయోగించడానికి యాప్‌ని అనుమతిస్తుంది."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"యాప్ నిల్వ స్థలాన్ని అంచనా వేయడం"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"యాప్‌ కోడ్, డేటా మరియు కాష్ పరిమాణాలను తిరిగి పొందడానికి దాన్ని అనుమతిస్తుంది"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"సిస్టమ్ సెట్టింగ్‌లను సవరించడం"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ఆకృతి అన్‌లాక్."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ముఖంతో అన్‌లాక్."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"పిన్ అన్‌లాక్."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Sim పిన్ అన్‌లాక్."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Sim Puk అన్‌లాక్."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"పాస్‌వర్డ్ అన్‌లాక్."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ఆకృతి ప్రాంతం."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"స్లయిడ్ ప్రాంతం."</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"వచనం క్లిప్‌బోర్డ్‌కు కాపీ చేయబడింది."</string>
<string name="more_item_label" msgid="4650918923083320495">"ఎక్కువ"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"మెను+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"అప్‌డేట్ కోసం తనిఖీ చేయి"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> యాప్ (<xliff:g id="PROCESS">%2$s</xliff:g> ప్రాసెస్) అది స్వయంగా అమలు చేసే ఖచ్చితమైన మోడ్ విధానాన్ని ఉల్లంఘించింది."</string>
<string name="smv_process" msgid="5120397012047462446">"ప్రక్రియ <xliff:g id="PROCESS">%1$s</xliff:g> అది స్వయంగా అమలు చేసే ఖచ్చితమైన మోడ్ విధానాన్ని ఉల్లంఘించింది."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android అప్‌గ్రేడ్ అవుతోంది…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android ప్రారంభమవుతోంది…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"ఫోన్ అప్‌డేట్‌ అవుతోంది…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"టాబ్లెట్ అప్‌డేట్‌ అవుతోంది…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"పరికరం అప్‌డేట్‌ అవుతోంది…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"ఫోన్ ప్రారంభమవుతోంది…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"టాబ్లెట్ ప్రారంభమవుతోంది…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"పరికరం ప్రారంభమవుతోంది…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"నిల్వను అనుకూలపరుస్తోంది."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android నవీకరణను ముగిస్తోంది…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"అప్‌గ్రేడ్ పూర్తయ్యే వరకు కొన్ని అనువర్తనాలు సరిగ్గా పని చేయకపోవచ్చు"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"సిస్టమ్ అప్‌డేట్‌ని పూర్తి చేస్తోంది…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g>ని అప్‌గ్రేడ్ చేస్తోంది…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>లో <xliff:g id="NUMBER_0">%1$d</xliff:g> యాప్‌ను అనుకూలీకరిస్తోంది."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g>ని సిద్ధం చేస్తోంది."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"అనువర్తనాలను ప్రారంభిస్తోంది."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"బూట్‌ను ముగిస్తోంది."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> అమలవుతోంది"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"గేమ్‌కి తిరిగి రావడానికి నొక్కండి"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"గేమ్‌ను ఎంచుకోండి"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"మెరుగైన పనితీరు పొందడానికి, ఈ గేమ్‌లలో ఒకసారికి ఒక్కటి మాత్రమే తెరవగలరు."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g>కి తిరిగి వెళ్లు"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g>ని తెరువు"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> సేవ్ చేయకుండానే మూసివేయబడుతుంది"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> మెమరీ పరిమితిని మించిపోయింది"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"కుప్పలు తెప్పలుగా సేకరించబడింది; షేర్ చేయడానికి నొక్కండి"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"హీప్ డంప్‌ను భాగస్వామ్యం చేయాలా?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> ప్రాసెస్ దాని <xliff:g id="SIZE">%2$s</xliff:g> ప్రాసెస్ మెమరీ పరిమితిని మించిపోయింది. మీకు దాని డెవలపర్‌తో షేర్ చేయడానికి హీప్ డంప్ అందుబాటులో ఉంది. జాగ్రత్తగా ఉండండి: ఈ హీప్ డంప్‌లో యాప్‌ యాక్సెస్ కలిగి ఉన్న మీ వ్యక్తిగత సమాచారం ఏదైనా ఉండవచ్చు."</string>
<string name="sendText" msgid="5209874571959469142">"వచనం కోసం చర్యను ఎంచుకోండి"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"బహిరంగ Wi‑Fi నెట్‌వర్క్‌కు కనెక్ట్ చేయండి"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"క్యారియర్ Wi‑Fi నెట్‌వర్క్‌కి కనెక్ట్ చేయండి"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"బహిరంగ Wi‑Fi నెట్‌వర్క్‌కు కనెక్ట్ చేస్తోంది"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi నెట్‌వర్క్‌కు కనెక్ట్ చేయబడింది"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi నెట్‌వర్క్‌కు కనెక్ట్ చేయడం సాధ్యపడలేదు"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"అన్ని నెట్‌వర్క్‌లు చూడటానికి నొక్కండి"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"కనెక్ట్ చేయి"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"అన్ని నెట్‌వర్క్‌లు"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"అన్ని నెట్‌వర్క్‌లు"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi స్వయంచాలకంగా ఆన్ అవుతుంది"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"మీరు అధిక నాణ్యత గల సేవ్ చేసిన నెట్‌వర్క్‌కు సమీపంగా ఉన్నప్పుడు"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"తిరిగి ఆన్ చేయవద్దు"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"పునఃప్రారంభించు"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"మొబైల్ సేవను సక్రియం చేయండి"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"మీ కొత్త SIMని సక్రియం చేయడానికి క్యారియర్ యాప్‌ను డౌన్‌లోడ్ చేయండి"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"మీ కొత్త SIMని సక్రియం చేయడం కోసం <xliff:g id="APP_NAME">%1$s</xliff:g> యాప్‌ని డౌన్‌లోడ్ చేయండి"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"యాప్‌ని డౌన్‌లోడ్ చేయి"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"కొత్త SIM చొప్పించారు"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"దీన్ని సెటప్ చేయడానికి నొక్కండి"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB ద్వారా PTP ఆన్ చేయబడింది"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB టెథెరింగ్ ఆన్ చేయబడింది"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB ద్వారా MIDI ఆన్ చేయబడింది"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ఉపకరణ మోడ్ ఆన్ చేయబడింది"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB ఉపకరణం కనెక్ట్ చేయబడింది"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"మరిన్ని ఎంపికల కోసం నొక్కండి."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"కనెక్ట్ చేయబడిన పరికరాన్ని ఛార్జ్ చేస్తోంది. మరిన్ని ఎంపికల కోసం నొక్కండి."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"అనలాగ్ ఆడియో ఉపకరణం కనుగొనబడింది"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"జోడించిన పరికరం ఈ ఫోన్‌కు అనుకూలంగా లేదు. మరింత తెలుసుకోవడానికి నొక్కండి."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB డీబగ్గింగ్ కనెక్ట్ చేయబడింది"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"USB డీబగ్గింగ్‌ను నిలిపివేయడానికి నొక్కండి."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB డీబగ్గింగ్‌ను ఆఫ్ చేయడానికి నొక్కండి"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"డీబగ్గింగ్‌ని నిలిపివేయడానికి ఎంచుకోండి."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"బగ్ నివేదికను తీస్తోంది…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"బగ్ నివేదికను భాగస్వామ్యం చేయాలా?"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ఇతర అనువర్తనాలలో చూపబడుతోంది"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ఇతర అనువర్తనాలలో చూపబడుతోంది"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్‌లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ఆఫ్ చేయి"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ఆఫ్ చేయి"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>ని సిద్ధం చేస్తోంది"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"లోపాల కోసం తనిఖీ చేస్తోంది"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"కొత్త <xliff:g id="NAME">%s</xliff:g> గుర్తించబడింది"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ఎల్లప్పుడూ-ఆన్‌లో ఉండే VPN కనెక్ట్ చేయబడుతోంది…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"ఎల్లప్పుడూ-ఆన్‌లో ఉండే VPN కనెక్ట్ చేయబడింది"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ఎల్లప్పుడూ ఆన్‌లో ఉండే VPN నుండి డిస్‌కనెక్ట్ చేయబడింది"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"ఎల్లప్పుడూ-ఆన్‌లో ఉండే VPN ఎర్రర్"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"నెట్‌వర్క్ లేదా VPN సెట్టింగ్‌లను మార్చండి"</string>
<string name="upload_file" msgid="2897957172366730416">"ఫైల్‌ను ఎంచుకోండి"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ఫైల్ ఎంచుకోబడలేదు"</string>
<string name="reset" msgid="2448168080964209908">"రీసెట్ చేయి"</string>
<string name="submit" msgid="1602335572089911941">"సమర్పించు"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"కారు మోడ్ ప్రారంభించబడింది"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"కారు మోడ్ నుండి నిష్క్రమించడానికి నొక్కండి."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"టీథర్ చేయబడినది లేదా హాట్‌స్పాట్ సక్రియంగా ఉండేది"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"సెటప్ చేయడానికి నొక్కండి."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"టెథెరింగ్ నిలిపివేయబడింది"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB డ్రైవ్"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB నిల్వ"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"సవరించు"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"డేటా వినియోగ హెచ్చరిక"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"వినియోగం,సెట్టింగ్‌ల కోసం నొక్కండి"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G డేటా పరిమితిని చేరుకుంది"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G డేటా పరిమితిని చేరుకుంది"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"డేటా హెచ్చరిక"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"మీరు డేటాలో <xliff:g id="APP">%s</xliff:g> ఉపయోగించారు"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"మొబైల్ డేటా పరిమితిని చేరుకున్నారు"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi డేటా పరిమితిని చేరుకుంది"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"మిగిలిన కార్యా. డేటా పాజ్ చేయబ."</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G డేటా పరిమితి మించిపోయింది"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G డేటా పరిమితి మించిపోయింది"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"మొబైల్ డేటా పరిమితి మించిపోయింది"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi డేటా పరిమితి మించిపోయింది"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"పేర్కొన్న పరిమితి కంటే <xliff:g id="SIZE">%s</xliff:g> మించిపోయింది."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"మీ సైకిల్‌లోని మిగిలిన భాగంలో డేటా పాజ్ చేయబడింది"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"మీ మొబైల్ డేటా పరిమితిని అధిగమించారు"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"మీ Wi-Fi డేటా పరిమితిని దాటారు"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"మీరు సెట్ చేసిన పరిమితి కంటే <xliff:g id="SIZE">%s</xliff:g> ఎక్కువ ఉపయోగించారు"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"నేపథ్య డేటా పరిమితం చేయబడింది"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"నియంత్రణ తీసివేయడానికి నొక్కండి."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"ఎక్కువ డేటా వినియోగం"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"గత కొన్ని రోజులుగా మీ డేటా వినియోగం సాధారణం కంటే ఎక్కువగా ఉంటోంది. వినియోగం మరియు సెట్టింగ్‌లను చూడడానికి నొక్కండి."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"అధిక మొబైల్ డేటా వినియోగం"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"మీ యాప్‌లు సాధారణం కంటే ఎక్కువ డేటాని ఉపయోగించాయి"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> సాధారణం కంటే ఎక్కువ డేటాని ఉపయోగించింది"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"భద్రతా సర్టిఫికెట్"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ఈ సర్టిఫికెట్ చెల్లుబాటు అవుతుంది."</string>
<string name="issued_to" msgid="454239480274921032">"దీనికి జారీ చేయబడింది:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"మీ నిర్వాహకులు ఇన్‌స్టాల్ చేసారు"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"మీ నిర్వాహకులు నవీకరించారు"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"మీ నిర్వాహకులు తొలగించారు"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"బ్యాటరీ జీవితకాలాన్ని మెరుగుపరచడంలో సహాయపడటానికి, బ్యాటరీ సేవర్ మీ పరికరం పనితీరును తగ్గిస్తుంది మరియు వైబ్రేషన్‌ను, స్థాన సేవలను మరియు అత్యధిక నేపథ్య డేటాను పరిమితం చేస్తుంది. ఇమెయిల్, మెసేజింగ్ మరియు సమకాలీకరణపై ఆధారపడే ఇతర యాప్‌లు మీరు వాటిని తెరిస్తే మినహా అప్‌డేట్ చేయబడవు.\n\nమీ పరికరం ఛార్జ్ అవుతున్నప్పుడు బ్యాటరీ సేవర్ స్వయంచాలకంగా ఆఫ్ అవుతుంది."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"డేటా వినియోగాన్ని తగ్గించడంలో సహాయకరంగా ఉండటానికి, డేటా సేవర్ కొన్ని యాప్‌లను నేపథ్యంలో డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తున్న యాప్‌ డేటాను యాక్సెస్ చేయగలదు కానీ అలా అరుదుగా చేయవచ్చు. అంటే, ఉదాహరణకు, మీరు ఆ చిత్రాలను నొక్కే వరకు అవి ప్రదర్శించబడవు."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"డేటా సేవర్‌ను ఆన్ చేయాలా?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ఆన్ చేయి"</string>
@@ -1682,9 +1705,9 @@
<item quantity="other">%1$d నిమి పాటు (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> వరకు)</item>
<item quantity="one">1 నిమి పాటు (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> వరకు)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d గంటల పాటు (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> వరకు)</item>
- <item quantity="one">ఒక గంట పాటు (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> వరకు)</item>
+ <item quantity="one">1 గంట పాటు (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> వరకు)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d గం పాటు (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> వరకు)</item>
@@ -1698,9 +1721,9 @@
<item quantity="other">%d నిమి పాటు</item>
<item quantity="one">1 నిమి పాటు</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d గంటల పాటు</item>
- <item quantity="one">ఒక గంట పాటు</item>
+ <item quantity="one">1 గంట పాటు</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d గం పాటు</item>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ద్వారా మ్యూట్ చేయబడింది"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది మరియు మీరు ఫ్యాక్టరీ డేటా రీసెట్ చేసే వరకు అస్థిరంగా ఉంటుంది."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది. వివరాల కోసం మీ తయారీదారుని సంప్రదించండి."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD అభ్యర్థన డయల్ అభ్యర్థనగా సవరించబడింది."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD అభ్యర్థన SS అభ్యర్థనగా సవరించబడింది."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD అభ్యర్థన కొత్త USSD అభ్యర్థనగా సవరించబడింది."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD అభ్యర్థన వీడియో డయల్ అభ్యర్థనగా సవరించబడింది."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS అభ్యర్థన డయల్ అభ్యర్థనగా సవరించబడింది."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS అభ్యర్థన వీడియో డయల్ అభ్యర్థనగా సవరించబడింది."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS అభ్యర్థన USSD అభ్యర్థనగా సవరించబడింది."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS అభ్యర్థన కొత్త SS అభ్యర్థనగా సవరించబడింది."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"కార్యాలయ ప్రొఫైల్‌"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"విస్తరింపజేయి"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"కుదించు"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"హానికరమైన యాప్ గుర్తించబడింది"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> స్లైస్‌లను చూపించాలనుకుంటోంది"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"సవరించు"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"కాల్‌లు మరియు నోటిఫికేషన్‌లు వైబ్రేట్ అవుతాయి"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"కాల్‌లు మరియు నోటిఫికేషన్‌లు మ్యూట్ చేయబడతాయి"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"సిస్టమ్ మార్పులు"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"అంతరాయం కలిగించవద్దు"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"అంతరాయం కలిగించవద్దు అనేది మీరు దృష్టి సారించడంలో సహాయపడేందుకు నోటిఫికేషన్‌లను దాస్తుంది"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"ఇది కొత్త ప్రవర్తన. మార్చడానికి నొక్కండి."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"అంతరాయం కలిగించవద్దు మార్చబడింది"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"అంతరాయాల కోసం మీ ప్రవర్తన సెట్టింగ్‌లను తనిఖీ చేయడానికి నొక్కండి"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"బ్లాక్ చేయబడిన దాన్ని తనిఖీ చేయడానికి నొక్కండి."</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 7aa594a1acb0..4614fddb078b 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"หมายเลขผู้โทรได้รับการตั้งค่าเริ่มต้นเป็นไม่จำกัด การโทรครั้งต่อไป: ไม่จำกัด"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"ไม่มีการนำเสนอบริการ"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"คุณไม่สามารถเปลี่ยนการตั้งค่าหมายเลขผู้โทร"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"ไม่มีบริการอินเทอร์เน็ต"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"ไม่มีหมายเลขฉุกเฉิน"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"ไม่มีบริการเน็ตมือถือ"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"หมายเลขฉุกเฉินไม่พร้อมใช้งาน"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ไม่มีบริการเสียง"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ไม่มีบริการเสียง/บริการฉุกเฉิน"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"งดให้บริการชั่วคราวโดยเครือข่ายมือถือในตำแหน่งของคุณ"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"เข้าถึงเครือข่ายไม่ได้"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"ลองเปลี่ยนประเภทที่เลือกใน \"การตั้งค่า\" &gt; \"เครือข่ายและอินเทอร์เน็ต\" &gt; \"เครือข่ายมือถือ\" &gt; \"ประเภทเครือข่ายที่ต้องการ\" เพื่อให้การรับสัญญาณดีขึ้น"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"กำลังใช้งานการโทรผ่าน Wi-Fi"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"หมายเลขฉุกเฉินต้องใช้เครือข่ายมือถือ"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ไม่มีบริการโทรสนทนาหรือการโทรหมายเลขฉุกเฉิน"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"ปิดชั่วคราวโดยผู้ให้บริการ"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"เชื่อมต่อเครือข่ายมือถือไม่ได้"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ลองเปลี่ยนเครือข่ายที่ต้องการ แตะเพื่อเปลี่ยน"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"โทรหาหมายเลขฉุกเฉินไม่ได้"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"โทรหาหมายเลขฉุกเฉินผ่าน Wi‑Fi ไม่ได้"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"การแจ้งเตือน"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"การโอนสาย"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"โหมดติดต่อกลับฉุกเฉิน"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"เปิดโรมมิ่งแบนเนอร์"</string>
<string name="roamingText12" msgid="1189071119992726320">"ปิดโรมมิ่งแบนเนอร์"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"กำลังค้นหาบริการ"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"การโทรผ่าน Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"หากต้องการโทรออกและส่งข้อความผ่าน Wi-Fi โปรดสอบถามผู้ให้บริการของคุณก่อนเพื่อตั้งค่าบริการนี้ แล้วเปิดการโทรผ่าน Wi-Fi อีกครั้งจากการตั้งค่า (รหัสข้อผิดพลาด: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"ลงทะเบียนกับผู้ให้บริการของคุณ (รหัสข้อผิดพลาด: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"กำลังเรียก Wi-Fi ของ %s"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"กำลังประมวลผลคำขอมากเกินไป โปรดลองใหม่อีกครั้ง"</string>
<string name="notification_title" msgid="8967710025036163822">"ข้อผิดพลาดในการลงชื่อเข้าใช้ <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"ซิงค์"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ซิงค์"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"มีการนำออก <xliff:g id="CONTENT_TYPE">%s</xliff:g> มากเกินไป"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"ซิงค์ไม่ได้"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"พยายามลบ <xliff:g id="CONTENT_TYPE">%s</xliff:g> หลายรายการเกินไป"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ที่จัดเก็บข้อมูลของแท็บเล็ตเต็ม ลบไฟล์บางไฟล์เพื่อเพิ่มพื้นที่ว่าง"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"ที่เก็บข้อมูลนาฬิกาเต็ม โปรดลบไฟล์บางไฟล์เพื่อเพิ่มพื้นที่ว่าง"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"พื้นที่เก็บข้อมูลในทีวีเต็ม โปรดลบบางไฟล์เพื่อเพิ่มพื้นที่ว่าง"</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"โดยผู้ดูแลระบบโปรไฟล์งานของคุณ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"โดย <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ลบโปรไฟล์งานแล้ว"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"ลบโปรไฟล์งานแล้วเนื่องจากไม่มีแอปผู้ดูแลระบบ"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"แอปผู้ดูแลระบบโปรไฟล์งานไม่มีอยู่หรือเสียหาย ระบบจึงทำการลบโปรไฟล์งานและข้อมูลที่เกี่ยวข้องของคุณออก โปรดติดต่อผู้ดูแลระบบเพื่อรับความช่วยเหลือ"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"โปรไฟล์งานของคุณไม่สามารถใช้ในอุปกรณ์นี้อีกต่อไป"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"ลองป้อนรหัสผ่านหลายครั้งเกินไป"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"อุปกรณ์มีการจัดการ"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"องค์กรของคุณจัดการอุปกรณ์นี้และอาจตรวจสอบการจราจรของข้อมูลในเครือข่าย แตะเพื่อดูรายละเอียด"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"ระบบจะลบข้อมูลในอุปกรณ์ของคุณ"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"ไม่สามารถใช้แอปผู้ดูแลระบบนี้ ขณะนี้ระบบจะลบข้อมูลในอุปกรณ์ของคุณ\n\nโปรดติดต่อผู้ดูแลระบบขององค์กรหากมีคำถาม"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"ใช้แอปผู้ดูแลระบบนี้ไม่ได้ ขณะนี้ระบบจะลบข้อมูลในอุปกรณ์ของคุณ\n\nโปรดติดต่อผู้ดูแลระบบขององค์กรหากมีคำถาม"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> ปิดใช้การพิมพ์แล้ว"</string>
<string name="me" msgid="6545696007631404292">"ฉัน"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ตัวเลือกของแท็บเล็ต"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"โหมดใช้งานบนเครื่องบิน"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"เปิดโหมดใช้งานบนเครื่องบิน"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"โหมดใช้งานบนเครื่องบินปิดทำงานอยู่"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"โหมดประหยัดแบตเตอรี่"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ปิดโหมดประหยัดแบตเตอรี่อยู่"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"เปิดโหมดประหยัดแบตเตอรี่อยู่"</string>
<string name="global_action_settings" msgid="1756531602592545966">"การตั้งค่า"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ผู้ช่วย"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ตัวช่วยเสียง"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"สลับไปใช้โปรไฟล์งาน"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"รายชื่อติดต่อ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"เข้าถึงรายชื่อติดต่อ"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงรายชื่อติดต่อของคุณ"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงรายชื่อติดต่อไหม"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ตำแหน่ง"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"เข้าถึงตำแหน่งของอุปกรณ์นี้"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงตำแหน่งของอุปกรณ์นี้"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงตำแหน่งของอุปกรณ์นี้ไหม"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ปฏิทิน"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"เข้าถึงปฏิทิน"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงปฏิทินของคุณ"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงปฏิทินไหม"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"ส่งและดูข้อความ SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ส่งและดูข้อความ SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ส่งและดูข้อความ SMS ไหม"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"พื้นที่เก็บข้อมูล"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"เข้าถึงรูปภาพ สื่อ และไฟล์บนอุปกรณ์ของคุณ"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงรูปภาพ สื่อ และไฟล์ในอุปกรณ์ของคุณ"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงรูปภาพ สื่อ และไฟล์ในอุปกรณ์ไหม"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"ไมโครโฟน"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"บันทึกเสียง"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; บันทึกเสียง"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; บันทึกเสียงไหม"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"กล้องถ่ายรูป"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ถ่ายภาพและบันทึกวิดีโอ"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ถ่ายรูปและบันทึกวิดีโอ"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ถ่ายรูปและบันทึกวิดีโอไหม"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"โทรศัพท์"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"โทรและจัดการการโทร"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; โทรและจัดการการโทร"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; โทรและจัดการการโทรไหม"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"เซ็นเซอร์ร่างกาย"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"เข้าถึงข้อมูลเซ็นเซอร์เกี่ยวกับสัญญาณชีพของคุณ"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงข้อมูลเซ็นเซอร์เกี่ยวกับสัญญาณชีพของคุณ"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงข้อมูลเซ็นเซอร์เกี่ยวกับสัญญาณชีพไหม"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"เรียกข้อมูลเนื้อหาของหน้าต่าง"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ตรวจสอบเนื้อหาของหน้าต่างที่คุณกำลังโต้ตอบอยู่"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"เปิด \"แตะเพื่อสำรวจ\""</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"ทำท่าทางสัมผัส"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"สามารถแตะ เลื่อน บีบ และทำท่าทางสัมผัสอื่นๆ"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"ท่าทางสัมผัสลายนิ้วมือ"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"สามารถจับท่าทางสัมผัสที่เกิดขึ้นบนเซ็นเซอร์ลายนิ้วมือของอุปกรณ์"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"สามารถจับท่าทางสัมผัสที่เกิดขึ้นบนเซ็นเซอร์ลายนิ้วมือของอุปกรณ์"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"ปิดการใช้งานหรือแก้ไขแถบสถานะ"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"อนุญาตให้แอปพลิเคชันปิดใช้งานแถบสถานะหรือเพิ่มและนำไอคอนระบบออก"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"เป็นแถบสถานะ"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"อนุญาตให้แอปพลิเคชันทำให้ส่วนหนึ่งของตัวเองคงอยู่ถาวรในหน่วยความจำ ซึ่งจะจำกัดพื้นที่หน่วยความจำที่ใช้งานได้ของแอปพลิเคชันอื่นๆ และทำให้แท็บเล็ตทำงานช้าลง"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"อนุญาตให้แอปทำให้บางส่วนของแอปนั้นอยู่ในหน่วยความจำเสมอ ซึ่งอาจจำกัดพื้นที่หน่วยความจำสำหรับแอปอื่นและทำให้ทีวีช้าลง"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"อนุญาตให้แอปพลิเคชันทำให้ส่วนหนึ่งของตัวเองคงอยู่ถาวรในหน่วยความจำ ซึ่งจะจำกัดพื้นที่หน่วยความจำที่ใช้งานได้ของแอปพลิเคชันอื่นๆ และทำให้โทรศัพท์ทำงานช้าลง"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"เรียกใช้บริการที่ใช้งานอยู่"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"อนุญาตให้แอปใช้ประโยชน์จากบริการที่ใช้งานอยู่"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"วัดพื้นที่เก็บข้อมูลของแอปพลิเคชัน"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"อนุญาตให้แอปพลิเคชันเรียกดูรหัส ข้อมูล และขนาดแคชของตน"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"แก้ไขการตั้งค่าระบบ"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"การปลดล็อกด้วยรูปแบบ"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"การปลดล็อกด้วยใบหน้า"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"การปลดล็อกด้วย PIN"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"การปลดล็อก PIN ของซิม"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"การปลดล็อก PUK ของซิม"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"การปลดล็อกด้วยรหัสผ่าน"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"พื้นที่สำหรับรูปแบบ"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"พื้นที่สำหรับการเลื่อน"</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"คัดลอกข้อความไปยังคลิปบอร์ด"</string>
<string name="more_item_label" msgid="4650918923083320495">"เพิ่มเติม"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"เมนู+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"Space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"Enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ลบ"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"ตรวจสอบอัปเดต"</string>
<string name="smv_application" msgid="3307209192155442829">"แอปพลิเคชัน <xliff:g id="APPLICATION">%1$s</xliff:g> (กระบวนการ <xliff:g id="PROCESS">%2$s</xliff:g>) ละเมิดนโยบาย StrictMode ที่บังคับใช้ด้วยตัวเอง"</string>
<string name="smv_process" msgid="5120397012047462446">"กระบวนการ <xliff:g id="PROCESS">%1$s</xliff:g> ละเมิดนโยบาย StrictMode ที่บังคับใช้ด้วยตัวเอง"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"กำลังอัปเกรด Android ..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android กำลังเริ่มต้น…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"โทรศัพท์กำลังอัปเดต…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"แท็บเล็ตกำลังอัปเดต…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"อุปกรณ์กำลังอัปเดต…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"โทรศัพท์กำลังเริ่มต้น…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"แท็บเล็ตกำลังเริ่มต้น…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"อุปกรณ์กำลังเริ่มต้น…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"กำลังเพิ่มประสิทธิภาพพื้นที่จัดเก็บข้อมูล"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"กำลังทำการอัปเดต Android ให้เสร็จสิ้น…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"แอปบางแอปอาจทำงานไม่ถูกต้องจนกว่าจะอัปเกรดเสร็จ"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"กำลังอัปเดตระบบ…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"กำลังอัปเกรด <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"กำลังเพิ่มประสิทธิภาพแอปพลิเคชัน <xliff:g id="NUMBER_0">%1$d</xliff:g> จาก <xliff:g id="NUMBER_1">%2$d</xliff:g> รายการ"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"กำลังเตรียม <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"กำลังเริ่มต้นแอปพลิเคชัน"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"เสร็จสิ้นการบูต"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> กำลังทำงาน"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"แตะเพื่อกลับไปที่เกม"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"เลือกเกม"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"เพื่อประสิทธิภาพที่ดีขึ้น คุณจะเปิดเกมได้ครั้งละ 1 เกมเท่านั้น"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"กลับไปที่ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"เปิด <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> จะปิดโดยไม่บันทึก"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> เกินขีดจำกัดของหน่วยความจำ"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"รวบรวมฮีพดัมพ์แล้ว แตะเพื่อแชร์"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"รวบรวมฮีพดัมพ์แล้ว แตะเพื่อแชร์"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"แชร์ฮีพดัมพ์ไหม"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> มีขนาดเกิน <xliff:g id="SIZE">%2$s</xliff:g> ซึ่งเป็นขีดจำกัดของหน่วยความจำกระบวนการแล้ว ฮีพดัมพ์จะพร้อมให้คุณแชร์กับนักพัฒนาซอฟต์แวร์ โปรดระวัง ฮีพดัมพ์นี้สามารถเก็บข้อมูลส่วนบุคคลที่แอปพลิเคชันมีสิทธิ์เข้าถึงได้"</string>
<string name="sendText" msgid="5209874571959469142">"เลือกการทำงานกับข้อความ"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"เชื่อมต่อเครือข่าย Wi‑Fi แบบเปิด"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"เชื่อมต่อเครือข่าย Wi‑Fi ของผู้ให้บริการ"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"กำลังเชื่อมต่อเครือข่าย Wi‑Fi แบบเปิด"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"เชื่อมต่อเครือข่าย Wi-Fi แล้ว"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ไม่สามารถเชื่อมต่อเครือข่าย Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"แตะเพื่อดูเครือข่ายทั้งหมด"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"เชื่อมต่อ"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"เครือข่ายทั้งหมด"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"เครือข่ายทั้งหมด"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi จะเปิดโดยอัตโนมัติ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"เมื่อคุณอยู่ใกล้เครือข่ายคุณภาพสูงที่บันทึกไว้"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ไม่ต้องเปิดอีกครั้ง"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"รีสตาร์ท"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"เปิดใช้งานบริการมือถือ"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ดาวน์โหลดแอปผู้ให้บริการเพื่อเปิดใช้งานซิมอันใหม่"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"ดาวน์โหลดแอป <xliff:g id="APP_NAME">%1$s</xliff:g> เพื่อเปิดใช้งานซิมใหม่"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ดาวน์โหลดแอป"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ใส่ซิมใหม่แล้ว"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"แตะเพื่อตั้งค่า"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"เปิดโหมด PTP ผ่าน USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"เปิดการเชื่อมต่ออินเทอร์เน็ตผ่าน USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"เปิดโหมด MIDI ผ่าน USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"เปิดโหมดอุปกรณ์เสริม USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"เชื่อมต่ออุปกรณ์เสริม USB แล้ว"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"แตะเพื่อดูตัวเลือกเพิ่มเติม"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"กำลังชาร์จอุปกรณ์ที่เชื่อมต่อ แตะเพื่อดูตัวเลือกเพิ่มเติม"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ตรวจพบอุปกรณ์เสริมสำหรับเสียงแบบแอนะล็อก"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"อุปกรณ์ที่พ่วงไม่สามารถใช้งานร่วมกับโทรศัพท์นี้ แตะเพื่อเรียนรู้เพิ่มเติม"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"เชื่อมต่อการแก้ไขข้อบกพร่องผ่าน USB แล้ว"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"แตะเพื่อปิดใช้การแก้ไขข้อบกพร่องของ USB"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"แตะเพื่อปิดการแก้ไขข้อบกพร่อง USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"เลือกเพื่อปิดใช้งานการแก้ไขข้อบกพร่อง USB"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"กำลังสร้างรายงานข้อบกพร่อง…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"แชร์รายงานข้อบกพร่องไหม"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> แสดงทับแอปอื่นๆ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> กำลังแสดงทับแอปอื่นๆ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ปิด"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ปิด"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"กำลังเตรียม <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"กำลังตรวจหาข้อผิดพลาด"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"ตรวจพบ <xliff:g id="NAME">%s</xliff:g> ใหม่"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"กำลังเชื่อมต่อ VPN แบบเปิดตลอดเวลา…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"เชื่อมต่อ VPN แบบเปิดตลอดเวลาแล้ว"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"ยกเลิกการเชื่อมต่อกับ VPN แบบเปิดตลอดเวลาแล้ว"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"ข้อผิดพลาดของ VPN แบบเปิดตลอดเวลา"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"เชื่อมต่อ VPN แบบเปิดตลอดเวลาไม่ได้"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"เปลี่ยนเครือข่ายหรือการตั้งค่า VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"เลือกไฟล์"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"ไม่ได้เลือกไฟล์ไว้"</string>
<string name="reset" msgid="2448168080964209908">"รีเซ็ต"</string>
<string name="submit" msgid="1602335572089911941">"ส่ง"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"เปิดการใช้งานโหมดรถยนต์"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"แตะเพื่อออกจากโหมดรถยนต์"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"แอปสำหรับการขับขี่ทำงานอยู่"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"แตะเพื่อออกจากแอปสำหรับการขับขี่"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"การปล่อยสัญญาณหรือฮอตสปอตทำงานอยู่"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"แตะเพื่อตั้งค่า"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ปิดใช้การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือแล้ว"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"ไดรฟ์ USB ของ <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"ที่เก็บข้อมูล USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"แก้ไข"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"การแจ้งเตือนการใช้อินเทอร์เน็ต"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"แตะเพื่อดูการใช้งานและการตั้งค่า"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"ถึงขีดจำกัดข้อมูล 2G-3G แล้ว"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"ถึงขีดจำกัดข้อมูล 4G แล้ว"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"เตือนปริมาณอินเทอร์เน็ต"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"คุณใช้อินเทอร์เน็ตไป <xliff:g id="APP">%s</xliff:g>"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"ถึงขีดจำกัดอินเทอร์เน็ตมือถือ"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ถึงขีดจำกัดข้อมูล Wi-Fi แล้ว"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"หยุดข้อมูลที่เหลือในรอบชั่วคราว"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"เกินขีดจำกัดข้อมูล 2G - 3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"เกินขีดจำกัดของข้อมูล 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"เกินขีดจำกัดข้อมูลมือถือ"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"เกินขีดจำกัดข้อมูล WiFi แล้ว"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> เกินขีดจำกัดที่ระบุไว้"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"หยุดใช้อินเทอร์เน็ตชั่วคราวสำหรับระยะเวลาที่เหลือในรอบบิล"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"เกินปริมาณเน็ตมือถือที่กำหนดไว้"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"เกินขีดจำกัดของข้อมูล Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"คุณใช้อินเทอร์เน็ตเกินไป <xliff:g id="SIZE">%s</xliff:g> จากปริมาณที่กำหนดไว้"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"จำกัดข้อมูลแบ็กกราวด์"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"แตะเพื่อนำข้อจำกัดออก"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"ปริมาณการใช้อินเทอร์เน็ตสูง"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"ปริมาณการใช้อินเทอร์เน็ตในช่วง 2-3 วันที่ผ่านมาสูงกว่าปกติ แตะเพื่อดูปริมาณการใช้และการตั้งค่า"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"ปริมาณการใช้เน็ตมือถือสูง"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"แอปของคุณใช้อินเทอร์เน็ตมากกว่าปกติ"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> ใช้อินเทอร์เน็ตมากกว่าปกติ"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"ใบรับรองความปลอดภัย"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ใบรับรองนี้ใช้งานได้"</string>
<string name="issued_to" msgid="454239480274921032">"ออกให้แก่:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"ติดตั้งโดยผู้ดูแลระบบ"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"อัปเดตโดยผู้ดูแลระบบ"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ลบโดยผู้ดูแลระบบ"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"เพื่อช่วยปรับปรุงอายุการใช้งานแบตเตอรี่ โหมดประหยัดแบตเตอรี่จะลดการทำงานของอุปกรณ์และจำกัดการสั่น บริการตำแหน่ง และข้อมูลแบ็กกราวด์ส่วนใหญ่ สำหรับอีเมล การรับส่งข้อความ และแอปอื่นๆ ที่ใช้การซิงค์จะไม่อัปเดตหากคุณไม่เปิดขึ้นมา\n\nโหมดประหยัดแบตเตอรี่จะปิดโดยอัตโนมัติขณะชาร์จอุปกรณ์"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"เพื่อช่วยลดปริมาณการใช้อินเทอร์เน็ต โปรแกรมประหยัดอินเทอร์เน็ตจะช่วยป้องกันไม่ให้บางแอปส่งหรือรับข้อมูลเครือข่ายมือถือในการทำงานเบื้องหลัง แอปที่คุณกำลังใช้งานสามารถเข้าถึงข้อมูลเครือข่ายมือถือได้ แต่อาจไม่บ่อยเท่าเดิม ตัวอย่างเช่น ภาพต่างๆ จะไม่แสดงจนกว่าคุณจะแตะที่ภาพเหล่านั้น"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"เปิดการประหยัดอินเทอร์เน็ตไหม"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"เปิด"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">เป็นเวลา %1$d นาที (จนถึง <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">เป็นเวลา 1 นาที (จนถึง <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">ระยะเวลา %1$d ชั่วโมง (จนถึงเวลา <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">ระยะเวลา 1 ชั่วโมง (จนถึงเวลา <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">ระยะเวลา %1$d ชั่วโมง (จนถึง <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">ระยะเวลา 1 ชั่วโมง (จนถึง <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">เป็นเวลา %1$d ชม. (จนถึง <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,7 +1705,7 @@
<item quantity="other">เป็นเวลา %d นาที</item>
<item quantity="one">เป็นเวลา 1 นาที</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">ระยะเวลา %d ชั่วโมง</item>
<item quantity="one">ระยะเวลา 1 ชั่วโมง</item>
</plurals>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"ปิดเสียงโดย <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง อุปกรณ์อาจทำงานไม่เสถียรจนกว่าคุณจะรีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง โปรดติดต่อผู้ผลิตเพื่อขอรายละเอียดเพิ่มเติม"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"คำขอ USSD ได้รับการแก้ไขให้เป็นคำขอ DIAL"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"คำขอ USSD ได้รับการแก้ไขให้เป็นคำขอ SS"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"คำขอ USSD ได้รับการแก้ไขให้เป็นคำขอ USSD ใหม่"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"คำขอ USSD ได้รับการแก้ไขให้เป็นคำขอ Video DIAL"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"คำขอ SS ได้รับการแก้ไขให้เป็นคำขอ DIAL"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"คำขอ SS ได้รับการแก้ไขให้เป็นคำขอ Video DIAL"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"คำขอ SS ได้รับการแก้ไขให้เป็นคำขอ USSD"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"คำขอ SS ได้รับการแก้ไขให้เป็นคำขอ SS ใหม่"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"โปรไฟล์งาน"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ขยาย"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ยุบ"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ตรวจพบแอปที่เป็นอันตราย"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ต้องการแสดงส่วนต่างๆ ของ <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"แก้ไข"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"สายเรียกเข้าและการแจ้งเตือนจะสั่น"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"สายเรียกเข้าและการแจ้งเตือนจะไม่ส่งเสียง"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"การเปลี่ยนแปลงระบบ"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ห้ามรบกวน"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"โหมดห้ามรบกวนซ่อนการแจ้งเตือนไว้เพื่อให้คุณจดจ่อกับสิ่งที่สนใจได้"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"นี่คือการทำงานใหม่ แตะเพื่อเปลี่ยน"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"เปลี่ยน \"ห้ามรบกวน\" แล้ว"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"แตะเพื่อตรวจหาการรบกวนในการตั้งค่าพฤติกรรม"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"แตะเพื่อดูรายการที่ถูกบล็อก"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"ระบบ"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"การตั้งค่า"</string>
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 73a1146ecc5f..cb5646915e7a 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"‏کالر ID کی ڈیفالٹ ترتیب غیر محدود کردہ ہے۔ اگلی کال: غیر محدود کردہ"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"سروس فراہم نہیں کی گئی۔"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"‏آپ کالر ID کی ترتیبات تبدیل نہیں کر سکتے ہیں۔"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"کوئی ڈیٹا سروس نہیں"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"کوئی ایمرجنسی کالنگ نہیں ہے"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"کوئی موبائل ڈیٹا سروس دستیاب نہیں ہے"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"ہنگامی کالنگ دستیاب نہیں ہے"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"کوئی صوتی سروس نہیں"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"کوئی صوتی/ہنگامی سروس نہیں"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"عارضی طور پر آپ کے مقام پر موبائل نیٹ ورک کی طرف سے پیش نہیں ہے"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"نیٹ ورک تک نہیں پہنچا جا سکتا"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"ریسپشن کو بہتر بنانے کیلئے، ترتیبات &gt; نیٹ ورک اور انٹرنیٹ &gt; موبائل نیٹ ورکس &gt; ترجیحی نیٹ ورک کی قسم تبدیل کر کے دیکھیں۔"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"‏Wi-Fi کالنگ فعال ہے"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"ہنگامی کالز کو موبائل نیٹ ورک کی ضرورت ہے۔"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"کوئی صوتی سروس یا ہنگامی کالنگ دستیاب نہیں ہے"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"آپ کے کیریئر نے عارضی طور پر آف کر دیا ہے"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"موبائل نیٹ ورک تک رسائی نہیں ہو سکتی"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ترجیحی نیٹ ورک تبدیل کر کے دیکھیں۔ تبدیل کرنے کے لیے تھپتھپائیں۔"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ہنگامی کالنگ دستیاب نہیں ہے"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"‏Wi‑Fi کے ذریعے ہنگامی کالز نہیں کر سکتے"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"الرٹس"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"کال آگے منتقل کرنا"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ہنگامی کال بیک وضع"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"رومنگ بینر آن ہے"</string>
<string name="roamingText12" msgid="1189071119992726320">"رومنگ بینر آف"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"سروس کی تلاش کر رہا ہے"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"‏Wi-Fi کالنگ"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"‏Wi-Fi سے کالز کرنے اور پیغامات بھیجنے کے لیے، پہلے اپنے کیریئر سے اس سروس کو سیٹ اپ کرنے کے لیے کہیں۔ پھر ترتیبات سے دوبارہ Wi-Fi کالنگ آن کریں۔ (خراب کوڈ: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"اپنے کیریئر (خرابی کا کوڈ: <xliff:g id="CODE">%1$s</xliff:g>) کے ساتھ رجسٹر کریں"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"‎%s"</item>
<item msgid="4397097370387921767">"‏‎%s Wi-Fi کالنگ"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"کافی زیادہ درخواستوں پر کارروائی کی جا رہے ہے۔ بعد میں دوبارہ کوشش کریں۔"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> کیلئے سائن ان کی خرابی"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"مطابقت پذیری کریں"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"مطابقت پذیری کریں"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"کافی زیادہ <xliff:g id="CONTENT_TYPE">%s</xliff:g> حذف کرتا ہے۔"</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"ٹیبلیٹ اسٹوریج بھرا ہوا ہے. جگہ خالی کرنے کیلئے کچھ فائلیں حذف کریں۔"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"دیکھنے کا اسٹوریج بھرا ہوا ہے۔ جگہ خالی کرنے کیلئے کچھ فائلیں حذف کریں۔"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"‏TV اسٹوریج بھرا ہوا ہے۔ جگہ خالی کرنے کیلئے کچھ فائلیں حذف کریں۔"</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"آپ کے دفتری پروفائل منتظم کے ذریعہ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> کے لحاظ سے"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"دفتری پروفائل حذف کر دیا گیا"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"گمشدہ منتظم ایپ کی وجہ سے دفتری پروفائل حذف کر دیا گیا"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"دفتری پروفائل کی منتظم ایپ یا تو غائب ہے یا خراب ہے۔ اس کی وجہ سے، آپ کا دفتری پروفائل اور متعلقہ ڈیٹا حذف کر دیے گئے ہیں۔ مدد کیلئے اپنے منتظم سے رابطہ کریں۔"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"آپ کا دفتری پروفائل اس آلہ پر مزید دستیاب نہیں ہے"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"پاس ورڈ کی بہت ساری کوششیں"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"آلہ زیر انتظام ہے"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"آپ کی تنظیم اس آلے کا نظم کرتی ہے اور وہ نیٹ ورک ٹریفک کی نگرانی کر سکتی ہے۔ تفاصیل کیلئے تھپتھپائیں۔"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"آپ کا آلہ صاف کر دیا جائے گا"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"منتظم کی ایپ استعمال نہیں کی جا سکتی۔ آپ کا آلہ اب مٹا دیا جائے گا۔\n\nاگر آپ کے پاس سوالات ہیں، تو اپنی تنظیم کے منتظم سے رابطہ کریں۔"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"منتظم کی ایپ استعمال نہیں کی جا سکتی۔ آپ کا آلہ اب مٹا دیا جائے گا۔\n\nاگر آپ کے سوالات ہیں تو اپنی تنظیم کے منتظم سے رابطہ کریں۔"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> نے پرنٹنگ کو غیر فعال کر دیا ہے۔"</string>
<string name="me" msgid="6545696007631404292">"میں"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"ٹیبلیٹ کے اختیارات"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ہوائی جہاز وضع"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ہوائی جہاز وضع آن ہے"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ہوائی جہاز وضع آف ہے"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"بیٹری سیور"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"بیٹری سیور آف ہے"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"بیٹری سیور آن ہے"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ترتیبات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"اسسٹ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"دفتری پروفائل پر سوئچ کریں"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"رابطے"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"اپنے رابطوں تک رسائی حاصل کریں"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو اپنے رابطوں تک رسائی کی اجازت دیں"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"مقام"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"اس آلہ کے مقام تک رسائی حاصل کریں"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو اس آلہ کے مقام تک رسائی کی اجازت دیں"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"کیلنڈر"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"اپنے کیلنڈر تک رسائی حاصل کریں"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو اپنے کیلنڈر تک رسائی کی اجازت دیں"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"‏SMS پیغامات بھیجیں اور دیکھیں"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو SMS پیغامات بھیجنے اور انہیں ملاحظہ کرنے کی اجازت دیں"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"اسٹوریج"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"اپنے آلہ پر تصاویر، میڈیا اور فائلوں تک رسائی حاصل کریں"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو اپنے آلہ پر تصاویر، میڈیا اور فائلوں تک رسائی کی اجازت دیں"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"مائکروفون"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"آڈیو ریکارڈ کریں"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو آڈیو ریکارڈ کرنے کی اجازت دیں"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"کیمرا"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"تصاویر لیں اور ویڈیو ریکارڈ کریں"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو تصویر لینے اور ویڈیو ریکارڈ کرنے کی اجازت دیں"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"فون"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"فون کالز کریں اور ان کا نظم کریں"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"‏&lt;/b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو فون کالز کرنے اور ان کا نظم کرنے کی اجازت دیں"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"جسم سینسرز"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"اپنی علامات حیات کے متعلق سنسر ڈیٹا تک رسائی حاصل کریں"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو اپنی علامات حیات کے متعلق سنسر ڈیٹا تک رسائی کی اجازت دیں"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ونڈو مواد بازیافت کرنے کی"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"کسی ایسی ونڈو کے مواد کا معائنہ کریں جس کے ساتھ آپ تعامل کر رہے ہیں۔"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ٹچ کے ذریعے دریافت کریں کو آن کرنے کی"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"اشارے انجام دیں"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"تھپتھپانا، سوائپ کرنا، چٹکی بھرنا اور دیگر اشارے انجام دے سکتی ہے"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"فنگرپرنٹ کے اشارے"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"آلات کے فنگر پرنٹ سینسر پر کیے گئے اشاروں کو کیپچر کر سکتا ہے۔"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"آلہ کے فنگر پرنٹ سینسر پر کیے گئے اشاروں کو کیپچر کر سکتا ہے۔"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"اسٹیٹس بار کو غیر فعال یا اس میں ترمیم کریں"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"ایپ کو اسٹیٹس بار غیر فعال کرنے یا سسٹم آئیکنز شامل کرنے اور ہٹانے کی اجازت دیتا ہے۔"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"بطور اسٹیٹس بار کام لیں"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ایپ کو خود اپنے ہی حصوں کو میموری میں استقلال پذیر بنانے کی اجازت دیتا ہے۔ یہ ٹیبلٹ کو سست بناکر دوسری ایپس کیلئے دستیاب میموری کو محدود کرسکتا ہے۔"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"‏ایپ کو خود اپنے ہی حصوں کو میموری میں استقلال پذیر بنانے کی اجازت دیتا ہے۔ یہ TV کو سُست بناکر دوسری ایپس کیلئے دستیاب میموری کو محدود کرسکتا ہے۔"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ایپ کو خود اپنے ہی حصوں کو میموری میں استقلال پذیر بنانے کی اجازت دیتا ہے۔ یہ فون کو سست بناکر دوسری ایپس کیلئے دستیاب میموری کو محدود کرسکتا ہے۔"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"پیش منظر سروس چلائیں"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"ایپ کو پیش منظر سروسز کے استعمال کی اجازت دیتا ہے۔"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"ایپ اسٹوریج کی جگہ کی پیمائش کریں"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"ایپ کو اپنے کوڈ، ڈیٹا اور کیش کے سائزوں کی بازیافت کرنے دیتا ہے"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"سسٹم کی ترتیبات میں ترمیم کریں"</string>
@@ -657,7 +671,7 @@
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
<string name="phoneTypeWorkMobile" msgid="1311426989184065709">"دفتر کا موبائل"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"دفتر کا پیجر"</string>
- <string name="phoneTypeAssistant" msgid="5596772636128562884">"معاون"</string>
+ <string name="phoneTypeAssistant" msgid="5596772636128562884">"اسسٹنٹ"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
<string name="eventTypeCustom" msgid="7837586198458073404">"حسب ضرورت"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"یوم پیدائش"</string>
@@ -690,7 +704,7 @@
<string name="orgTypeOther" msgid="3951781131570124082">"دیگر"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"حسب ضرورت"</string>
<string name="relationTypeCustom" msgid="3542403679827297300">"حسب ضرورت"</string>
- <string name="relationTypeAssistant" msgid="6274334825195379076">"معاون"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"اسسٹنٹ"</string>
<string name="relationTypeBrother" msgid="8757913506784067713">"بھائی"</string>
<string name="relationTypeChild" msgid="1890746277276881626">"بچہ"</string>
<string name="relationTypeDomesticPartner" msgid="6904807112121122133">"گھریلو پارٹنر"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"پیٹرن کے ذریعے غیر مقفل کریں۔"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"چہرے کے ذریعے غیر مقفل کریں۔"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"پن کے ذریعے غیر مقفل کریں۔"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"‏Sim پن غیر مقفل۔"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"‏Sim Puk غیر مقفل۔"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"پاس ورڈ کے ذریعہ غیر مقفل کریں۔"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"پیٹرن کا علاقہ۔"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"سلائیڈ کرنے کا علاقہ۔"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"متن کو کلپ بورڈ پر کاپی کیا گیا۔"</string>
<string name="more_item_label" msgid="4650918923083320495">"مزید"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"مینو+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+‎"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+‎"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+‎"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+‎"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+‎"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+‎"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"اپ ڈیٹ چیک کریں"</string>
<string name="smv_application" msgid="3307209192155442829">"‏ایپ <xliff:g id="APPLICATION">%1$s</xliff:g> (کارروائی <xliff:g id="PROCESS">%2$s</xliff:g>) نے خود نافذ کی گئی StrictMode پالیسی کی خلاف ورزی کی ہے۔"</string>
<string name="smv_process" msgid="5120397012047462446">"‏کارروائی <xliff:g id="PROCESS">%1$s</xliff:g> نے اپنی ذاتی طور پر نافذ کردہ StrictMode پلیسی کی خلاف ورزی کی ہے۔"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"‏Android اپ گریڈ ہو رہا ہے…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"‏Android شروع ہو رہا ہے…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"فون اپ ڈیٹ ہو رہا ہے…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"ٹیبلٹ اپ ڈیٹ ہو رہا ہے…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"آلہ اپ ڈیٹ ہو رہا ہے…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"فون شروع ہو رہا ہے…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"ٹیبلیٹ شروع ہو رہا ہے…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"آلہ شروع ہو رہا ہے…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"اسٹوریج کو بہترین بنایا جا رہا ہے۔"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"‏Android اپ ڈیٹ ختم ہو رہی ہے…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"اپ گریڈ ختم ہونے تک شاید کچھ ایپس ٹھیک طرح سے کام نہ کریں"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"سسٹم اپ ڈیٹ مکمل ہو رہا ہے…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> اپ گریڈ ہو رہی ہے…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"ایپ <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g> کو بہتر بنایا جا رہا ہے۔"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> تیار ہو رہی ہے۔"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ایپس شروع ہو رہی ہیں۔"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"بوٹ مکمل ہو رہا ہے۔"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> چل رہی ہے"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"گیم پر واپس جانے کے لیے تھپتھپائیں"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"گیم کا انتخاب کریں"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"بہتر کارکردگی کے لیے، ایک وقت میں ان گیمز میں سے صرف ایک ہی گیم کھولا جا سکتا ہے۔"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> پر واپس جائیں"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> کھوليں"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> محفوظ کیے بغیر بند ہو جائے گی"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> میموری کی حد سے تجاوز کرگئی"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ہیپ ڈمپ جمع ہو گیا ہے، اشتراک کرنے کیلئے تھپتھپائیں"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"ہیپ ڈمپ کا اشتراک کریں؟"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"کارروائی <xliff:g id="PROC">%1$s</xliff:g> اپنی کارروائی کی میموری کی حد <xliff:g id="SIZE">%2$s</xliff:g> سے تجاوز کر گئی ہے۔ آپ کیلئے ایک ہیپ ڈمپ اس کے ڈیولپر سے اشتراک کرنے کیلئے دستیاب ہے۔ احتیاط برتیں: اس ہیپ ڈمپ میں آپ کی ایسی ذاتی معلومات میں سے کوئی بھی شامل ہو سکتی ہے جس تک ایپلیکیشن کو رسائی ہے۔"</string>
<string name="sendText" msgid="5209874571959469142">"متن کیلئے ایک کارروائی منتخب کریں"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"‏عوامی Wi‑Fi نیٹ ورک سے منسلک ہوں"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"‏کیریئر Wi‑Fi نیٹ ورک سے منسلک ہوں"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"‏عوامی Wi‑Fi نیٹ ورک سے منسلک ہو رہا ہے"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"‏عوامی Wi‑Fi نیٹ ورک سے منسلک ہو گيا"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"‏Wi‑Fi نیٹ ورک سے منسلک نہیں ہو سکا"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"تمام نیٹ ورکس دیکھنے کیلئے تھپتھپائيں"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"منسلک کریں"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"تمام نیٹ ورکس"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"سبھی نیٹ ورکس"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"‏Wi‑Fi از خود آن ہو جائے گا"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"جب آپ اعلی معیار کے محفوظ کردہ نیٹ ورک کے قریب ہوں"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"دوبارہ آن نہ کریں"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"دوبارہ شروع کریں"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"موبائل سروس فعال کریں"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"‏اپنا نیا SIM فعال کرنے کیلئے کیریئر ایپ ڈاؤن لوڈ کریں"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"‏اپنا نیا SIM فعال کرنے کیلئے <xliff:g id="APP_NAME">%1$s</xliff:g> ایپ ڈاؤن لوڈ کریں"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ایپ ڈاؤن لوڈ کریں"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"‏نئی SIM داخل ہو گئی"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"اسے سیٹ اپ کرنے کیلئے تھپتھپائیں"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"‏USB کے ذریعے PTP آن ہے"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"‏USB ٹیدرنگ آن ہے"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"‏USB کے ذریعے MIDI آن ہے"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"‏USB لازمہ وضع آن ہے"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"‏USB کے لوازم منسلک ہیں"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"مزید اختیارات کیلئے تھپتھپائیں۔"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"منسلکہ آلہ کو چارج کیا جا رہا ہے۔ مزید اختیارات کے لئے تھپتھپائيں۔"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"اینالاگ آڈیو کے لوازم کا پتہ چلا"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"منسلک آلہ اس فون کے موافق نہیں ہے۔ مزید جاننے کے لیے تھپتھپائیں۔"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"‏USB ڈیبگ کرنا مربوط ہو گیا"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"‏USB ڈیبگنگ کو غیر فعال کرنے کیلئے تھپتھپائیں۔"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"‏USB ڈیبگنگ آف کرنے کے لیے تھپتھپائیں"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"‏USB ڈیبگ کرنے کو غیر فعال کرنے کیلئے منتخب کریں۔"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"بگ رپورٹ لی جا رہی ہے…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"بگ رپورٹ کا اشتراک کریں؟"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> کو دیگر ایپس پر دکھایا کیا جا رہا ہے"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> دیگر ایپس پر ڈسپلے ہو رہی ہے"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کیلئے تھپتھپائیں اور اسے بند کریں۔"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"آف کریں"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"آف کریں"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> تیار کیا جا رہا ہے"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"خرابیوں کیلئے چیک کیا جا رہا ہے"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"نئے <xliff:g id="NAME">%s</xliff:g> کا پتا چلا"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"‏ہمیشہ آن VPN مربوط ہو رہا ہے…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"‏ہمیشہ آن VPN مربوط ہوگیا"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"‏ہمیشہ آن VPN سے غیر منسلک ہو گيا"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"‏ہمیشہ آن VPN کی خرابی"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"‏نیٹ ورک یا VPN کی ترتیبات تبدیل کریں"</string>
<string name="upload_file" msgid="2897957172366730416">"فائل منتخب کریں"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"کوئی فائل منتخب نہیں کی گئی"</string>
<string name="reset" msgid="2448168080964209908">"دوبارہ ترتیب دیں"</string>
<string name="submit" msgid="1602335572089911941">"جمع کرائیں"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"کار وضع فعال ہے"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"کار موڈ سے خارج ہونے کیلئے تھپتھپائیں۔"</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"ٹیدرنگ یا ہاٹ اسپاٹ فعال"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"ٹیدرنگ غیر فعال ہے"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"‏<xliff:g id="MANUFACTURER">%s</xliff:g> USB ڈرائیو"</string>
<string name="storage_usb" msgid="3017954059538517278">"‏USB اسٹوریج"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ترمیم کریں"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"ڈیٹا کے استعمال کا الرٹ"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"استعمال اور ترتیبات دیکھنے کیلئے تھپتھپائیں۔"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"‏2G-3G ڈیٹا کی حد کو پہنچ گیا"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"‏4G ڈیٹا کی حد کو پہنچ گیا"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"ڈیٹا وارننگ"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"آپ نے <xliff:g id="APP">%s</xliff:g> ڈیٹا استعمال کر لیا ہے"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"موبائل ڈیٹا کی حد کو پہنچ گیا"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"‏Wi-Fi ڈیٹا کی حد کو پہنچ گیا"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"باقی دور کیلئے ڈیٹا موقوف کر دیا"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"‏2G-3G ڈیٹا حد سے متجاوز ہو گیا"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"‏4G ڈیٹا حد سے متجاوز ہو گیا"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"موبائل ڈیٹا حد سے متجاوز ہو گیا"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"‏Wi-Fi ڈیٹا حد سے متجاوز ہو گیا"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> متعینہ حد سے زیادہ ہے۔"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"آپ کے باقی دور کیلئے ڈیٹا موقوف کر دیا گیا ہے"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"آپ کے موبائل ڈیٹا کی حد سے زیادہ"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"‏آپ کے Wi-Fi ڈیٹا کی حد سے زیادہ"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"آپ اپنی متعین حد سے <xliff:g id="SIZE">%s</xliff:g> تجاوز کر گئے ہیں"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"پس منظر ڈیٹا محدود ہے"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"حد بندی ہٹانے کیلئے تھپتھپائیں۔"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"ڈیٹا کا زیادہ استعمال"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"پچھلے چند دنوں میں آپ کے ڈیٹا کا استعمال معمول سے زیادہ ہو گیا ہے۔ استعمال اور ترتیبات دیکھنے کیلئے تھپتھپائیں۔"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"موبائل ڈیٹا کا زیادہ استعمال"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"آپ کی ایپس نے معمول سے زیادہ ڈیٹا استعمال کیا ہے"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> نے معمول سے زیادہ ڈیٹا استعمال کیا ہے"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"سیکیورٹی سرٹیفیکیٹ"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"یہ سرٹیفکیٹ درست ہے۔"</string>
<string name="issued_to" msgid="454239480274921032">"جاری کردہ بنام:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"آپ کے منتظم کے ذریعے انسٹال کیا گیا"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"آپ کے منتظم کے ذریعے اپ ڈیٹ کیا گیا"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"آپ کے منتظم کے ذریعے حذف کیا گیا"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"بیٹری کی میعاد بہتر بنانے میں مدد کرنے کیلئے، بیٹری سیور آپ کے آلہ کی کارکردگی کم کر دیتی ہے اور وائبریشن، مقام کی سروسز اور پس منظر کا بیشتر ڈیٹا محدود کر دیتی ہے۔ ای میل، پیغام رسانی اور مطابقت پذیری پر منحصر دیگر ایپس ممکن ہے اس وقت تک اپ ڈیٹ نہ ہوں جب تک آپ انہیں نہ کھولیں۔\n\nآلہ چارج ہوتے وقت بیٹری سیور خود بخود آف ہو جاتی ہے۔"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"ڈیٹا کے استعمال کو کم کرنے میں مدد کیلئے، ڈیٹا سیور پس منظر میں کچھ ایپس کو ڈیٹا بھیجنے یا موصول کرنے سے روکتا ہے۔ آپ جو ایپ فی الحال استعمال کر رہے ہیں وہ ڈیٹا پر رسائی کر سکتی ہے مگر ہو سکتا ہے ایسا زیادہ نہ ہو۔ اس کا مطلب مثال کے طور پر یہ ہو سکتا ہے کہ تصاویر تھپتھپانے تک ظاہر نہ ہوں۔"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ڈیٹا سیور آن کریں؟"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"آن کریں"</string>
@@ -1682,9 +1705,9 @@
<item quantity="other">‏%1$d منٹ کیلئے (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> تک)</item>
<item quantity="one">1 منٹ کیلئے (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> تک)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">‏%1$d گھنٹے کیلئے (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> تک)</item>
- <item quantity="one">ایک گھنٹہ کیلئے (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> تک)</item>
+ <item quantity="one">1 گھنٹے کیلئے (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> تک)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">‏‎%1$d گھنٹے کیلئے (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> تک)</item>
@@ -1698,9 +1721,9 @@
<item quantity="other">‏‎%d منٹ کیلئے</item>
<item quantity="one">1 منٹ کیلئے</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">‏‎%d گھنٹے کیلئے</item>
- <item quantity="one">ایک گھنٹہ کیلئے</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">‏%d گھنٹے کیلئے</item>
+ <item quantity="one">1 گھنٹے کیلئے</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">‏‎%d گھنٹے کیلئے</item>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> کے ذریعے خاموش کردہ"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"آپ کے آلہ میں ایک داخلی مسئلہ ہے اور جب تک آپ فیکٹری ڈیٹا کو دوبارہ ترتیب نہیں دے دیتے ہیں، ہوسکتا ہے کہ یہ غیر مستحکم رہے۔"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"آپ کے آلہ میں ایک داخلی مسئلہ ہے۔ تفصیلات کیلئے اپنے مینوفیکچرر سے رابطہ کریں۔"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"‏USSD درخواست میں ترمیم کر کے DIAL درخواست بنا دی گئی ہے۔"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"‏USSD درخواست میں ترمیم کر کے SS درخواست بنا دی گئی ہے۔"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"‏USSD درخواست میں ترمیم کر کے نئی USSD درخواست بنا دی گئی ہے۔"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"‏USSD درخواست کو ویڈیو DIAL درخواست میں تبدیل کر دیا گیا ہے۔"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"‏SS درخواست میں ترمیم کر کے DIAL درخواست بنا دی گئی ہے۔"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"‏SS درخواست کو ویڈیو DIAL درخواست میں تبدیل کر دیا گیا ہے۔"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"‏SS درخواست میں ترمیم کر کے USSD درخواست بنا دی گئی ہے۔"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"‏SS درخواست میں ترمیم کر کے نئی SS درخواست بنا دی گئی ہے۔"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"دفتری پروفائل"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"پھیلائیں"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"سکیڑیں"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ضرر رساں ایپ کا پتہ چلا"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> کے سلائسز دکھانا چاہتی ہے"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ترمیم کریں"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"کالز اور اطلاعات پر وائبریٹ کرے گا"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"کالز اور اطلاعات کی آواز خاموش کر دی جائے گی"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"سسٹم کی تبدیلیاں"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ڈسٹرب نہ کریں"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"توجہ مرکوز کرنے میں آپ کی مدد کرنے کے لیے، \'ڈسٹرب نہ کریں\' اطلاعات کو چھپا رہی ہے"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"یہ نیا برتاؤ ہے۔ تبدیل کرنے کے لیے تھتھپائيں۔"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ڈسٹرب نہ کریں\' تبدیل ہو گيا ہے"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"مداخلتوں کے مد نظر اپنے برتاؤ کی ترتیبات چیک کرنے کیلئے تھپتھپائیں"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"مسدود کی گئی چیزوں کو چیک کرنے کے لیے تھپتھپائیں۔"</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 3d48f843497f..9776eeb54382 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Qo‘ng‘iroq qiluvchi ma’lumotlari cheklanmagan. Keyingi qo‘ng‘iroq: cheklanmagan"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Xizmat ishalamaydi."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Qo‘ng‘iroq qiluvchining ID raqami sozlamasini o‘zgartirib bo‘lmaydi."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Mobil internet ishlamaydi"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Favqulodda chaqiruvlar ishlamaydi"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Mobil internet ishlamayapti"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Favqulodda chaqiruv ishlamayapti"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ovozli chaqiruvlar ishlamaydi"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ovozli va favqulodda chaqiruvlar ishlamaydi"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Hududingizda mobil tarmoq tomonidan vaqtinchalik taklif etilmayapti"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tarmoq bilan bog‘lanib bo‘lmadi"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Qabul qilish sifatini yaxshilash uchun Sozlamalar &gt; Tarmoq va Internet &gt; Mobil tarmoqlar > Asosiy tarmoq turi orqali o‘zgartirib ko‘ring."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi chaqiruv faol"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Favqulodda chaqiruvlar uchun mobil internet zarur."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ovozli yoki favqulodda chaqiruvlar ishlamayapti"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Aloqa operatoringiz tomonidan vaqtinchalik faolsizlantirilgan"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobil tarmoqqa ulanib bo‘lmadi"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tarmoq turini almashtiring. Almashtirish uchun bosing."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Favqulodda chaqiruv ishlamayapti"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Wi‑Fi orqali favqulodda chaqiruvlar amalga oshirilmadi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ogohlantirishlar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Chaqiruvlarni uzatish"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Favqulodda qaytarib chaqirish rejimi"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Rouming banneri yoqilgan"</string>
<string name="roamingText12" msgid="1189071119992726320">"Rouming banneri o‘chirilgan"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Xizmatlar qidirilmoqda"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi qo‘ng‘iroq"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Wi-Fi orqali qo‘ng‘iroqlarni amalga oshirish va xabarlar bilan almashinish uchun uyali aloqa operatoringizdan ushbu xizmatni yoqib qo‘yishni so‘rashingiz lozim. Keyin sozlamalarda Wi-Fi qo‘ng‘irog‘i imkoniyatini yoqib olishingiz mumkin. (Xato kodi: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Aloqa operatoringiz bilan ro‘yxatdan o‘ting (Xato kodi: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi qo‘ng‘iroqlar"</item>
@@ -160,8 +159,10 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Juda ko‘p so‘rovlar amalga oshirilmoqda. Keyinroq urinib ko‘ring."</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> hisobiga kirishda xato"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Sinx."</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinx."</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Juda ko‘p <xliff:g id="CONTENT_TYPE">%s</xliff:g> o‘chirishlar."</string>
+ <!-- no translation found for contentServiceSyncNotificationTitle (7036196943673524858) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (4884451152168188763) -->
+ <skip />
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Planshet xotirasi to‘la. Joy bo‘shatish uchun ba’zi fayllarni o‘chiring."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Soat xotirasi to‘lgan. Joy bo‘shatish uchun ba’zi fayllarni o‘chiring."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Televizor xotirasi to‘lgan. Joy bo‘shatish uchun ba’zi fayllarni o‘chiring."</string>
@@ -174,14 +175,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Ishchi profil administratori"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tomonidan"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Ichshi profil o‘chirildi"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Administrator ilovasi yo‘qligi sababli ishchi profil o‘chirib tashlandi"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Ishchi profilning administrator ilovasi yo‘q yoki buzilgan. Shuning uchun, ishchi profilingiz va unga aloqador ma’lumotlar o‘chirib tashlandi. Yordam olish uchun administratoringizga murojaat qiling."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Bu qurilmada endi ishchi profilingiz mavjud emas"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Parol ko‘p marta xato kiritildi"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Bu – boshqariladigan qurilma"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Tashkilotingiz bu qurilmani boshqaradi va tarmoq trafigini nazorat qilishi mumkin. Tafsilotlar uchun bosing."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Qurilmangizdagi ma’lumotlar o‘chirib tashlanadi"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Administrator ilovasini ishlatib bo‘lmaydi. Qurilmada barcha ma’lumotlar o‘chirib tashlanadi.\n\nSavollaringiz bo‘lsa, administrator bilan bog‘laning."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Administrator ilovasini ishlatib bo‘lmaydi. Qurilmada barcha ma’lumotlar o‘chirib tashlanadi.\n\nSavollaringiz bo‘lsa, administrator bilan bog‘laning."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"Chop etish funksiyasi <xliff:g id="OWNER_APP">%s</xliff:g> tomonidan faolsizlantirilgan."</string>
<string name="me" msgid="6545696007631404292">"Men"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Planshet sozlamalari"</string>
@@ -236,6 +236,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Parvoz rejimi"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Parvoz usuli yoqilgan"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Parvoz rejimi o‘chirilgan"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Quvvat tejash rejimi"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Quvvatni tejash rejimi O‘CHIQ"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Quvvat tejash rejimi YONIQ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Sozlamalar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Yordam"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ovozli yordam"</string>
@@ -269,31 +272,40 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Ishchi profilga almashtirish"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktlar"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"kontaktlarga kirish"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun kontaktlaringizga ruxsat berish"</string>
+ <!-- no translation found for permgrouprequest_contacts (6032805601881764300) -->
+ <skip />
<string name="permgrouplab_location" msgid="7275582855722310164">"Joylashuv"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"shu qurilmaning joylashuvi haqidagi axborotga kirish"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun bu qurilma joylashuv axborotidan foydalanishga ruxsat berish"</string>
+ <!-- no translation found for permgrouprequest_location (3788275734953323491) -->
+ <skip />
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Taqvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"taqvimingizga kirish"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun taqvimingizga ruxsat berish"</string>
+ <!-- no translation found for permgrouprequest_calendar (289900767793189421) -->
+ <skip />
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS xabarlarni yuborish va ko‘rish"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun SMS xabarlarni yuborish va ko‘rishga ruxsat berish"</string>
+ <!-- no translation found for permgrouprequest_sms (7168124215838204719) -->
+ <skip />
<string name="permgrouplab_storage" msgid="1971118770546336966">"Xotira"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"qurilmangizdagi surat, multimedia va fayllarga kirish"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun qurilmangizdagi surat, multimedia va fayllarga ruxsat berish"</string>
+ <!-- no translation found for permgrouprequest_storage (7885942926944299560) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ovoz yozib olish"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun audioni yozib olishga ruxsat berish"</string>
+ <!-- no translation found for permgrouprequest_microphone (9167492350681916038) -->
+ <skip />
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"suratga olish va video yozib olish"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun surat va videoga olishga ruxsat berish"</string>
+ <!-- no translation found for permgrouprequest_camera (1299833592069671756) -->
+ <skip />
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon qo‘ng‘iroqlarini amalga oshirish va boshqarish"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun telefon chaqiruvlarini amalga oshirish va boshqarishga ruxsat berish"</string>
+ <!-- no translation found for permgrouprequest_phone (9166979577750581037) -->
+ <skip />
<string name="permgrouplab_sensors" msgid="416037179223226722">"Tana sezgichlari"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"organizm holati haqidagi sezgich ma’lumotlariga kirish"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun organizm holati haqidagi sezgich ma’lumotlariga ruxsat berish"</string>
+ <!-- no translation found for permgrouprequest_sensors (6349806962814556786) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Oynadagi kontentni o‘qiydi"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Joriy oynadagi kontent mazmunini aniqlaydi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Teginib o‘rganish xizmatini yoqadi"</string>
@@ -305,7 +317,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Imo-ishoralar bilan boshqarish"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Bosish, surish; jipslashtirish va boshqa imo-ishoralarni amalga oshirish mumkin."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Barmoq izi ishoralari"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Barmoq izi skanerlarida kiritilgan ishoralarni taniy oladi."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Barmoq izi skanerida kiritilgan ishoralarni taniy oladi."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"holat panelini o‘zgartirish yoki o‘chirish"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Ilova holat panelini o‘chirib qo‘yishi hamda tizim ikonkalarini qo‘shishi yoki olib tashlashi mumkin."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"holat qatorida ko‘rinishi"</string>
@@ -356,6 +368,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ilovaga o‘zining komponentlarini xotirada doimiy saqlashga ruxsat beradi. Bu mavjud xotirani cheklashi va planshetni sekin ishlashiga sabab bo‘lishi mumkin."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Ilovaga o‘zining muayyan qismlarining xotiraning turg‘un qismiga aylantirish huquqini beradi. Bunda, boshqa ilovalar uchun xotiradan ajratilgan joy cheklanib, televizorning ishlashi sekinlashishi mumkin."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Ilovaga o‘zining komponentlarini xotirada doimiy saqlashga ruxsat beradi. Bu mavjud xotirani cheklashi va telefonni sekin ishlashiga sabab bo‘lishi mumkin."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"faol xizmatlarni ishga tushirish"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Ilovaga faol xizmatlardan foydalanishga ruxsat beradi."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"ilovalar egallagan xotira joyini hisoblash"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Ilova o‘zining kodi, ma’lumotlari va kesh o‘lchami to‘g‘risidagi ma’lumotlarni olishi mumkin"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"tizim sozlamalarini o‘zgartirish"</string>
@@ -802,6 +816,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Grafik kalit bilan ochish."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Qulfni yuzni tanitib ochish"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin qulfini ochish."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM kartani PIN kod bilan ochish."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM kartani PUK kod bilan ochish."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Parolli qulfni ochish."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Grafik kalit chiziladigan hudud."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Maydonni silang"</string>
@@ -863,6 +879,12 @@
<string name="text_copied" msgid="4985729524670131385">"Matn klipboardga nusxa olindi."</string>
<string name="more_item_label" msgid="4650918923083320495">"Yana"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menyu+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"delete"</string>
@@ -1074,31 +1096,29 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Yangilanish borligini tekshirish"</string>
<string name="smv_application" msgid="3307209192155442829">"“<xliff:g id="APPLICATION">%1$s</xliff:g>” ilovasi (jarayaon: <xliff:g id="PROCESS">%2$s</xliff:g>) o‘zining StrictMode qoidasini buzdi."</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> jarayoni o‘zining o‘zi-bajaruvchi StrictMode siyosatini buzdi."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android yangilanmoqda…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android ishga tushmoqda…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Telefon yangilanmoqda…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Planshet yangilanmoqda…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Qurilma yangilanmoqda…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Telefon ishga tushirilmoqda…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Planshet ishga tushirilmoqda…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Qurilma ishga tushirilmoqda…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Xotira optimallashtirilmoqda."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android yangilanishi tugay deb qoldi…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Yangilanish vaqtida ba’zi ilovalar to‘g‘ri ishlamasligi mumkin"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Tizimni yangilash tugay deb qoldi…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ilovasi yangilanmoqda…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Ilovalar optimallashtirilmoqda (<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g>)."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> tayyorlanmoqda."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Ilovalar ishga tushirilmoqda."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Tizimni yuklashni tugatish."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ishlamoqda"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"O‘yinga qaytish uchun bosing"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"O‘yinni tanlang"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Yaxshiroq samaradorlik uchun hozir shu o‘yinlardan faqat bittasini ochish mumkin."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"<xliff:g id="OLD_APP">%1$s</xliff:g> ilovasiga qaytish"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"<xliff:g id="NEW_APP">%1$s</xliff:g> ilovasini ochish"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> saqlanmasdan yopiladi"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> foydalanish uchun ajratilgan xotira chegarasidan o‘tib ketdi"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Hip-damp yaratildi; uni yuborish uchun bosing"</string>
+ <!-- no translation found for dump_heap_notification_detail (3993078784053054141) -->
+ <skip />
<string name="dump_heap_title" msgid="5864292264307651673">"Hip-damp ma’lumotlari bilan ulashasizmi?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> jarayoni o‘zi uchun ajratilgan <xliff:g id="SIZE">%2$s</xliff:g> xotira chegarasidan o‘tib ketdi. Ilova dasturchisi bilan ulashishingiz uchun hip-damp ma’lumotlari yig‘ilib qoldi. Ehtiyot bo\'ling: ushbu hip-dampda ilova uchun foydalanishga ruxsat berilgan shaxsiy ma’lumotlaringiz bo‘lishi mumkin."</string>
<string name="sendText" msgid="5209874571959469142">"Matn uchun amalni tanlash"</string>
@@ -1133,12 +1153,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ochiq Wi‑Fi tarmoqqa ulaning"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Aloqa operatori Wi-Fi tarmog‘iga ulanish"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ochiq Wi‑Fi tarmoqqa ulanilmoqda"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi tarmoqqa ulanildi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi tarmoqqa ulanib bo‘lmadi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Barcha tarmoqlarni ko‘rish uchun bosing"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Ulanish"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Barcha tarmoqlar"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Barcha tarmoqlar"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi avtomatik ravishda yoqiladi"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Saqlangan tarmoqlar ichidan signali yaxshisi hududida ekaningizda"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Qayta yoqilmasin"</string>
@@ -1205,6 +1226,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"O‘chirib yoqish"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobil xizmatni faollashtirish"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Yangi SIM kartani faollashtirish uchun aloqa operatori ilovasini yuklab oling"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Yangi SIM kartani faollashtirish uchun <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasini yuklab oling"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Ilovani yuklab olish"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Yangi SIM karta solindi"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Sozlash uchun bosing"</string>
@@ -1223,13 +1245,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB orqali PTP rejimi yoqildi"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"USB modem rejimi yoqildi"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"USB orqali MIDI rejimi yoqildi"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB qurilma ulandi"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"USB qurilma ulandi"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Boshqa parametrlarini ko‘rish uchun bosing."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Ulangan qurilma quvvatlanmoqda. Boshqa parametrlar uchun bosing."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogli audio uskuna aniqlandi"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Biriktirilgan qurilma mazkur telefon bilan mos emas. Batafsil axborot olish uchun bu yerga bosing."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozliklarni tuzatish"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Faolsizlantirish uchun bu yerga bosing."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"USB orqali nosozliklarni aniqlashni faolsizlantirish uchun bosing"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB orqali nosozliklarni tuzatishni o‘chirib qo‘yish uchun bosing."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Xatoliklar hisoboti olinmoqda…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Xatoliklar hisoboti yuborilsinmi?"</string>
@@ -1248,7 +1270,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochilgan"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochilgan"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ilovasi uchun bu funksiyani sozlamalar orqali o‘chirib qo‘yish mumkin."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"O‘CHIRIB QO‘YISH"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Faolsizlantirish"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> tayyorlanmoqda"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Xatolar qidirilmoqda"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yangi <xliff:g id="NAME">%s</xliff:g> kartasi aniqlandi"</string>
@@ -1334,14 +1356,17 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Ulanmoqda…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Ulandi"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Doimiy VPN tarmoqdan uzildi"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Xato"</string>
+ <!-- no translation found for vpn_lockdown_error (3133844445659711681) -->
+ <skip />
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Tarmoq yoki VPN sozlamalarini o‘zgartiring"</string>
<string name="upload_file" msgid="2897957172366730416">"Faylni tanlash"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Hech qanday fayl tanlanmadi"</string>
<string name="reset" msgid="2448168080964209908">"Asliga qaytarish"</string>
<string name="submit" msgid="1602335572089911941">"Yuborish"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Mashina usuli yoqilgan"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Avtomobil rejimidan chiqish uchun bosing."</string>
+ <!-- no translation found for car_mode_disable_notification_title (5704265646471239078) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (7647248420931129377) -->
+ <skip />
<string name="tethered_notification_title" msgid="3146694234398202601">"Modem rejimi yoniq"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Sozlash uchun bosing."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Modem rejimi faolsizlantirildi"</string>
@@ -1419,22 +1444,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB xotira qurilmasi"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB xotira"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Tahrirlash"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Trafik sarfi bo‘yicha ogohlantirish"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Trafik sarfi va sozlamalarni ko‘rish uchun bosing."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G trafik chekloviga yetdi"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G trafik chekloviga yetdi"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Ogohlantirishlar"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> trafik sarflandi"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Mobil internet-trafik limitga yetdi"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi internet chekloviga yetdi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Mobil internet o‘chirib qo‘yildi"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G ma’lumot cheklovdan o‘tdi"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G ma’lumot cheklovdan o‘tdi"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Mobayl ma’lumot cheklovdan o‘tdi"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi ma’lumot cheklovdan o‘tdi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Chegaradan <xliff:g id="SIZE">%s</xliff:g> oshib ketdi."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Internet davr oxirigacha pauza qilindi"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Mobil trafik limitdan oshib ketdi"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Wi-Fi trafik limitdan oshib ketdi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Cheklovdan <xliff:g id="SIZE">%s</xliff:g> ortiqcha sarflandi"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Fon rejimi cheklangan"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Cheklovni olib tashlash uchun bosing."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Ko‘p trafik sarflandi"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Oxirgi bir necha kunda odatdagidan ko‘proq trafik sarflandi. Trafik sarfi va sozlamalarni ko‘rish uchun bosing."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Mobil trafik ortiqcha sarflandi"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Ilovalar odatdagidan ortiqcha trafik sarflashdi"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> odatdagidan ortiqcha trafik sarfladi"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Xavfsizlik sertifikati"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ushbu sertifikat - to‘g‘ri."</string>
<string name="issued_to" msgid="454239480274921032">"Tegishli:"</string>
@@ -1670,7 +1692,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Administrator tomonidan o‘rnatilgan"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Administrator tomonidan yangilangan"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Administrator tomonidan o‘chirilgan"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Batareya quvvatini uzoqroq vaqtga yetkazish uchun quvvat tejash funksiyasi qurilmangiz unumdorligini kamaytiradi hamda uning tebranishi va orqa fonda internetdan foydalanishini cheklaydi. Sinxronlanishni talab qiladigan e-pochta, xabar almashinuv va boshqa ilovalar esa qachonki ularni ishga tushirganingizda yangilanadi.\n\nQurilma quvvat olayotganda quvvat tejash funksiyasi avtomatik tarzda o‘chadi."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Trafik tejash rejimida ayrim ilovalar uchun orqa fondan internetdan foydalanish imkoniyati cheklanadi. Siz ishlatayotgan ilova zaruratga qarab internet-trafik sarflashi mumkin, biroq cheklangan miqdorda. Masalan, rasmlar ustiga bosmaguningizcha ular yuklanmaydi."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Trafik tejash yoqilsinmi?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Yoqish"</string>
@@ -1682,9 +1705,9 @@
<item quantity="other">%1$d daqiqa (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> gacha)</item>
<item quantity="one">1 daqiqa (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> gacha)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">%1$d soat (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> gacha)</item>
- <item quantity="one">Bir soat (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> gacha)</item>
+ <item quantity="one">1 soat (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> gacha)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d soat (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> gacha)</item>
@@ -1698,9 +1721,9 @@
<item quantity="other">%d daqiqa</item>
<item quantity="one">1 daqiqa</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d soat</item>
- <item quantity="one">Bir soat</item>
+ <item quantity="one">1 soat</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d soat</item>
@@ -1721,14 +1744,22 @@
<string name="muted_by" msgid="6147073845094180001">"“<xliff:g id="THIRD_PARTY">%1$s</xliff:g>” tomonidan ovozsiz qilingan"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. U zavod sozlamalari tiklanmaguncha barqaror ishlamasligi mumkin."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. Tafsilotlar uchun qurilmangiz ishlab chiqaruvchisiga murojaat qiling."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD so‘rovi DIAL so‘roviga o‘zgartirildi."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD so‘rovi SS so‘roviga o‘zgartirildi."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD so‘rovi yangi USSD so‘roviga o‘zgartirildi."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD so‘rovi Video DIAL so‘roviga o‘zgartirildi."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS so‘rovi DIAL so‘roviga o‘zgartirildi."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS so‘rovi Video DIAL so‘roviga o‘zgartirildi."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS so‘rovi USSD so‘roviga o‘zgartirildi."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS so‘rovi yangi SS so‘roviga o‘zgartirildi."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Ishchi profil"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Yoyish"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Yig‘ish"</string>
@@ -1838,7 +1869,16 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Zararli ilova aniqlandi"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ilovasi <xliff:g id="APP_2">%2$s</xliff:g> ilovasidan fragmentlar ko‘rsatish uchun ruxsat so‘ramoqda"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Tahrirlash"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Chaqiruvlar va bildirishnomalar tebranadi"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Chaqiruvlar va bildirishnomalar ovozsiz qilinadi"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"Tizimga oid o‘zgarishlar"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Bezovta qilinmasin"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Bezovta qilinmasin rejimi diqqatingizni jamlash uchun bildirishnomalarni berkitadi"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Bu yangi xatti-harakat. O‘zgartirish uchun bosing."</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Bezovta qilinmasin rejimi sozlamalari o‘zgartirildi"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Ularni tekshirish uchun bosing."</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Nimalar bloklanganini tekshirish uchun bosing"</string>
+ <!-- no translation found for notification_app_name_system (4205032194610042794) -->
+ <skip />
+ <!-- no translation found for notification_app_name_settings (7751445616365753381) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 1671cd6d3fd5..59fb3b80e909 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Số gọi đến mặc định thành không bị giới hạn. Cuộc gọi tiếp theo. Không bị giới hạn"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Dịch vụ không được cấp phép."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Bạn không thể thay đổi cài đặt ID người gọi."</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"Không có dịch vụ dữ liệu"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"Không gọi điện khẩn cấp được"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Không có dịch vụ dữ liệu di động"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Không có dịch vụ gọi khẩn cấp"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Không có dịch vụ thoại"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Không có dịch vụ thoại/khẩn cấp"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"Tạm thời không được cung cấp bởi mạng di động tại vị trí của bạn"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Không thể kết nối mạng"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"Để cải thiện khả năng thu tín hiệu, hãy thử thay đổi loại mạng được chọn trong phần Cài đặt &gt; Mạng và Internet &gt; Mạng di động &gt; Loại mạng ưa thích."</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Gọi qua Wi‑Fi đang hoạt động"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"Cuộc gọi khẩn cấp yêu cầu có mạng di động."</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Không có dịch vụ thoại hoặc gọi khẩn cấp"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"Nhà mạng đã tạm thời tắt dịch vụ này"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Không thể kết nối với mạng di động"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Hãy thử thay đổi mạng ưu tiên. Nhấn để thay đổi."</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Không có dịch vụ gọi khẩn cấp"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"Không thể thực hiện cuộc gọi khẩn cấp qua Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Thông báo"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Chuyển tiếp cuộc gọi"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Chế độ gọi lại khẩn cấp"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"Biểu ngữ Chuyển vùng Bật"</string>
<string name="roamingText12" msgid="1189071119992726320">"Biểu ngữ Chuyển vùng Tắt"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"Đang tìm kiếm Dịch vụ"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Gọi qua Wi-Fi"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"Để gọi điện và gửi tin nhắn qua Wi-Fi, trước tiên hãy yêu cầu nhà cung cấp dịch vụ của bạn thiết lập dịch vụ này. Sau đó, bật lại gọi qua Wi-Fi từ Cài đặt. (Mã lỗi: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"Đăng ký với nhà cung cấp dịch vụ của bạn (Mã lỗi: <xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"Gọi điện qua Wi-Fi %s"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Quá nhiều yêu cầu đang được xử lý. Hãy thử lại sau."</string>
<string name="notification_title" msgid="8967710025036163822">"Lỗi đăng nhập của <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Đồng bộ hóa"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Đồng bộ hóa"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"Quá nhiều lần xóa <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Không thể đồng bộ hóa"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Đã cố xóa quá nhiều <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"Bộ nhớ máy tính bảng đã đầy. Hãy xóa một số tệp để tạo thêm dung lượng."</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"Bộ nhớ đồng hồ đã đầy. Hãy xóa một số tệp để giải phóng dung lượng."</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"Bộ nhớ TV đã đầy. Hãy xóa bớt một số tệp để giải phóng dung lượng."</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Bởi quản trị viên hồ sơ công việc của bạn"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Bởi <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Đã xóa hồ sơ công việc"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Đã xóa hồ sơ công việc do thiếu ứng dụng quản trị"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Ứng dụng quản trị hồ sơ công việc bị thiếu hoặc hỏng. Do vậy, hồ sơ công việc của bạn và dữ liệu liên quan đã bị xóa. Hãy liên hệ với quản trị viên của bạn để được trợ giúp."</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Hồ sơ công việc của bạn không có sẵn trên thiết bị này nữa"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Quá nhiều lần nhập mật khẩu"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Thiết bị được quản lý"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Tổ chức của bạn sẽ quản lý thiết bị này và có thể theo dõi lưu lượng truy cập mạng. Nhấn để biết chi tiết."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Thiết bị của bạn sẽ bị xóa"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"Không thể sử dụng ứng dụng quản trị. Bây giờ, thiết bị của bạn sẽ bị xóa.\n\nNếu bạn có thắc mắc, hãy liên hệ với quản trị viên của tổ chức bạn."</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"Không thể sử dụng ứng dụng quản trị. Thiết bị của bạn sẽ bị xóa ngay bây giờ.\n\nHãy liên hệ với quản trị viên của tổ chức nếu bạn có thắc mắc."</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"<xliff:g id="OWNER_APP">%s</xliff:g> đã tắt tính năng in."</string>
<string name="me" msgid="6545696007631404292">"Tôi"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tùy chọn máy tính bảng"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Chế độ trên máy bay"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Chế độ trên máy bay BẬT"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Chế độ trên máy bay TẮT"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Trình tiết kiệm pin"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Trình tiết kiệm pin đang TẮT"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Trình tiết kiệm pin đang BẬT"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Cài đặt"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hỗ trợ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Trợ lý thoại"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Chuyển sang hồ sơ công việc"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Danh bạ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"truy cập vào danh bạ của bạn"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào danh bạ của bạn"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào danh bạ của bạn?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Vị trí"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"truy cập vị trí của thiết bị này"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào vị trí của thiết bị này"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào vị trí của thiết bị này?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Lịch"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"truy cập lịch của bạn"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào lịch của bạn"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào lịch của bạn?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"Tin nhắn SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"gửi và xem tin nhắn SMS"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; gửi và xem tin nhắn SMS"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; gửi và xem tin nhắn SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Bộ nhớ"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"truy cập ảnh, phương tiện và tệp trên thiết bị của bạn"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào ảnh, phương tiện và tệp trên thiết bị của bạn"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào ảnh, phương tiện và tệp trên thiết bị của bạn?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Micrô"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ghi âm"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ghi âm"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ghi âm?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Máy ảnh"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"chụp ảnh và quay video"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; chụp ảnh và quay video"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; chụp ảnh và quay video?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Điện thoại"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"thực hiện và quản lý cuộc gọi điện thoại"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; thực hiện và quản lý cuộc gọi điện thoại"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; thực hiện và quản lý cuộc gọi điện thoại?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Cảm biến cơ thể"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"truy cập dữ liệu cảm biến về dấu hiệu sinh tồn của bạn"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào dữ liệu cảm biến về các dấu hiệu sinh tồn của bạn"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào dữ liệu cảm biến về các dấu hiệu sinh tồn của bạn?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Truy xuất nội dung cửa sổ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kiểm tra nội dung của cửa sổ bạn đang tương tác."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Bật Khám phá bằng cách chạm"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Thực hiện cử chỉ"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Có thể nhấn, vuốt, chụm và thực hiện các cử chỉ khác."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Cử chỉ vân tay"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Có thể ghi lại các cử chỉ được thực hiện trên cảm biến vân tay của thiết bị."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Có thể ghi lại các cử chỉ được thực hiện trên cảm biến vân tay của thiết bị."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"vô hiệu hóa hoặc sửa đổi thanh trạng thái"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Cho phép ứng dụng vô hiệu hóa thanh trạng thái hoặc thêm và xóa biểu tượng hệ thống."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"trở thành thanh trạng thái"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Cho phép ứng dụng tạo sự đồng nhất cho các phần của mình trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm máy tính bảng."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Cho phép ứng dụng làm cho các phần của ứng dụng trở nên ổn định trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Cho phép ứng dụng tạo sự đồng nhất cho các phần của mình trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm điện thoại."</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"chạy dịch vụ trên nền trước"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"Cho phép ứng dụng sử dụng các dịch vụ trên nền trước."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"đo dung lượng lưu trữ ứng dụng"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Cho phép ứng dụng truy xuất mã, dữ liệu và kích thước bộ nhớ đệm của chính ứng dụng"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"sửa đổi cài đặt hệ thống"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mở khóa bằng hình."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Mở khóa bằng khuôn mặt."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Mở khóa bằng mã pin."</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Mở khóa bằng mã PIN của SIM."</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Mở khóa bằng mã PUK của SIM."</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Mở khóa bằng mật khẩu."</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Khu vực hình."</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Khu vực trượt."</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"Đã sao chép văn bản vào khay nhớ tạm thời."</string>
<string name="more_item_label" msgid="4650918923083320495">"Thêm"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Trình đơn+"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta+"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl+"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt+"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift+"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym+"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Function+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"dấu cách"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"nhập"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"xóa"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Kiểm tra bản cập nhật"</string>
<string name="smv_application" msgid="3307209192155442829">"Ứng dụng <xliff:g id="APPLICATION">%1$s</xliff:g> (quá trình <xliff:g id="PROCESS">%2$s</xliff:g>) đã vi phạm chính sách StrictMode tự thi hành của mình."</string>
<string name="smv_process" msgid="5120397012047462446">"Quá trình <xliff:g id="PROCESS">%1$s</xliff:g> đã vi phạm chính sách StrictMode tự thi hành của mình."</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"Android đang nâng cấp..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android đang khởi động..."</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Điện thoại đang cập nhật…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"Máy tính bảng đang cập nhật…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"Thiết bị đang cập nhật…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"Điện thoại đang khởi động…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"Máy tính bảng đang khởi động…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"Thiết bị đang khởi động…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"Tối ưu hóa lưu trữ."</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Hoàn tất cập nhật Android…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Một số ứng dụng có thể không hoạt động bình thường cho đến khi nâng cấp xong"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"Đang hoàn tất cập nhật hệ thống…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> đang nâng cấp…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Đang tối ưu hóa ứng dụng <xliff:g id="NUMBER_0">%1$d</xliff:g> trong tổng số <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"Đang chuẩn bị <xliff:g id="APPNAME">%1$s</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Khởi động ứng dụng."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Hoàn tất khởi động."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> đang hoạt động"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Nhấn để quay lại trò chơi"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Chọn trò chơi"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Để cải thiện hiệu suất, mỗi lần bạn chỉ nên mở một trong số những trò chơi này."</string>
+ <string name="old_app_action" msgid="3044685170829526403">"Quay lại <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"Mở <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"<xliff:g id="OLD_APP">%1$s</xliff:g> sẽ đóng mà không lưu"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> đã vượt quá giới hạn bộ nhớ"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Tệp báo lỗi đã được thu thập; nhấn để chia sẻ"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"Đã thu thập tệp báo lỗi. Hãy nhấn để chia sẻ."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Chia sẻ tệp báo lỗi?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"Quá trình <xliff:g id="PROC">%1$s</xliff:g> đã vượt quá giới hạn bộ nhớ xử lý <xliff:g id="SIZE">%2$s</xliff:g>. Tệp báo lỗi khả dụng để bạn chia sẻ với nhà phát triển. Hãy cẩn thận: tệp báo lỗi này có thể chứa bất kỳ thông tin cá nhân nào mà ứng dụng có quyền truy cập."</string>
<string name="sendText" msgid="5209874571959469142">"Chọn một tác vụ cho văn bản"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Kết nối với mạng Wi-Fi đang mở"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Kết nối với mạng Wi‑Fi của nhà mạng"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Đang kết nối với mạng Wi‑Fi đang mở"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Đã kết nối với mạng Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Không thể kết nối với mạng Wi‑Fi"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Nhấn để xem tất cả các mạng"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Kết nối"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Tất cả các mạng"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tất cả các mạng"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi sẽ tự động bật"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Khi bạn ở gần mạng đã lưu chất lượng cao"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Không bật lại"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"Khởi động lại"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Kích hoạt dịch vụ di động"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Tải xuống ứng dụng của nhà cung cấp dịch vụ để kích hoạt SIM mới"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"Tải ứng dụng <xliff:g id="APP_NAME">%1$s</xliff:g> xuống để kích hoạt SIM mới"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Tải xuống ứng dụng"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Đã lắp SIM mới"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Nhấn để thiết lập"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"Đã bật chế độ PTP qua USB"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"Đã bật chia sẻ kết nối qua USB"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"Đã bật chế độ MIDI qua USB"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Đã bật chế độ phụ kiện USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Đã kết nối phụ kiện USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Nhấn để biết thêm tùy chọn."</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"Đang sạc thiết bị được kết nối. Hãy nhấn để biết thêm các tùy chọn."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Đã phát hiện phụ kiện âm thanh analog"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Thiết bị được kết nối không tương thích với điện thoại này. Nhấn để tìm hiểu thêm."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Đã kết nối gỡ lỗi USB"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"Nhấn để vô hiệu hóa gỡ lỗi USB."</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Nhấn để tắt tính năng gỡ lỗi USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Chọn để vô hiệu hóa gỡ lỗi USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Đang thu thập báo cáo lỗi…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Chia sẻ báo cáo lỗi?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> hiển thị trên các ứng dụng khác"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> hiển thị trên ứng dụng khác"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Nếu bạn không muốn <xliff:g id="NAME">%s</xliff:g> sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này."</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TẮT"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Tắt"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Đang chuẩn bị <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Đang kiểm tra lỗi"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Đã phát hiện <xliff:g id="NAME">%s</xliff:g> mới"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Đang kết nối VPN luôn bật…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"Đã kết nối VPN luôn bật"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"Đã ngắt kết nối khỏi VPN luôn bật"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"Lỗi VPN luôn bật"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"Không thể kết nối với VPN luôn bật"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"Thay đổi cài đặt mạng hoặc VPN"</string>
<string name="upload_file" msgid="2897957172366730416">"Chọn tệp"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"Không có tệp nào được chọn"</string>
<string name="reset" msgid="2448168080964209908">"Đặt lại"</string>
<string name="submit" msgid="1602335572089911941">"Gửi"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Chế độ trên ô tô đã được bật"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Nhấn để thoát khỏi chế độ trên ô tô."</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"Ứng dụng lái xe đang chạy"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"Nhấn để thoát khỏi ứng dụng lái xe."</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"Chức năng điểm truy cập Internet hoặc điểm phát sóng đang hoạt động"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Nhấn để thiết lập."</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"Đã tắt tính năng chia sẻ kết nối"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"Ổ USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb" msgid="3017954059538517278">"Bộ lưu trữ USB"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"Chỉnh sửa"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"Thông báo về sử dụng dữ liệu"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"Nhấn để xem sử dụng và cài đặt."</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"Đã đạt tới giới hạn dữ liệu 2G-3G"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"Đã đạt tới giới hạn dữ liệu 4G"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"Cảnh báo dữ liệu"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"Bạn đã sử dụng <xliff:g id="APP">%s</xliff:g> dữ liệu"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Đã đạt đến giới hạn dữ liệu di động"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Đã đạt tới g.hạn dữ liệu Wi-Fi"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"Dữ liệu bị tạm ngừng trong phần còn lại của chu kỳ"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"Đã vượt quá g.hạn dữ liệu 2G-3G"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"Đã vượt quá giới hạn dữ liệu 4G"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Đã vượt quá g.hạn d.liệu d.động"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Vượt quá g.hạn d.liệu Wi-Fi"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> vượt quá g.hạn được chỉ định."</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"Đã tạm dừng dữ liệu đối với chu kỳ còn lại của bạn"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"Vượt giới hạn dữ liệu di động"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"Vượt quá giới hạn dữ liệu Wi-Fi"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"Bạn đã vượt quá <xliff:g id="SIZE">%s</xliff:g> so với giới hạn đã đặt"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Dữ liệu nền bị giới hạn"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Nhấn để xóa giới hạn."</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"Mức sử dụng dữ liệu lớn"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"Mức sử dụng dữ liệu của bạn trong vài ngày qua lớn hơn bình thường. Hãy nhấn để xem mức sử dụng và cài đặt."</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"Mức sử dụng dữ liệu di động cao"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"Ứng dụng của bạn đã dùng nhiều dữ liệu hơn thường lệ"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> đã dùng nhiều dữ liệu hơn thường lệ"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Chứng chỉ bảo mật"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Chứng chỉ này hợp lệ."</string>
<string name="issued_to" msgid="454239480274921032">"Cấp cho:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Do quản trị viên của bạn cài đặt"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Do quản trị viên của bạn cập nhật"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Do quản trị viên của bạn xóa"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"Để giúp tăng thời lượng pin, Trình tiết kiệm pin sẽ giảm hiệu suất thiết bị và hạn chế rung, dịch vụ vị trí và hầu hết dữ liệu nền. Ứng dụng email, nhắn tin và các ứng dụng khác sử dụng đồng bộ hóa có thể không cập nhật nếu bạn không mở chúng.\n\nTrình tiết kiệm pin tự động tắt khi thiết bị của bạn đang sạc."</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"Để giúp giảm mức sử dụng dữ liệu, Trình tiết kiệm dữ liệu chặn một số ứng dụng gửi hoặc nhận dữ liệu trong nền. Ứng dụng mà bạn hiện sử dụng có thể truy cập dữ liệu nhưng có thể thực hiện việc đó ít thường xuyên hơn. Ví dụ: hình ảnh sẽ không hiển thị cho đến khi bạn nhấn vào hình ảnh đó."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"Bật Trình tiết kiệm dữ liệu?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Bật"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">Trong %1$d phút (cho đến <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">Trong 1 phút (cho đến <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
<item quantity="other">Trong %1$d giờ (cho đến <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Trong một giờ (cho đến <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <item quantity="one">Trong 1 giờ (cho đến <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">Trong %1$d giờ (cho đến <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">Trong %d phút</item>
<item quantity="one">Trong 1 phút</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">Trong %d giờ</item>
- <item quantity="one">Trong một giờ</item>
+ <item quantity="one">Trong 1 giờ</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">Trong %d giờ</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"Do <xliff:g id="THIRD_PARTY">%1$s</xliff:g> tắt tiếng"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"Đã xảy ra sự cố nội bộ với thiết bị của bạn và thiết bị có thể sẽ không ổn định cho tới khi bạn thiết lập lại dữ liệu ban đầu."</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"Đã xảy ra sự cố nội bộ với thiết bị. Hãy liên hệ với nhà sản xuất của bạn để biết chi tiết."</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"Yêu cầu USSD được sửa đổi thành yêu cầu DIAL."</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"Yêu cầu USSD được sửa đổi thành yêu cầu SS."</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"Yêu cầu USSD được sửa đổi thành yêu cầu USSD mới."</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"Yêu cầu USSD được sửa đổi thành yêu cầu DIAL video."</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"Yêu cầu SS được sửa đổi thành yêu cầu DIAL."</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Yêu cầu SS được sửa đổi thành yêu cầu DIAL video."</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Yêu cầu SS được sửa đổi thành yêu cầu USSD."</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Yêu cầu SS được sửa đổi thành yêu cầu SS mới."</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Hồ sơ công việc"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Mở rộng"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Thu gọn"</string>
@@ -1837,10 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Đã phát hiện ứng dụng độc hại"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> muốn hiển thị các lát của <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Chỉnh sửa"</string>
- <!-- no translation found for notification_channel_system_changes (5072715579030948646) -->
- <skip />
- <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) -->
- <skip />
- <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) -->
- <skip />
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"Cuộc gọi và thông báo sẽ rung"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"Cuộc gọi và thông báo sẽ tắt tiếng"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Thay đổi hệ thống"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"Không làm phiền"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"Chế độ Không làm phiền sẽ ẩn thông báo để giúp bạn tập trung"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"Đây là hành vi mới. Hãy nhấn để thay đổi."</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Cài đặt Không làm phiền đã thay đổi"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"Nhấn để xem những thông báo bị chặn."</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"Hệ thống"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"Cài đặt"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 5bf1a37fa9c9..e46a4b69fe8d 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"預設顯示來電號碼,下一通電話也繼續顯示。"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"未提供此服務。"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"您無法更改來電顯示設定。"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"沒有數據服務"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"無法撥打緊急電話"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"無法使用流動數據服務"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"無法撥打緊急電話"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"沒有語音服務"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"沒有語音/緊急服務"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"您所在位置的流動網絡暫不提供這項服務"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連接網絡"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"如要接收更強訊號,請前往 [設定] &gt; [網絡與互聯網] &gt; [流動網絡] &gt; [偏好的網絡類型] 更改網絡類型。"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"正在進行 Wi-Fi 通話"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"撥打緊急電話需要使用流動網絡"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"無法使用語音服務或撥打緊急電話"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"已由流動網絡供應商暫時關閉"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"無法連線至流動網絡"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"請嘗試變更偏好的網絡。輕按即可變更。"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"無法撥打緊急電話"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"無法經 Wi‑Fi 撥打緊急電話"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉駁"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"漫遊橫幅開啟"</string>
<string name="roamingText12" msgid="1189071119992726320">"漫遊橫幅關閉"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"正在搜尋服務"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi 通話"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"如要透過 Wi-Fi 撥打電話和傳送訊息,請先向流動網絡供應商要求設定此服務,然後再次在「設定」中開啟「Wi-Fi 通話」。(錯誤代碼:<xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"向您的流動網絡供應商註冊 (錯誤代碼:<xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi 通話"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"同時處理過多要求,請稍後再試。"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> 登入錯誤"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Google Sync"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Google Sync"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"同時刪除太多 <xliff:g id="CONTENT_TYPE">%s</xliff:g>。"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"無法同步處理"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"嘗試刪除的「<xliff:g id="CONTENT_TYPE">%s</xliff:g>」數量過多。"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"平板電腦的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"手錶的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"電視儲存空間已滿。請刪除部分檔案,以釋放儲存空間。"</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"由您的工作設定檔管理員監控"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"由 <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> 監管"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"工作設定檔已被刪除"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"由於沒有管理員應用程式,工作設定檔已刪除"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"工作設定檔管理員應用程式已遺失或損毀。因此,您的工作設定檔和相關資料已刪除。請聯絡您的管理員以取得協助。"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"您的工作設定檔無法再在此裝置上使用"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"密碼輸入錯誤的次數過多"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"裝置已受管理"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"您的機構會管理此裝置,並可能會監控網絡流量。輕按即可瞭解詳情。"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"您的裝置將被清除"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"管理員應用程式無法使用。系統會現在清除您的裝置資料。\n\n如有問題,請聯絡您的機構管理員。"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"無法使用管理員應用程式。系統會現在清除您的裝置。\n\n如有任何疑問,請聯絡您的機構管理員。"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"「<xliff:g id="OWNER_APP">%s</xliff:g>」暫停了列印。"</string>
<string name="me" msgid="6545696007631404292">"我本人"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"平板電腦選項"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"飛行模式"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"飛航模式為 [開啟]"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"飛行模式為 [關閉]"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"省電模式"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"省電模式已關閉"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"省電模式已開啟"</string>
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"協助"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"語音助手"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"切換至工作設定檔"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"通訊錄"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"存取您的通訊錄"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"允許 &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; 存取您的聯絡人"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的聯絡人嗎?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"位置"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"存取此裝置的位置"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"允許 &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; 存取此裝置的位置資訊"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取這個裝置的位置資訊嗎?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日曆"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"存取您的日曆"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"允許 &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; 存取您的日曆"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的日曆嗎?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"短訊"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"傳送和查看短訊"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"允許 &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; 傳送和查看短訊"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」傳送及查看簡訊嗎?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"儲存空間"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"存取裝置上的相片、媒體和檔案"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"允許 &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; 存取您裝置上的相片、媒體和檔案"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取裝置中的相片、媒體和檔案嗎?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"麥克風"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"錄音"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"允許 &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; 錄音"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」錄音嗎?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"相機"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"拍照和錄製影片"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"允許 &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; 拍照和錄製影片"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」拍攝相片及錄製影片嗎?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"允許 &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; 撥打電話和管理通話"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」撥打電話及管理通話嗎?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"人體感應器"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與您生命體徵相關的感應器資料"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"允許 &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; 存取與您生命體徵相關的感應器資料"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取與你生命徵象相關的感應器資料嗎?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您使用中的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"開啟「輕觸探索」功能"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"執行手勢"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"可以輕按、快速滑動和兩指縮放,並執行其他手勢。"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"指紋手勢"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"可擷取裝置指紋感應器上執行的手勢。"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"可以擷取在裝置指紋感應器上執行的手勢。"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"停用或修改狀態列"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"允許應用程式停用狀態列,並可新增或移除系統圖示。"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"成為狀態列"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"允許應用程式設定本身的某些部分持續佔用記憶體。這樣可能會限制其他應用程式可用的記憶體,並拖慢平板電腦的運作速度。"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"允許應用程式長期佔用部分記憶體。這會限制其他應用程式可用的記憶體,減慢電視操作。"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"允許應用程式設定本身的某些部分持續佔用記憶體。這樣可能會限制其他應用程式可用的記憶體,並拖慢手機的運作速度。"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"執行前景服務"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"允許應用程式使用前景服務。"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"測量應用程式儲存空間"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"允許應用程式擷取本身的程式碼、資料和快取大小"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"修改系統設定"</string>
@@ -383,7 +386,7 @@
<string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"允許應用程式修改電視的通話記錄,包括來電和撥出電話的相關資料。惡意應用程式可能會藉此清除或修改您的通話記錄。"</string>
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"允許應用程式修改手機的通話記錄,包括來電和已撥電話相關資料。惡意應用程式可能會藉此刪除或修改您的通話記錄。"</string>
<string name="permlab_bodySensors" msgid="4683341291818520277">"存取身體感應器 (例如心跳監測器)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"允許應用程式存取感應器所收集的資料 (這類感應器可監測您的體能狀態,例如您的心跳速率)。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"允許應用程式存取感應器所收集的資料 (這類感應器可監測您的體能狀態,例如您的心率)。"</string>
<string name="permlab_readCalendar" msgid="6716116972752441641">"讀取日曆活動和詳情"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"此應用程式可以讀取所有儲存在您的平板電腦的日曆活動,並分享或儲存您的日曆資料。"</string>
<string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"此應用程式可以讀取所有儲存在您的電視中的日曆活動,並分享或儲存您的日曆資料。"</string>
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"圖案解鎖。"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"臉容解鎖。"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN 解鎖。"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM 卡 PIN 碼解鎖。"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM 卡 PUK 解鎖。"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密碼解鎖。"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"圖案區域。"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"滑動區域。"</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"文字已複製到剪貼簿。"</string>
<string name="more_item_label" msgid="4650918923083320495">"更多"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"選單鍵 +"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"空格鍵"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"Enter 鍵"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"刪除"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"檢查更新"</string>
<string name="smv_application" msgid="3307209192155442829">"應用程式 <xliff:g id="APPLICATION">%1$s</xliff:g> (處理程序 <xliff:g id="PROCESS">%2$s</xliff:g>) 已違反其自行強制實施的嚴格模式 (StrictMode) 政策。"</string>
<string name="smv_process" msgid="5120397012047462446">"處理程序 <xliff:g id="PROCESS">%1$s</xliff:g> 已違反其自行強制實施的嚴格模式 (StrictMode) 政策。"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"正在升級 Android..."</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android 正在啟動…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"正在更新手機…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"正在更新平板電腦…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"正在更新裝置…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"手機正在啟動…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"平板電腦正在啟動…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"裝置正在啟動…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在優化儲存空間。"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"正在完成 Android 更新…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"部分應用程式需要完成升級方可正常運作"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"正在完成系統更新…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"「<xliff:g id="APPLICATION">%1$s</xliff:g>」正在升級…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"正在優化第 <xliff:g id="NUMBER_0">%1$d</xliff:g> 個應用程式 (共 <xliff:g id="NUMBER_1">%2$d</xliff:g> 個)。"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"正在準備 <xliff:g id="APPNAME">%1$s</xliff:g>。"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在啟動應用程式。"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"啟動完成。"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"正在執行 <xliff:g id="APP">%1$s</xliff:g>"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"輕按即可返回遊戲"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"選擇遊戲"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"為達致更佳效能,一次只能開啟其中一個遊戲。"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"返回「<xliff:g id="OLD_APP">%1$s</xliff:g>」"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"開啟「<xliff:g id="NEW_APP">%1$s</xliff:g>」"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"「<xliff:g id="OLD_APP">%1$s</xliff:g>」將會在不儲存的情況下關閉"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> 的記憶體用量已超過限額"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"已收集堆轉儲;輕按即可分享"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"已取得記憶體快照資料。輕觸即可分享。"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"分享堆轉儲?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"這處理程序 (<xliff:g id="PROC">%1$s</xliff:g>) 的記憶體用量已超過限額 (<xliff:g id="SIZE">%2$s</xliff:g>)。您可將已收集的堆轉儲分享給開發人員。請謹慎,這堆轉儲可包含該應用程式有權存取您的任何個人資料。"</string>
<string name="sendText" msgid="5209874571959469142">"選擇處理文字的操作"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"連線至開放的 Wi-Fi 網絡"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"連接流動網絡供應商的 Wi‑Fi 網絡"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"正在連線至開放的 Wi-Fi 網絡"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"已連線至 Wi-Fi 網絡"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"無法連線至 Wi-Fi 網絡"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕按即可查看所有網絡"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"所有網絡"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有網絡"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi 將會自動開啟"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"當您位於已儲存的高品質網絡信號範圍內時"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"不要重新開啟"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"重新啟動"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"啟動流動服務"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"下載流動網絡供應商應用程式,即可啟用新 SIM 卡"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"下載「<xliff:g id="APP_NAME">%1$s</xliff:g>」應用程式,即可啟用新 SIM 卡"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"下載應用程式"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新的 SIM 卡"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"輕按即可設定"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"已開啟 USB PTP 模式"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"已開啟 USB 的網絡共享模式"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"已開啟 USB MIDI 模式"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"已開啟 USB 配件模式"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"已連接 USB 配件"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"輕按即可查看更多選項。"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"正在為連接的裝置充電。輕按即可查看更多選項。"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"偵測到模擬音頻配件"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"連接的裝置與這部手機不兼容。輕按即可瞭解詳情。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"輕按即可停用 USB 偵錯功能。"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"輕按即可關閉 USB 偵錯功能"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"選取即可停用 USB 偵錯。"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"正在取得錯誤報告…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"要分享錯誤報告嗎?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"「<xliff:g id="NAME">%s</xliff:g>」目前可顯示在其他應用程式上面"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"「<xliff:g id="NAME">%s</xliff:g>」正在其他應用程式上顯示內容"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"如果您不想「<xliff:g id="NAME">%s</xliff:g>」使用此功能,請輕按以開啟設定,然後停用此功能。"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"關閉"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"關閉"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"已偵測到新<xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在連線至永久連線的 VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"已連線至永久連線的 VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"永遠開啟的 VPN 已中斷連線"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"永久連線的 VPN 發生錯誤"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"無法連上永久連線的 VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"變更網絡或 VPN 設定"</string>
<string name="upload_file" msgid="2897957172366730416">"選擇檔案"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"未選擇檔案"</string>
<string name="reset" msgid="2448168080964209908">"重設"</string>
<string name="submit" msgid="1602335572089911941">"提交"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"已啟用車用模式"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"輕按即可結束車用模式。"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"行車應用程式執行中"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"輕觸即可結束行車應用程式。"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"已啟用網絡共享或熱點"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"輕按即可設定。"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"網絡共享已停用"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB 驅動器"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB 儲存裝置"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"編輯"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"數據用量警告"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"輕按即可查看用量和設定。"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"已達到 2G-3G 數據流量上限"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"已達到 4G 數據流量上限"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"數據用量警告"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"您已使用 <xliff:g id="APP">%s</xliff:g> 流動數據"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"已達流動數據用量上限"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"已達到 Wi-Fi 數據流量上限"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"已暫停使用數據連線,直到工作階段結束為止"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"已達 2G-3G 數據上限"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"已達 4G 數據上限"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"已達流動數據上限"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"已達 Wi-Fi 數據上限"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> 超過規定上限。"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"已暫停使用數據連線,直至此週期結束為止"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"已超過流動數據用量上限"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"已超出您的 Wi-Fi 數據用量上限"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"您已比設定上限使用多 <xliff:g id="SIZE">%s</xliff:g>"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"已限制背景資料"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"輕按即可移除限制。"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"數據用量過多"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"您過去幾天的數據用量比平常多。輕按即可查看用量和設定。"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"高流動數據用量"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"您的應用程式數據用量比平常多"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"「<xliff:g id="APP">%s</xliff:g>」的數據用量比平常多"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"安全性憑證"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"憑證有效。"</string>
<string name="issued_to" msgid="454239480274921032">"發給:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由您的管理員安裝"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由您的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由您的管理員刪除"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"為延長電池壽命,省電模式會降低裝置效能,並限制震動、位置資訊服務及大部分背景數據的使用。除非您啟用有關程式,否則電郵、短訊及其他需要使用同步功能的應用程式均不會更新。\n\n省電模式會在裝置充電時自動關閉。"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。您正在使用的應用程式可存取資料,但次數可能會減少。例如,圖片可能需要輕按才會顯示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要開啟「數據節省模式」嗎?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"開啟"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d 分鐘 (直至<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">1 分鐘 (直至<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">%1$d 小時 (直至<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 小時 (直至<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other"> %1$d 小時 (直至 <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one"> 1 小時 (直至 <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d 小時 (直至<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,7 +1705,7 @@
<item quantity="other">%d 分鐘</item>
<item quantity="one">1 分鐘</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
<item quantity="other">%d 小時</item>
<item quantity="one">1 小時</item>
</plurals>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"靜音設定者:<xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"您裝置的系統發生問題,回復原廠設定後即可解決該問題。"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"您裝置的系統發生問題,請聯絡您的製造商瞭解詳情。"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD 要求已修改為 DIAL 要求。"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD 要求已修改為 SS 要求。"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD 要求已修改為新的 USSD 要求。"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD 要求已修改為影片 DIAL 要求。"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 要求已修改為 DIAL 要求。"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS 要求已修改為影片 DIAL 要求。"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 要求已修改為 USSD 要求。"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 要求已修改為新的 SS 要求。"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"工作設定檔"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展開"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"收合"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"偵測到有害的應用程式"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"「<xliff:g id="APP_0">%1$s</xliff:g>」想顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的快訊"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"編輯"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"有來電和通知時會震動"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"有來電和通知時會靜音"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"系統變更"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"請勿騷擾"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"「請勿騷擾」模式目前隱藏通知,協助您集中注意力"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"這是新行為。輕按即可變更。"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"請勿騷擾已變更"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"輕按即可查看您的干擾行為設定"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"輕按即可查看封鎖內容。"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"系統"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"設定"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index ed24a35f5183..88d4168f30ee 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -77,15 +77,15 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"預設顯示本機號碼,下一通電話也繼續顯示。"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"無法提供此服務。"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"你無法變更來電顯示設定。"</string>
- <string name="RestrictedOnDataTitle" msgid="1322504692764166532">"無法使用數據連線服務"</string>
- <string name="RestrictedOnEmergencyTitle" msgid="3646729271176394091">"無法撥打緊急電話"</string>
+ <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"沒有行動數據傳輸服務"</string>
+ <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"無法撥打緊急電話"</string>
<string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"無法使用語音通話服務"</string>
- <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"無法使用語音/緊急通話服務"</string>
- <string name="RestrictedStateContent" msgid="4278821484643362350">"你所在位置的行動網路暫時不提供這項服務"</string>
- <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連上網路"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="7056776609127756440">"如要改善收訊狀況,請依序開啟 [設定] &gt; [網路與網際網路] &gt; [行動網路] &gt; [偏好的網路類型],然後選取其他網路類型。"</string>
- <string name="EmergencyCallWarningTitle" msgid="4790413876281901612">"Wi‑Fi 通話正在進行中"</string>
- <string name="EmergencyCallWarningSummary" msgid="8973232888021643293">"撥打緊急電話需要使用行動網路"</string>
+ <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"沒有語音通話服務或無法撥打緊急電話"</string>
+ <string name="RestrictedStateContent" msgid="6538703255570997248">"暫時由電信業者關閉"</string>
+ <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"無法連上行動網路"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"請嘗試變更偏好的網路。輕觸即可變更。"</string>
+ <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"無法撥打緊急電話"</string>
+ <string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"無法透過 Wi‑Fi 撥打緊急電話"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"快訊"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉接"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string>
@@ -120,13 +120,12 @@
<string name="roamingText11" msgid="4154476854426920970">"漫遊橫幅開啟"</string>
<string name="roamingText12" msgid="1189071119992726320">"漫遊橫幅關閉"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"正在搜尋服務"</string>
- <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi 通話"</string>
+ <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
+ <skip />
<string-array name="wfcOperatorErrorAlertMessages">
<item msgid="3910386316304772394">"如要透過 Wi-Fi 網路撥打電話及傳送訊息,請先要求電信業者為你設定這項服務,然後再次前往「設定」頁面啟用 Wi-Fi 通話功能。(錯誤代碼:<xliff:g id="CODE">%1$s</xliff:g>)"</item>
</string-array>
- <string-array name="wfcOperatorErrorNotificationMessages">
- <item msgid="7472393097168811593">"向你的電信業者註冊 (錯誤代碼:<xliff:g id="CODE">%1$s</xliff:g>)"</item>
- </string-array>
+ <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
<item msgid="4397097370387921767">"%s Wi-Fi 通話"</item>
@@ -160,8 +159,8 @@
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"太多執行要求。請稍後再試一次。"</string>
<string name="notification_title" msgid="8967710025036163822">"<xliff:g id="ACCOUNT">%1$s</xliff:g> 發生登入錯誤"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"同步處理"</string>
- <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"同步處理"</string>
- <string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"同時刪除太多 <xliff:g id="CONTENT_TYPE">%s</xliff:g>。"</string>
+ <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"無法同步處理"</string>
+ <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"嘗試刪除的「<xliff:g id="CONTENT_TYPE">%s</xliff:g>」數量過多。"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"平板電腦的儲存空間已滿。請刪除一些檔案,以釋放出可用空間。"</string>
<string name="low_memory" product="watch" msgid="4415914910770005166">"手錶儲存空間已用盡,請刪除一些檔案以釋出可用空間。"</string>
<string name="low_memory" product="tv" msgid="516619861191025923">"電視儲存空間已滿,請刪除部分檔案以釋出可用空間。"</string>
@@ -174,14 +173,13 @@
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"由你的 Work 設定檔管理員監控"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"受到 <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> 監控"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Work 設定檔已遭刪除"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Work 設定檔因管理員應用程式遺失而遭到刪除"</string>
<string name="work_profile_deleted_details" msgid="6307630639269092360">"Work 設定檔管理員應用程式遺失或已毀損,因此系統刪除了你的 Work 設定檔和相關資料。如需協助,請與你的管理員聯絡。"</string>
<string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"你的 Work 設定檔已不在這個裝置上"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"密碼輸入錯誤的次數過多"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"裝置受到管理"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"貴機構會管理這個裝置,且可能監控網路流量。輕觸即可瞭解詳情。"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"你的裝置資料將遭到清除"</string>
- <string name="factory_reset_message" msgid="7972496262232832457">"無法使用管理員應用程式,系統現在將清除你裝置中的資料。\n\n如有任何問題,請與貴機構的管理員聯絡。"</string>
+ <string name="factory_reset_message" msgid="9024647691106150160">"無法使用管理應用程式,系統現在將清除你裝置中的資料。\n\n如有任何問題,請與貴機構的管理員聯絡。"</string>
<string name="printing_disabled_by" msgid="8936832919072486965">"「<xliff:g id="OWNER_APP">%s</xliff:g>」已停用列印功能。"</string>
<string name="me" msgid="6545696007631404292">"我"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"平板電腦選項"</string>
@@ -236,6 +234,9 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"飛航模式"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"飛航模式為 [開啟]"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"飛航模式為 [關閉]"</string>
+ <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"節約耗電量"</string>
+ <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"節約耗電量模式已關閉"</string>
+ <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"節約耗電量模式已開啟"</string>
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"協助"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"語音小幫手"</string>
@@ -269,31 +270,31 @@
<string name="managed_profile_label" msgid="8947929265267690522">"切換至 Work 設定檔"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"聯絡人"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"存取你的聯絡人"</string>
- <string name="permgrouprequest_contacts" msgid="1601591667800538208">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的聯絡人"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的聯絡人嗎?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"位置"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"存取這台裝置的位置資訊"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取這個裝置的位置資訊"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取這個裝置的位置資訊嗎?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日曆"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"存取你的日曆"</string>
- <string name="permgrouprequest_calendar" msgid="6704529828699071445">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的日曆"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的日曆嗎?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"簡訊"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"傳送及查看簡訊"</string>
- <string name="permgrouprequest_sms" msgid="605618939583628306">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」傳送及查看簡訊"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」傳送及查看簡訊嗎?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"儲存"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"存取裝置中的相片、媒體和檔案"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取裝置中的相片、媒體和檔案"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取裝置中的相片、媒體和檔案嗎?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"麥克風"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"錄音"</string>
- <string name="permgrouprequest_microphone" msgid="8065941268709600606">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」錄音"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」錄音嗎?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"相機"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"拍照及錄製影片"</string>
- <string name="permgrouprequest_camera" msgid="810824326507258410">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」拍攝相片及錄製影片"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」拍攝相片及錄製影片嗎?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
- <string name="permgrouprequest_phone" msgid="7084161459732093690">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」撥打電話及管理通話"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」撥打電話及管理通話嗎?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"人體感應器"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與你生命徵象相關的感應器資料"</string>
- <string name="permgrouprequest_sensors" msgid="8631146669524259656">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」與你生命徵象相關的感應器資料"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取與你生命徵象相關的感應器資料嗎?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查你存取的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"啟用輕觸探索功能"</string>
@@ -305,7 +306,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"使用手勢"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"可使用輕觸、滑動和雙指撥動等手勢。"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"指紋手勢"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"可以擷取在裝置指紋感應器上執行的手勢。"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"可以擷取使用者對裝置的指紋感應器執行的手勢。"</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"停用或變更狀態列"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"允許應用程式停用狀態列,並可新增或移除系統圖示。"</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"以狀態列顯示"</string>
@@ -356,6 +357,8 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"允許應用程式的部分內容常駐在記憶體中。這項設定可能會限制其他應用程式可用的記憶體,並拖慢平板電腦運作速度。"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"允許應用程式的部分內容常駐在記憶體中。這項設定可能會限制其他應用程式可用的記憶體,造成電視的運作速度變慢。"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"允許應用程式讓部分內容佔用記憶體,持續執行。這項設定可能會限制其他應用程式可用的記憶體,並拖慢手機運作速度。"</string>
+ <string name="permlab_foregroundService" msgid="3310786367649133115">"執行前景服務"</string>
+ <string name="permdesc_foregroundService" msgid="6471634326171344622">"允許應用程式使用前景服務。"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"測量應用程式儲存空間"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"允許應用程式擷取本身的程式碼、資料及快取大小"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"修改系統設定"</string>
@@ -498,7 +501,7 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"嘗試次數過多,請稍後再試。"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"嘗試次數過多,指紋感應器已停用。"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"請再試一次。"</string>
- <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"未註冊任何指紋。"</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"未登錄任何指紋。"</string>
<string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"這個裝置沒有指紋感應器"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -802,6 +805,8 @@
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"圖案解鎖。"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"人臉解鎖。"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN 解鎖。"</string>
+ <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM 卡 PIN 碼解鎖。"</string>
+ <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM 卡 PUK 解鎖。"</string>
<string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密碼解鎖。"</string>
<string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"圖案區域。"</string>
<string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"滑動區域。"</string>
@@ -863,6 +868,12 @@
<string name="text_copied" msgid="4985729524670131385">"文字已複製到剪貼簿。"</string>
<string name="more_item_label" msgid="4650918923083320495">"更多"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"[Menu] +"</string>
+ <string name="menu_meta_shortcut_label" msgid="4647153495550313570">"Meta +"</string>
+ <string name="menu_ctrl_shortcut_label" msgid="3917070091228880941">"Ctrl +"</string>
+ <string name="menu_alt_shortcut_label" msgid="6249849492641218944">"Alt +"</string>
+ <string name="menu_shift_shortcut_label" msgid="6773890288720306380">"Shift +"</string>
+ <string name="menu_sym_shortcut_label" msgid="4019695553731017933">"Sym +"</string>
+ <string name="menu_function_shortcut_label" msgid="1984053777418162618">"Fn +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"空白鍵"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"輸入"</string>
<string name="menu_delete_shortcut_label" msgid="3658178007202748164">"刪除"</string>
@@ -1074,31 +1085,28 @@
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"檢查更新"</string>
<string name="smv_application" msgid="3307209192155442829">"應用程式 <xliff:g id="APPLICATION">%1$s</xliff:g> (處理程序 <xliff:g id="PROCESS">%2$s</xliff:g>) 已違反其自行強制實施的嚴格模式 (StrictMode) 政策。"</string>
<string name="smv_process" msgid="5120397012047462446">"處理程序 <xliff:g id="PROCESS">%1$s</xliff:g> 已違反其自行強制實施的嚴格模式 (StrictMode) 政策。"</string>
- <string name="android_upgrading_title" msgid="1584192285441405746">"正在升級 Android…"</string>
- <string name="android_start_title" msgid="8418054686415318207">"Android 正在啟動…"</string>
+ <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"手機正在更新…"</string>
+ <string name="android_upgrading_title" product="tablet" msgid="4503169817302593560">"平板電腦正在更新…"</string>
+ <string name="android_upgrading_title" product="device" msgid="7009520271220804517">"裝置正在更新…"</string>
+ <string name="android_start_title" product="default" msgid="4536778526365907780">"手機正在啟動…"</string>
+ <string name="android_start_title" product="tablet" msgid="4929837533850340472">"平板電腦正在啟動…"</string>
+ <string name="android_start_title" product="device" msgid="7467484093260449437">"裝置正在啟動…"</string>
<string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在對儲存空間進行最佳化處理。"</string>
- <string name="android_upgrading_notification_title" msgid="8428357096969413169">"即將完成 Android 更新…"</string>
- <string name="android_upgrading_notification_body" msgid="5761201379457064286">"升級完成前,部分應用程式可能無法正常運作"</string>
+ <string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"正在完成系統更新…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"正在升級「<xliff:g id="APPLICATION">%1$s</xliff:g>」…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"正在最佳化第 <xliff:g id="NUMBER_0">%1$d</xliff:g> 個應用程式 (共 <xliff:g id="NUMBER_1">%2$d</xliff:g> 個)。"</string>
<string name="android_preparing_apk" msgid="8162599310274079154">"正在準備升級「<xliff:g id="APPNAME">%1$s</xliff:g>」。"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在啟動應用程式。"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"啟動完成。"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> 執行中"</string>
- <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
- <skip />
- <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
- <skip />
- <!-- no translation found for old_app_action (3044685170829526403) -->
- <skip />
- <!-- no translation found for new_app_action (6694851182870774403) -->
- <skip />
- <!-- no translation found for new_app_description (5894852887817332322) -->
- <skip />
+ <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"輕觸即可返回遊戲"</string>
+ <string name="heavy_weight_switcher_title" msgid="387882830435195342">"選擇遊戲"</string>
+ <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"為了維持較佳效能,一次只能開啟其中一個遊戲。"</string>
+ <string name="old_app_action" msgid="3044685170829526403">"返回「<xliff:g id="OLD_APP">%1$s</xliff:g>」"</string>
+ <string name="new_app_action" msgid="6694851182870774403">"開啟「<xliff:g id="NEW_APP">%1$s</xliff:g>」"</string>
+ <string name="new_app_description" msgid="5894852887817332322">"「<xliff:g id="OLD_APP">%1$s</xliff:g>」即將直接關閉不儲存"</string>
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> 已超出記憶體上限"</string>
- <string name="dump_heap_notification_detail" msgid="6901391084243999274">"已取得記憶體快照資料;輕觸即可分享"</string>
+ <string name="dump_heap_notification_detail" msgid="3993078784053054141">"已取得記憶體快照資料。輕觸即可分享。"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"分享記憶體快照資料?"</string>
<string name="dump_heap_text" msgid="4809417337240334941">"程序「<xliff:g id="PROC">%1$s</xliff:g>」已超出 <xliff:g id="SIZE">%2$s</xliff:g> 的程序記憶體上限。系統已產生記憶體快照資料,可供你與開發人員分享。請注意:記憶體快照資料中可能包含應用程式可存取的個人資訊。"</string>
<string name="sendText" msgid="5209874571959469142">"選取傳送文字內容的方式"</string>
@@ -1133,12 +1141,13 @@
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"連線至開放的 Wi‑Fi 網路"</string>
<string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"連上電信業者的 Wi‑Fi 網路"</string>
- <string name="wifi_available_title_connecting" msgid="1557292688310330032">"正在連線至開放的 Wi‑Fi 網路"</string>
+ <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
+ <skip />
<string name="wifi_available_title_connected" msgid="7542672851522241548">"已連線至 Wi-Fi 網路"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"無法連線至 Wi‑Fi 網路"</string>
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕觸即可查看所有網路"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string>
- <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"所有網路"</string>
+ <string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有網路"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi 將自動開啟"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"當你位於已儲存的高品質網路範圍內時"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"不要重新開啟"</string>
@@ -1204,6 +1213,7 @@
<string name="sim_restart_button" msgid="4722407842815232347">"重新啟動"</string>
<string name="install_carrier_app_notification_title" msgid="9056007111024059888">"啟用行動服務"</string>
<string name="install_carrier_app_notification_text" msgid="3346681446158696001">"下載電信業者應用程式以啟用你的新 SIM 卡"</string>
+ <string name="install_carrier_app_notification_text_app_name" msgid="1196505084835248137">"下載「<xliff:g id="APP_NAME">%1$s</xliff:g>」應用程式以啟用你的新 SIM 卡"</string>
<string name="install_carrier_app_notification_button" msgid="3094206295081900849">"下載應用程式"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新的 SIM 卡"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"輕觸這裡即可進行設定"</string>
@@ -1222,13 +1232,13 @@
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"已開啟 USB PTP 模式"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"已開啟 USB 數據連線模式"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"已開啟 USB MIDI 模式"</string>
- <string name="usb_accessory_notification_title" msgid="1899977434994900306">"已開啟 USB 配件模式"</string>
+ <string name="usb_accessory_notification_title" msgid="1785694450621427730">"已連接 USB 配件"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"輕觸即可查看更多選項。"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"正在為連接的裝置充電。輕觸即可查看更多選項。"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"偵測到類比音訊配件"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"此外接裝置與這支手機不相容。輕觸即可瞭解詳情。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"輕觸即可停用 USB 偵錯功能。"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"輕觸即可關閉 USB 偵錯功能"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"選取這個選項以停用 USB 偵錯功能。"</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"正在接收錯誤報告…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"要分享錯誤報告嗎?"</string>
@@ -1247,7 +1257,7 @@
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"「<xliff:g id="NAME">%s</xliff:g>」在其他應用程式上顯示內容"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"「<xliff:g id="NAME">%s</xliff:g>」正在其他應用程式上顯示內容"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"如果你不想讓「<xliff:g id="NAME">%s</xliff:g>」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。"</string>
- <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"關閉"</string>
+ <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"關閉"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備「<xliff:g id="NAME">%s</xliff:g>」"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"偵測到新的「<xliff:g id="NAME">%s</xliff:g>」"</string>
@@ -1333,14 +1343,14 @@
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在連線至永久連線的 VPN…"</string>
<string name="vpn_lockdown_connected" msgid="8202679674819213931">"已連線至永久連線的 VPN"</string>
<string name="vpn_lockdown_disconnected" msgid="735805531187559719">"已中斷連線至永久連線的 VPN"</string>
- <string name="vpn_lockdown_error" msgid="6009249814034708175">"永久連線的 VPN 發生錯誤"</string>
+ <string name="vpn_lockdown_error" msgid="3133844445659711681">"無法連上永久連線的 VPN"</string>
<string name="vpn_lockdown_config" msgid="8151951501116759194">"變更網路或 VPN 設定"</string>
<string name="upload_file" msgid="2897957172366730416">"選擇檔案"</string>
<string name="no_file_chosen" msgid="6363648562170759465">"未選擇任何檔案"</string>
<string name="reset" msgid="2448168080964209908">"重設"</string>
<string name="submit" msgid="1602335572089911941">"提交"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"已啟用車用模式"</string>
- <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"輕觸即可結束車用模式。"</string>
+ <string name="car_mode_disable_notification_title" msgid="5704265646471239078">"行車應用程式執行中"</string>
+ <string name="car_mode_disable_notification_message" msgid="7647248420931129377">"輕觸即可結束行車應用程式。"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"網路共用或無線基地台已啟用"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"輕觸即可進行設定。"</string>
<string name="disable_tether_notification_title" msgid="7526977944111313195">"數據連線已停用"</string>
@@ -1418,22 +1428,19 @@
<string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB 隨身碟"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB 儲存裝置"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"編輯"</string>
- <string name="data_usage_warning_title" msgid="3620440638180218181">"數據用量警告"</string>
- <string name="data_usage_warning_body" msgid="6660692274311972007">"輕觸即可查看用量和設定。"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"已達到 2G-3G 數據流量上限"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"已達到 4G 數據流量上限"</string>
+ <string name="data_usage_warning_title" msgid="6499834033204801605">"數據用量警告"</string>
+ <string name="data_usage_warning_body" msgid="7340198905103751676">"你的數據用量已達 <xliff:g id="APP">%s</xliff:g>"</string>
<string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"已達到行動數據用量上限"</string>
<string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"已達到 Wi-Fi 數據流量上限"</string>
- <string name="data_usage_limit_body" msgid="291731708279614081">"已暫停使用數據連線,直到工作階段結束為止"</string>
- <string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"已超過 2G-3G 數據上限"</string>
- <string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"已超過 4G 數據上限"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"已超過行動數據上限"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"已超過 Wi-Fi 數據上限"</string>
- <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> 超過規定上限。"</string>
+ <string name="data_usage_limit_body" msgid="2908179506560812973">"已暫停使用數據連線,直到這個付款週期結束為止"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="3171402244827034372">"已超過行動數據用量上限"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="3547771791046344188">"已超過 Wi-Fi 數據用量上限"</string>
+ <string name="data_usage_limit_snoozed_body" msgid="1671222777207603301">"你已使用 <xliff:g id="SIZE">%s</xliff:g>,超出設定上限"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"已限制背景資料"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"輕觸即可移除限制。"</string>
- <string name="data_usage_rapid_title" msgid="4579994056245665351">"大量數據用量"</string>
- <string name="data_usage_rapid_body" msgid="4899922842674185567">"你過去幾天的數據用量比平常來得多。輕觸即可查看用量和設定。"</string>
+ <string name="data_usage_rapid_title" msgid="1809795402975261331">"高行動數據用量"</string>
+ <string name="data_usage_rapid_body" msgid="6897825788682442715">"你的應用程式數據用量比平常多"</string>
+ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"「<xliff:g id="APP">%s</xliff:g>」的數據用量比平常多"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"安全性憑證"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"憑證有效。"</string>
<string name="issued_to" msgid="454239480274921032">"發佈至:"</string>
@@ -1669,7 +1676,8 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"已由你的管理員安裝"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"已由你的管理員更新"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"已由你的管理員刪除"</string>
- <string name="battery_saver_description" msgid="5394663545060026162">"為了延長電池續航力,節約耗電量模式會降低裝置效能,並限制震動、定位服務及大部分背景數據傳輸。此外,如果未開啟電子郵件、簡訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n當你為裝置充電時,節約耗電量模式會自動關閉。"</string>
+ <!-- no translation found for battery_saver_description (4660824093877546730) -->
+ <skip />
<string name="data_saver_description" msgid="6015391409098303235">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,而必須由你輕觸後才會顯示。"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"要開啟數據節省模式嗎?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"開啟"</string>
@@ -1681,9 +1689,9 @@
<item quantity="other">%1$d 分鐘 (直到 <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="one">1 分鐘 (直到 <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
- <item quantity="other">持續 %1$d 小時 (結束時間:<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">持續 1 小時 (結束時間:<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
+ <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283">
+ <item quantity="other">%1$d 小時 (直到<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
+ <item quantity="one">1 小時 (直到<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
<item quantity="other">%1$d 小時 (直到 <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
@@ -1697,9 +1705,9 @@
<item quantity="other">%d 分鐘</item>
<item quantity="one">1 分鐘</item>
</plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
- <item quantity="other">持續 %d 小時</item>
- <item quantity="one">持續 1 小時</item>
+ <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730">
+ <item quantity="other">%d 小時</item>
+ <item quantity="one">1 小時</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
<item quantity="other">%d 小時</item>
@@ -1720,14 +1728,22 @@
<string name="muted_by" msgid="6147073845094180001">"由 <xliff:g id="THIRD_PARTY">%1$s</xliff:g> 設為靜音"</string>
<string name="system_error_wipe_data" msgid="6608165524785354962">"你的裝置發生內部問題,必須將裝置恢復原廠設定才能解除不穩定狀態。"</string>
<string name="system_error_manufacturer" msgid="8086872414744210668">"你的裝置發生內部問題,詳情請洽裝置製造商。"</string>
- <string name="stk_cc_ussd_to_dial" msgid="5202342984749947872">"USSD 要求已改為 DIAL 要求。"</string>
- <string name="stk_cc_ussd_to_ss" msgid="2345360594181405482">"USSD 要求已改為 SS 要求。"</string>
- <string name="stk_cc_ussd_to_ussd" msgid="7466087659967191653">"USSD 要求已改為新的 USSD 要求。"</string>
- <string name="stk_cc_ussd_to_dial_video" msgid="585340552561515305">"USSD 要求已改為影片 DIAL 要求。"</string>
- <string name="stk_cc_ss_to_dial" msgid="2151304435775557162">"SS 要求已改為 DIAL 要求。"</string>
- <string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"SS 要求已改為影片 DIAL 要求。"</string>
- <string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 要求已改為 USSD 要求。"</string>
- <string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 要求已改為新的 SS 要求。"</string>
+ <!-- no translation found for stk_cc_ussd_to_dial (5214333646366591205) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (4884994189414782605) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (5728637484565449312) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial_video (4134455726513175559) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (1360775164651754978) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial_video (6577956662913194947) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (5614626512855868785) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (7716729801537709054) -->
+ <skip />
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work 設定檔"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展開"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"收合"</string>
@@ -1837,7 +1853,14 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"偵測到有害應用程式"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"「<xliff:g id="APP_0">%1$s</xliff:g>」想要顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的區塊"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"編輯"</string>
+ <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"有來電和通知時會震動"</string>
+ <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"有來電和通知時會靜音"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"系統變更"</string>
+ <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"零打擾"</string>
+ <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"「零打擾」模式會隱藏通知,協助你集中注意力"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"這是新的行為。輕觸即可變更。"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"「零打擾」設定已變更"</string>
- <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"輕觸即可查看你的干擾行為設定"</string>
+ <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"輕觸即可查看遭封鎖的項目。"</string>
+ <string name="notification_app_name_system" msgid="4205032194610042794">"系統"</string>
+ <string name="notification_app_name_settings" msgid="7751445616365753381">"設定"</string>
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 4a72bf99dbca..313545592bbd 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2151,6 +2151,9 @@
@see android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
-->
<enum name="shortEdges" value="1" />
+ <!-- Use {@code shortEdges} instead. This is temporarily here to unblock pushing the SDK
+ until all usages have been migrated to {@code shortEdges} -->
+ <enum name="always" value="1" />
<!-- The window is never allowed to overlap with the DisplayCutout area.
<p>
This should be used with windows that transiently set {@code SYSTEM_UI_FLAG_FULLSCREEN}
@@ -5965,6 +5968,9 @@
in the encoded data. Setting this to infinite (-1) will result in the
animation repeating as long as it is displayed (once start() is called). -->
<attr name="repeatCount"/>
+ <!-- When true, automatically start animating. The default is false, meaning
+ that the animation will not start until start() is called. -->
+ <attr name="autoStart" />
</declare-styleable>
<!-- Drawable used to draw bitmaps. -->
@@ -7981,8 +7987,6 @@
android.content.pm.PackageInfo#getLongVersionCode()} for the target package.
-->
<attr name="maxLongVersionCode" format="string" />
- <!-- TODO(b/74445943): STOPSHIP (urlBarResourceId should be removed after P DP2 is branched)-->
- <attr name="urlBarResourceId" format="string" />
</declare-styleable>
<!-- =============================== -->
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 722102e99aa2..449d3e7beca1 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -130,13 +130,14 @@
<drawable name="notification_template_divider_media">#29ffffff</drawable>
<color name="notification_primary_text_color_light">@color/primary_text_default_material_light</color>
<color name="notification_primary_text_color_dark">@color/primary_text_default_material_dark</color>
- <color name="notification_secondary_text_color_light">@color/secondary_text_material_light</color>
- <color name="notification_secondary_text_color_dark">@color/secondary_text_material_dark</color>
+ <color name="notification_secondary_text_color_light">@color/primary_text_default_material_light</color>
+ <color name="notification_secondary_text_color_dark">@color/primary_text_default_material_dark</color>
+ <color name="notification_default_color_dark">@color/primary_text_default_material_light</color>
+ <color name="notification_default_color_light">#a3202124</color>
<color name="notification_material_background_color">#ffffffff</color>
<color name="notification_default_color">#757575</color> <!-- Gray 600 -->
- <color name="notification_icon_default_color">@color/notification_default_color</color>
<color name="notification_progress_background_color">@color/secondary_text_material_light</color>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 1083630a1d30..55c17b9b2af4 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1996,7 +1996,7 @@
<!-- If true, the doze component is not started until after the screen has been
turned off and the screen off animation has been performed. -->
- <bool name="config_dozeAfterScreenOff">false</bool>
+ <bool name="config_dozeAfterScreenOffByDefault">false</bool>
<!-- Doze: should the TYPE_PICK_UP_GESTURE sensor be used as a pulse signal. -->
<bool name="config_dozePulsePickup">false</bool>
@@ -2911,6 +2911,10 @@
is non-interactive. -->
<bool name="config_cameraDoubleTapPowerGestureEnabled">true</bool>
+ <!-- Allow the gesture power + volume up to change the ringer mode while the device
+ is interactive. -->
+ <bool name="config_volumeHushGestureEnabled">true</bool>
+
<!-- Name of the component to handle network policy notifications. If present,
disables NetworkPolicyManagerService's presentation of data-usage notifications. -->
<string translatable="false" name="config_networkPolicyNotificationComponent"></string>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 2c0deedc435f..0246c804952c 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2869,8 +2869,6 @@
<public name="outlineSpotShadowColor" />
<public name="outlineAmbientShadowColor" />
<public name="maxLongVersionCode" />
- <!-- TODO(b/74445943): STOPSHIP (urlBarResourceId should be removed after P DP2 is branched)-->
- <public name="urlBarResourceId" />
<!-- @hide @SystemApi -->
<public name="userRestriction" />
<public name="textFontWeight" />
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index aac4092db08f..0ef93e57d0ed 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -159,6 +159,9 @@
<!-- Notification content to tell the user that voice/data/emergency service is blocked by access control. -->
<string name="RestrictedStateContent">Temporarily turned off by your carrier</string>
+ <!-- Notification content to tell the user that voice/data/emergency service is blocked by access control when multiple SIMs are active. -->
+ <string name="RestrictedStateContentMsimTemplate">Temporarily turned off by your carrier for SIM <xliff:g id="simNumber" example="1">%d</xliff:g></string>
+
<!-- Displayed to tell the user that they should switch their network preference. -->
<string name="NetworkPreferenceSwitchTitle">Can\u2019t reach mobile network</string>
<!-- Displayed to tell the user that they should switch their network preference. -->
@@ -227,14 +230,14 @@
<string name="roamingTextSearching">Searching for Service</string>
<!-- Displayed when WFC registration fails -->
- <string name="wfcRegErrorTitle">Wi-Fi Calling</string>
+ <string name="wfcRegErrorTitle">Couldn\u2019t set up Wi\u2011Fi calling</string>
<!-- WFC Operator Error Messages showed as alerts -->
<string-array name="wfcOperatorErrorAlertMessages">
<item>To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="code" example="REG09 - No 911 Address">%1$s</xliff:g>)</item>
</string-array>
<!-- WFC Operator Error Messages showed as notifications -->
<string-array name="wfcOperatorErrorNotificationMessages">
- <item>Register with your carrier (Error code: <xliff:g id="code" example="REG09 - No 911 Address">%1$s</xliff:g>)</item>
+ <item>Issue registering Wi\u2011Fi calling with your carrier: <xliff:g id="code" example="REG09 - No 911 Address">%1$s</xliff:g></item>
</string-array>
<!-- Template for showing mobile network operator name while WFC is active -->
<string-array name="wfcSpnFormats">
@@ -3085,13 +3088,13 @@
<string name="wifi_available_title">Connect to open Wi\u2011Fi network</string>
<!-- Notification title for a nearby carrier wireless network.-->
<string name="wifi_available_carrier_network_title">Connect to carrier Wi\u2011Fi network</string>
- <!-- Notification title when the system is connecting to the specified open network. The network name is specified in the notification content. -->
- <string name="wifi_available_title_connecting">Connecting to open Wi\u2011Fi network</string>
- <!-- Notification title when the system has connected to the open network. The network name is specified in the notification content. -->
+ <!-- Notification title when the system is connecting to the specified network. The network name is specified in the notification content. -->
+ <string name="wifi_available_title_connecting">Connecting to Wi\u2011Fi network</string>
+ <!-- Notification title when the system has connected to the network. The network name is specified in the notification content. -->
<string name="wifi_available_title_connected">Connected to Wi\u2011Fi network</string>
- <!-- Notification title when the system failed to connect to the specified open network. -->
+ <!-- Notification title when the system failed to connect to the specified network. -->
<string name="wifi_available_title_failed_to_connect">Could not connect to Wi\u2011Fi network</string>
- <!-- Notification content when the system failed to connect to the specified open network. This informs the user that tapping on this notification will open the wifi picker. -->
+ <!-- Notification content when the system failed to connect to the specified network. This informs the user that tapping on this notification will open the wifi picker. -->
<string name="wifi_available_content_failed_to_connect">Tap to see all networks</string>
<!-- Notification action name for connecting to the network specified in the notification body. -->
<string name="wifi_available_action_connect">Connect</string>
@@ -4475,7 +4478,7 @@
<string name="package_deleted_device_owner">Deleted by your admin</string>
<!-- [CHAR_LIMIT=NONE] Battery saver: Feature description -->
- <string name="battery_saver_description">To help improve battery life, Battery Saver reduces your device’s performance and limits vibration, location services, and most background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging.</string>
+ <string name="battery_saver_description">To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, location services, and background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging.</string>
<!-- [CHAR_LIMIT=NONE] Data saver: Feature description -->
<string name="data_saver_description">To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them.</string>
@@ -4578,14 +4581,14 @@
<!-- Displayed when the USSD/SS request is modified by STK CC to a
different request. This will be displayed in a toast. -->
- <string name="stk_cc_ussd_to_dial">USSD request is modified to DIAL request.</string>
- <string name="stk_cc_ussd_to_ss">USSD request is modified to SS request.</string>
- <string name="stk_cc_ussd_to_ussd">USSD request is modified to new USSD request.</string>
- <string name="stk_cc_ussd_to_dial_video">USSD request is modified to Video DIAL request.</string>
- <string name="stk_cc_ss_to_dial">SS request is modified to DIAL request.</string>
- <string name="stk_cc_ss_to_dial_video">SS request is modified to Video DIAL request.</string>
- <string name="stk_cc_ss_to_ussd">SS request is modified to USSD request.</string>
- <string name="stk_cc_ss_to_ss">SS request is modified to new SS request.</string>
+ <string name="stk_cc_ussd_to_dial">USSD request changed to regular call</string>
+ <string name="stk_cc_ussd_to_ss">USSD request changed to SS request</string>
+ <string name="stk_cc_ussd_to_ussd">Changed to new USSD request</string>
+ <string name="stk_cc_ussd_to_dial_video">USSD request changed to video call</string>
+ <string name="stk_cc_ss_to_dial">SS request changed to regular call</string>
+ <string name="stk_cc_ss_to_dial_video">SS request changed to video call</string>
+ <string name="stk_cc_ss_to_ussd">SS request changed to USSD request</string>
+ <string name="stk_cc_ss_to_ss">Changed to new SS request</string>
<!-- Content description of the work profile icon in the notification. -->
<string name="notification_work_profile_content_description">Work profile</string>
@@ -4833,6 +4836,12 @@
<string name="mmcc_illegal_ms">SIM not allowed for voice</string>
<string name="mmcc_illegal_me">Phone not allowed for voice</string>
+ <!-- Title of notification when UE fails to register network with MM reject cause code when multiple SIMs are active. -->
+ <string name="mmcc_authentication_reject_msim_template">SIM <xliff:g id="simNumber" example="1">%d</xliff:g> not allowed</string>
+ <string name="mmcc_imsi_unknown_in_hlr_msim_template">SIM <xliff:g id="simNumber" example="1">%d</xliff:g> not provisioned</string>
+ <string name="mmcc_illegal_ms_msim_template">SIM <xliff:g id="simNumber" example="1">%d</xliff:g> not allowed</string>
+ <string name="mmcc_illegal_me_msim_template">SIM <xliff:g id="simNumber" example="1">%d</xliff:g> not allowed</string>
+
<!-- Popup window default title to be read by a screen reader-->
<string name="popup_window_default_title">Popup Window</string>
@@ -4868,12 +4877,6 @@
-->
<string name="shortcut_disabled_reason_unknown">Shortcut is disabled</string>
- <!--Battery saver warning. STOPSHIP: Remove it eventually. -->
- <string name="battery_saver_warning" translatable="false">\"Extreme\" battery saver activated.\n\nSee the details at: go/extreme-battery-saver\n\nEBS aggressively throttles background apps and changes screen-off behavior.\n</string>
-
- <!--Battery saver warning. STOPSHIP: Remove it eventually. -->
- <string name="battery_saver_warning_title" translatable="false">Extreme battery saver</string>
-
<!-- Label for the uninstall button on the harmful app warning dialog. [CHAR LIMIT=20] -->
<string name="harmful_app_warning_uninstall">UNINSTALL</string>
<!-- Label for the open anyway button on the harmful app warning dialog. [CHAR LIMIT=20] -->
@@ -4888,6 +4891,9 @@
<!-- Notification action for editing a screenshot (drawing on it, cropping it, etc) -->
<string name="screenshot_edit">Edit</string>
+ <string name="volume_dialog_ringer_guidance_vibrate">Calls and notifications will vibrate</string>
+ <string name="volume_dialog_ringer_guidance_silent">Calls and notifications will be muted</string>
+
<!-- Title for the notification channel notifying user of settings system changes. [CHAR LIMIT=NONE] -->
<string name="notification_channel_system_changes">System changes</string>
<!-- Title for the notification channel notifying user of do not disturb system changes (i.e. Do Not Disturb has changed). [CHAR LIMIT=NONE] -->
diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml
index fa3cf2f48dae..b8a046f79371 100644
--- a/core/res/res/values/styles_material.xml
+++ b/core/res/res/values/styles_material.xml
@@ -473,7 +473,7 @@ please see styles_device_defaults.xml.
<style name="TextAppearance.Material.Notification.Reply" />
<style name="TextAppearance.Material.Notification.Title">
- <item name="textColor">@color/notification_primary_text_color_light</item>
+ <item name="fontFamily">sans-serif-medium</item>
<item name="textSize">@dimen/notification_title_text_size</item>
</style>
@@ -482,7 +482,6 @@ please see styles_device_defaults.xml.
</style>
<style name="TextAppearance.Material.Notification.Info">
- <item name="textColor">@color/notification_secondary_text_color_light</item>
<item name="textSize">@dimen/notification_subtext_size</item>
</style>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ad4d7ddfc269..b9215f844423 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -579,6 +579,7 @@
<java-symbol type="string" name="RestrictedOnEmergencyTitle" />
<java-symbol type="string" name="RestrictedOnNormalTitle" />
<java-symbol type="string" name="RestrictedStateContent" />
+ <java-symbol type="string" name="RestrictedStateContentMsimTemplate" />
<java-symbol type="string" name="notification_channel_network_alert" />
<java-symbol type="string" name="notification_channel_call_forward" />
<java-symbol type="string" name="notification_channel_emergency_callback" />
@@ -1024,6 +1025,8 @@
<java-symbol type="string" name="volume_icon_description_media" />
<java-symbol type="string" name="volume_icon_description_notification" />
<java-symbol type="string" name="volume_icon_description_ringer" />
+ <java-symbol type="string" name="volume_dialog_ringer_guidance_vibrate" />
+ <java-symbol type="string" name="volume_dialog_ringer_guidance_silent" />
<java-symbol type="string" name="wait" />
<java-symbol type="string" name="webpage_unresponsive" />
<java-symbol type="string" name="whichApplication" />
@@ -1817,7 +1820,7 @@
<java-symbol type="bool" name="config_notificationHeaderClickableForExpand" />
<java-symbol type="bool" name="config_enableNightMode" />
<java-symbol type="bool" name="config_tintNotificationActionButtons" />
- <java-symbol type="bool" name="config_dozeAfterScreenOff" />
+ <java-symbol type="bool" name="config_dozeAfterScreenOffByDefault" />
<java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" />
<java-symbol type="bool" name="config_enableFusedLocationOverlay" />
<java-symbol type="bool" name="config_enableHardwareFlpOverlay" />
@@ -2029,6 +2032,10 @@
<java-symbol type="string" name="mmcc_imsi_unknown_in_hlr" />
<java-symbol type="string" name="mmcc_illegal_ms" />
<java-symbol type="string" name="mmcc_illegal_me" />
+ <java-symbol type="string" name="mmcc_authentication_reject_msim_template" />
+ <java-symbol type="string" name="mmcc_imsi_unknown_in_hlr_msim_template" />
+ <java-symbol type="string" name="mmcc_illegal_ms_msim_template" />
+ <java-symbol type="string" name="mmcc_illegal_me_msim_template" />
<java-symbol type="string" name="notification_listener_binding_label" />
<java-symbol type="string" name="vr_listener_binding_label" />
<java-symbol type="string" name="condition_provider_service_binding_label" />
@@ -2115,7 +2122,6 @@
<java-symbol type="layout" name="notification_template_material_big_text" />
<java-symbol type="layout" name="notification_template_header" />
<java-symbol type="layout" name="notification_material_media_action" />
- <java-symbol type="color" name="notification_icon_default_color" />
<java-symbol type="color" name="notification_progress_background_color" />
<java-symbol type="id" name="media_actions" />
@@ -2621,6 +2627,7 @@
<java-symbol type="bool" name="config_cameraDoubleTapPowerGestureEnabled" />
<java-symbol type="integer" name="config_cameraLiftTriggerSensorType" />
<java-symbol type="string" name="config_cameraLiftTriggerSensorStringType" />
+ <java-symbol type="bool" name="config_volumeHushGestureEnabled" />
<java-symbol type="drawable" name="platlogo_m" />
@@ -2779,7 +2786,6 @@
<java-symbol type="drawable" name="ic_user_secure" />
<java-symbol type="string" name="android_upgrading_notification_title" />
- <java-symbol type="string" name="android_upgrading_notification_body" />
<java-symbol type="string" name="usb_mtp_launch_notification_title" />
<java-symbol type="string" name="usb_mtp_launch_notification_description" />
@@ -2965,6 +2971,8 @@
<java-symbol type="color" name="notification_primary_text_color_dark" />
<java-symbol type="color" name="notification_secondary_text_color_light" />
<java-symbol type="color" name="notification_secondary_text_color_dark" />
+ <java-symbol type="color" name="notification_default_color_light" />
+ <java-symbol type="color" name="notification_default_color_dark" />
<java-symbol type="string" name="app_category_game" />
<java-symbol type="string" name="app_category_audio" />
@@ -3232,6 +3240,7 @@
<java-symbol type="id" name="remote_input_progress" />
<java-symbol type="id" name="remote_input_send" />
<java-symbol type="id" name="remote_input" />
+ <java-symbol type="dimen" name="notification_content_margin" />
<java-symbol type="dimen" name="slice_shortcut_size" />
<java-symbol type="dimen" name="slice_icon_size" />
<java-symbol type="dimen" name="slice_padding" />
@@ -3241,7 +3250,6 @@
<java-symbol type="string" name="shortcut_restore_not_supported" />
<java-symbol type="string" name="shortcut_restore_signature_mismatch" />
<java-symbol type="string" name="shortcut_restore_unknown_issue" />
- <java-symbol type="string" name="battery_saver_warning" />
<!-- From media projection -->
<java-symbol type="string" name="config_mediaProjectionPermissionDialogComponent" />
@@ -3252,7 +3260,6 @@
<java-symbol type="string" name="unsupported_compile_sdk_message" />
<java-symbol type="string" name="unsupported_compile_sdk_check_update" />
- <java-symbol type="string" name="battery_saver_warning_title" />
<java-symbol type="string" name="keyguard_accessibility_pattern_unlock" />
<java-symbol type="string" name="keyguard_accessibility_pin_unlock" />
<java-symbol type="string" name="keyguard_accessibility_sim_pin_unlock" />
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 25b053b0f0c5..2327b33e83a7 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -1449,6 +1449,10 @@ easier.
<item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
<item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item>
+ <!-- Button styles -->
+ <item name="buttonCornerRadius">@dimen/config_buttonCornerRadius</item>
+ <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
+
<!-- Color palette -->
<item name="colorPrimary">@color/primary_device_default_light</item>
<item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
index 4628aa9e0f1a..a99e1398a7bf 100644
--- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
+++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
@@ -22,6 +22,7 @@ import android.app.servertransaction.ActivityRelaunchItem;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.ClientTransactionItem;
import android.app.servertransaction.ResumeActivityItem;
+import android.app.servertransaction.StopActivityItem;
import android.content.Intent;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.MediumTest;
@@ -34,6 +35,8 @@ import org.junit.runner.RunWith;
/**
* Test for verifying {@link android.app.ActivityThread} class.
+ * Build/Install/Run:
+ * atest FrameworksCoreTests:android.app.activity.ActivityThreadTest
*/
@RunWith(AndroidJUnit4.class)
@MediumTest
@@ -63,15 +66,23 @@ public class ActivityThreadTest {
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
}
+ @Test
+ public void testSleepAndStop() throws Exception {
+ final Activity activity = mActivityTestRule.launchActivity(new Intent());
+ final IApplicationThread appThread = activity.getActivityThread().getApplicationThread();
+
+ appThread.scheduleSleeping(activity.getActivityToken(), true /* sleeping */);
+ appThread.scheduleTransaction(newStopTransaction(activity));
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+ }
+
private static ClientTransaction newRelaunchResumeTransaction(Activity activity) {
final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(null,
- null, 0, new MergedConfiguration(),
- false /* preserveWindow */);
+ null, 0, new MergedConfiguration(), false /* preserveWindow */);
final ResumeActivityItem resumeStateRequest =
ResumeActivityItem.obtain(true /* isForward */);
- final IApplicationThread appThread = activity.getActivityThread().getApplicationThread();
- final ClientTransaction transaction =
- ClientTransaction.obtain(appThread, activity.getActivityToken());
+
+ final ClientTransaction transaction = newTransaction(activity);
transaction.addCallback(callbackItem);
transaction.setLifecycleStateRequest(resumeStateRequest);
@@ -81,14 +92,28 @@ public class ActivityThreadTest {
private static ClientTransaction newResumeTransaction(Activity activity) {
final ResumeActivityItem resumeStateRequest =
ResumeActivityItem.obtain(true /* isForward */);
- final IApplicationThread appThread = activity.getActivityThread().getApplicationThread();
- final ClientTransaction transaction =
- ClientTransaction.obtain(appThread, activity.getActivityToken());
+
+ final ClientTransaction transaction = newTransaction(activity);
transaction.setLifecycleStateRequest(resumeStateRequest);
return transaction;
}
+ private static ClientTransaction newStopTransaction(Activity activity) {
+ final StopActivityItem stopStateRequest =
+ StopActivityItem.obtain(false /* showWindow */, 0 /* configChanges */);
+
+ final ClientTransaction transaction = newTransaction(activity);
+ transaction.setLifecycleStateRequest(stopStateRequest);
+
+ return transaction;
+ }
+
+ private static ClientTransaction newTransaction(Activity activity) {
+ final IApplicationThread appThread = activity.getActivityThread().getApplicationThread();
+ return ClientTransaction.obtain(appThread, activity.getActivityToken());
+ }
+
// Test activity
public static class TestActivity extends Activity {
}
diff --git a/core/tests/coretests/src/android/net/SntpClientTest.java b/core/tests/coretests/src/android/net/SntpClientTest.java
index 8b8cf671e723..63d4080f6475 100644
--- a/core/tests/coretests/src/android/net/SntpClientTest.java
+++ b/core/tests/coretests/src/android/net/SntpClientTest.java
@@ -16,7 +16,8 @@
package android.net;
-import android.net.SntpClient;
+import android.content.Context;
+import android.test.AndroidTestCase;
import android.util.Log;
import libcore.util.HexEncoding;
@@ -26,10 +27,9 @@ import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Arrays;
-import junit.framework.TestCase;
-public class SntpClientTest extends TestCase {
+public class SntpClientTest extends AndroidTestCase {
private static final String TAG = "SntpClientTest";
private static final int ORIGINATE_TIME_OFFSET = 24;
@@ -61,20 +61,29 @@ public class SntpClientTest extends TestCase {
private final SntpTestServer mServer = new SntpTestServer();
private final SntpClient mClient = new SntpClient();
+ private Network mNetwork;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ ConnectivityManager mCM = getContext().getSystemService(ConnectivityManager.class);
+ mNetwork = mCM.getActiveNetwork();
+ }
+
public void testBasicWorkingSntpClientQuery() throws Exception {
mServer.setServerReply(HexEncoding.decode(WORKING_VERSION4.toCharArray(), false));
- assertTrue(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500));
+ assertTrue(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500, mNetwork));
assertEquals(1, mServer.numRequestsReceived());
assertEquals(1, mServer.numRepliesSent());
}
public void testDnsResolutionFailure() throws Exception {
- assertFalse(mClient.requestTime("ntp.server.doesnotexist.example", 5000));
+ assertFalse(mClient.requestTime("ntp.server.doesnotexist.example", 5000, mNetwork));
}
public void testTimeoutFailure() throws Exception {
mServer.clearServerReply();
- assertFalse(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500));
+ assertFalse(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500, mNetwork));
assertEquals(1, mServer.numRequestsReceived());
assertEquals(0, mServer.numRepliesSent());
}
@@ -83,7 +92,7 @@ public class SntpClientTest extends TestCase {
final byte[] reply = HexEncoding.decode(WORKING_VERSION4.toCharArray(), false);
reply[0] |= (byte) 0xc0;
mServer.setServerReply(reply);
- assertFalse(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500));
+ assertFalse(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500, mNetwork));
assertEquals(1, mServer.numRequestsReceived());
assertEquals(1, mServer.numRepliesSent());
}
@@ -95,7 +104,8 @@ public class SntpClientTest extends TestCase {
reply[0] &= (byte) 0xf8;
reply[0] |= (byte) i;
mServer.setServerReply(reply);
- final boolean rval = mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500);
+ final boolean rval = mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500,
+ mNetwork);
switch (i) {
case NTP_MODE_SERVER:
case NTP_MODE_BROADCAST:
@@ -119,7 +129,8 @@ public class SntpClientTest extends TestCase {
final String logMsg = "stratum: " + i;
reply[1] = (byte) i;
mServer.setServerReply(reply);
- final boolean rval = mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500);
+ final boolean rval = mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500,
+ mNetwork);
if (STRATUM_MIN <= i && i <= STRATUM_MAX) {
assertTrue(logMsg, rval);
} else {
@@ -134,7 +145,7 @@ public class SntpClientTest extends TestCase {
final byte[] reply = HexEncoding.decode(WORKING_VERSION4.toCharArray(), false);
Arrays.fill(reply, TRANSMIT_TIME_OFFSET, TRANSMIT_TIME_OFFSET + 8, (byte) 0x00);
mServer.setServerReply(reply);
- assertFalse(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500));
+ assertFalse(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500, mNetwork));
assertEquals(1, mServer.numRequestsReceived());
assertEquals(1, mServer.numRepliesSent());
}
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 63343bef67e7..a504ab9dda2d 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -117,7 +117,7 @@ public class SettingsBackupTest {
Settings.Global.APP_STANDBY_ENABLED,
Settings.Global.ASSISTED_GPS_ENABLED,
Settings.Global.AUDIO_SAFE_VOLUME_STATE,
- Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES,
+ Settings.Global.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES,
Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD,
Settings.Global.BATTERY_DISCHARGE_THRESHOLD,
Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS,
@@ -170,6 +170,7 @@ public class SettingsBackupTest {
Settings.Global.CONNECTIVITY_SAMPLING_INTERVAL_IN_SECONDS,
Settings.Global.CONTACT_METADATA_SYNC_ENABLED,
Settings.Global.CONTACTS_DATABASE_WAL_ENABLED,
+ Settings.Global.CPU_SCALING_ENABLED,
Settings.Global.DATA_ACTIVITY_TIMEOUT_MOBILE,
Settings.Global.DATA_ACTIVITY_TIMEOUT_WIFI,
Settings.Global.DATABASE_CREATION_BUILDID,
@@ -267,6 +268,7 @@ public class SettingsBackupTest {
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL_MAX,
Settings.Global.LTE_SERVICE_FORCED,
Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE,
+ Settings.Global.MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY,
Settings.Global.MDC_INITIAL_MAX_RETRY,
Settings.Global.MHL_INPUT_SWITCHING_ENABLED,
Settings.Global.MHL_POWER_CHARGE_ENABLED,
@@ -370,10 +372,12 @@ public class SettingsBackupTest {
Settings.Global.SMS_SHORT_CODE_RULE,
Settings.Global.SMS_SHORT_CODES_UPDATE_CONTENT_URL,
Settings.Global.SMS_SHORT_CODES_UPDATE_METADATA_URL,
+ Settings.Global.SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT,
Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
Settings.Global.SQLITE_COMPATIBILITY_WAL_FLAGS,
Settings.Global.STORAGE_BENCHMARK_INTERVAL,
Settings.Global.STORAGE_SETTINGS_CLOBBER_THRESHOLD,
+ Settings.Global.SWAP_ENABLED,
Settings.Global.SYNC_MANAGER_CONSTANTS,
Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS,
Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL,
@@ -447,6 +451,7 @@ public class SettingsBackupTest {
Settings.Global.WIFI_SAVED_STATE,
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
Settings.Global.WIFI_SCAN_INTERVAL_WHEN_P2P_CONNECTED_MS,
+ Settings.Global.WIFI_SCORE_PARAMS,
Settings.Global.WIFI_SLEEP_POLICY,
Settings.Global.WIFI_SUPPLICANT_SCAN_INTERVAL_MS,
Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED,
@@ -578,7 +583,9 @@ public class SettingsBackupTest {
Settings.Secure.KEYGUARD_SLICE_URI,
Settings.Secure.PARENTAL_CONTROL_ENABLED,
Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
- Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING);
+ Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING,
+ Settings.Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT,
+ Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED);
@Test
public void systemSettingsBackedUpOrBlacklisted() {
diff --git a/core/tests/coretests/src/android/security/backup/TrustedRootCertificatesTest.java b/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java
index 0f9cb45b8899..a5a3ca90d9ac 100644
--- a/core/tests/coretests/src/android/security/backup/TrustedRootCertificatesTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/TrustedRootCertificatesTest.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package android.security.backup;
+package android.security.keystore.recovery;
-import static android.security.backup.TrustedRootCertificates.listRootCertificates;
+import static android.security.keystore.recovery.TrustedRootCertificates.getRootCertificates;
import static org.junit.Assert.assertTrue;
@@ -36,8 +36,8 @@ public class TrustedRootCertificatesTest {
"GoogleCloudKeyVaultServiceV1";
@Test
- public void listRootCertificates_listsGoogleCloudVaultV1Certificate() {
- Map<String, X509Certificate> certificates = listRootCertificates();
+ public void getRootCertificates_listsGoogleCloudVaultV1Certificate() {
+ Map<String, X509Certificate> certificates = getRootCertificates();
assertTrue(certificates.containsKey(GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS));
}
diff --git a/core/tests/coretests/src/android/security/backup/X509CertificateParsingUtilsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java
index ad85c2518325..7f0eb43f23be 100644
--- a/core/tests/coretests/src/android/security/backup/X509CertificateParsingUtilsTest.java
+++ b/core/tests/coretests/src/android/security/keystore/recovery/X509CertificateParsingUtilsTest.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package android.security.backup;
+package android.security.keystore.recovery;
-import static android.security.backup.X509CertificateParsingUtils.decodeBase64Cert;
+import static android.security.keystore.recovery.X509CertificateParsingUtils.decodeBase64Cert;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
diff --git a/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java b/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java
new file mode 100644
index 000000000000..c205f9695bb8
--- /dev/null
+++ b/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java
@@ -0,0 +1,163 @@
+/*
+ * 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.text;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import android.annotation.NonNull;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.text.style.QuoteSpan;
+import android.text.style.UnderlineSpan;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SpannableStringNoCopyTest {
+ @Test
+ public void testCopyConstructor_copyNoCopySpans_SpannableStringInternalImpl() {
+ final SpannableString first = new SpannableString("t\nest data");
+ first.setSpan(new QuoteSpan(), 0, 2, Spanned.SPAN_PARAGRAPH);
+ first.setSpan(new NoCopySpan.Concrete(), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
+
+ // By default, copy NoCopySpans
+ final SpannedString copied = new SpannedString(first);
+ final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
+ assertNotNull(spans);
+ assertEquals(3, spans.length);
+ }
+
+ @Test
+ public void testCopyConstructor_doesNotCopyNoCopySpans_SpannableStringInternalImpl() {
+ final SpannableString first = new SpannableString("t\nest data");
+ first.setSpan(new QuoteSpan(), 0, 2, Spanned.SPAN_PARAGRAPH);
+ first.setSpan(new NoCopySpan.Concrete(), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
+
+ // Do not copy NoCopySpan if specified so.
+ final SpannedString copied = new SpannedString(first, false /* copyNoCopySpan */);
+ final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
+ assertNotNull(spans);
+ assertEquals(2, spans.length);
+
+ for (int i = 0; i < spans.length; i++) {
+ assertFalse(spans[i] instanceof NoCopySpan);
+ }
+ }
+
+ @Test
+ public void testCopyConstructor_copyNoCopySpans_OtherSpannableImpl() {
+ final SpannableString first = new SpannableString("t\nest data");
+ first.setSpan(new QuoteSpan(), 0, 2, Spanned.SPAN_PARAGRAPH);
+ first.setSpan(new NoCopySpan.Concrete(), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
+
+ // By default, copy NoCopySpans
+ final SpannedString copied = new SpannedString(new CustomSpannable(first));
+ final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
+ assertNotNull(spans);
+ assertEquals(3, spans.length);
+ }
+
+ @Test
+ public void testCopyConstructor_doesNotCopyNoCopySpans_OtherSpannableImpl() {
+ final SpannableString first = new SpannableString("t\nest data");
+ first.setSpan(new QuoteSpan(), 0, 2, Spanned.SPAN_PARAGRAPH);
+ first.setSpan(new NoCopySpan.Concrete(), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
+
+ // Do not copy NoCopySpan if specified so.
+ final SpannedString copied = new SpannedString(
+ new CustomSpannable(first), false /* copyNoCopySpan */);
+ final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
+ assertNotNull(spans);
+ assertEquals(2, spans.length);
+
+ for (int i = 0; i < spans.length; i++) {
+ assertFalse(spans[i] instanceof NoCopySpan);
+ }
+ }
+
+ // A custom implementation of Spannable.
+ private static class CustomSpannable implements Spannable {
+ private final @NonNull Spannable mText;
+
+ CustomSpannable(@NonNull Spannable text) {
+ mText = text;
+ }
+
+ @Override
+ public void setSpan(Object what, int start, int end, int flags) {
+ mText.setSpan(what, start, end, flags);
+ }
+
+ @Override
+ public void removeSpan(Object what) {
+ mText.removeSpan(what);
+ }
+
+ @Override
+ public <T> T[] getSpans(int start, int end, Class<T> type) {
+ return mText.getSpans(start, end, type);
+ }
+
+ @Override
+ public int getSpanStart(Object tag) {
+ return mText.getSpanStart(tag);
+ }
+
+ @Override
+ public int getSpanEnd(Object tag) {
+ return mText.getSpanEnd(tag);
+ }
+
+ @Override
+ public int getSpanFlags(Object tag) {
+ return mText.getSpanFlags(tag);
+ }
+
+ @Override
+ public int nextSpanTransition(int start, int limit, Class type) {
+ return mText.nextSpanTransition(start, limit, type);
+ }
+
+ @Override
+ public int length() {
+ return mText.length();
+ }
+
+ @Override
+ public char charAt(int index) {
+ return mText.charAt(index);
+ }
+
+ @Override
+ public CharSequence subSequence(int start, int end) {
+ return mText.subSequence(start, end);
+ }
+
+ @Override
+ public String toString() {
+ return mText.toString();
+ }
+ };
+}
diff --git a/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java b/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java
new file mode 100644
index 000000000000..068092484b1b
--- /dev/null
+++ b/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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.text;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import android.annotation.NonNull;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.text.style.QuoteSpan;
+import android.text.style.UnderlineSpan;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SpannedStringNoCopyTest {
+ @Test
+ public void testCopyConstructor_copyNoCopySpans_SpannableStringInternalImpl() {
+ final SpannableString first = new SpannableString("t\nest data");
+ first.setSpan(new QuoteSpan(), 0, 2, Spanned.SPAN_PARAGRAPH);
+ first.setSpan(new NoCopySpan.Concrete(), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
+
+ // By default, copy NoCopySpans
+ final SpannedString copied = new SpannedString(first);
+ final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
+ assertNotNull(spans);
+ assertEquals(3, spans.length);
+ }
+
+ @Test
+ public void testCopyConstructor_doesNotCopyNoCopySpans_SpannableStringInternalImpl() {
+ final SpannableString first = new SpannableString("t\nest data");
+ first.setSpan(new QuoteSpan(), 0, 2, Spanned.SPAN_PARAGRAPH);
+ first.setSpan(new NoCopySpan.Concrete(), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
+
+ // Do not copy NoCopySpan if specified so.
+ final SpannedString copied = new SpannedString(first, false /* copyNoCopySpan */);
+ final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
+ assertNotNull(spans);
+ assertEquals(2, spans.length);
+
+ for (int i = 0; i < spans.length; i++) {
+ assertFalse(spans[i] instanceof NoCopySpan);
+ }
+ }
+
+ @Test
+ public void testCopyConstructor_copyNoCopySpans_OtherSpannedImpl() {
+ final SpannableString first = new SpannableString("t\nest data");
+ first.setSpan(new QuoteSpan(), 0, 2, Spanned.SPAN_PARAGRAPH);
+ first.setSpan(new NoCopySpan.Concrete(), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
+
+ // By default, copy NoCopySpans
+ final SpannedString copied = new SpannedString(new CustomSpanned(first));
+ final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
+ assertNotNull(spans);
+ assertEquals(3, spans.length);
+ }
+
+ @Test
+ public void testCopyConstructor_doesNotCopyNoCopySpans_OtherSpannedImpl() {
+ final SpannableString first = new SpannableString("t\nest data");
+ first.setSpan(new QuoteSpan(), 0, 2, Spanned.SPAN_PARAGRAPH);
+ first.setSpan(new NoCopySpan.Concrete(), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
+
+ // Do not copy NoCopySpan if specified so.
+ final SpannedString copied = new SpannedString(
+ new CustomSpanned(first), false /* copyNoCopySpan */);
+ final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
+ assertNotNull(spans);
+ assertEquals(2, spans.length);
+
+ for (int i = 0; i < spans.length; i++) {
+ assertFalse(spans[i] instanceof NoCopySpan);
+ }
+ }
+
+ // A custom implementation of Spanned
+ private static class CustomSpanned implements Spanned {
+ private final @NonNull Spanned mText;
+
+ CustomSpanned(@NonNull Spannable text) {
+ mText = text;
+ }
+
+ @Override
+ public <T> T[] getSpans(int start, int end, Class<T> type) {
+ return mText.getSpans(start, end, type);
+ }
+
+ @Override
+ public int getSpanStart(Object tag) {
+ return mText.getSpanStart(tag);
+ }
+
+ @Override
+ public int getSpanEnd(Object tag) {
+ return mText.getSpanEnd(tag);
+ }
+
+ @Override
+ public int getSpanFlags(Object tag) {
+ return mText.getSpanFlags(tag);
+ }
+
+ @Override
+ public int nextSpanTransition(int start, int limit, Class type) {
+ return mText.nextSpanTransition(start, limit, type);
+ }
+
+ @Override
+ public int length() {
+ return mText.length();
+ }
+
+ @Override
+ public char charAt(int index) {
+ return mText.charAt(index);
+ }
+
+ @Override
+ public CharSequence subSequence(int start, int end) {
+ return mText.subSequence(start, end);
+ }
+
+ @Override
+ public String toString() {
+ return mText.toString();
+ }
+ };
+}
diff --git a/core/tests/coretests/src/android/text/util/LinkifyTest.java b/core/tests/coretests/src/android/text/util/LinkifyTest.java
index be3a0be079bf..2fe7db439a64 100644
--- a/core/tests/coretests/src/android/text/util/LinkifyTest.java
+++ b/core/tests/coretests/src/android/text/util/LinkifyTest.java
@@ -31,6 +31,11 @@ import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.util.Patterns;
+import android.view.textclassifier.SystemTextClassifier;
+import android.view.textclassifier.TextClassificationConstants;
+import android.view.textclassifier.TextClassifier;
+import android.view.textclassifier.TextClassifierImpl;
+import android.view.textclassifier.TextLinks.TextLinkSpan;
import android.widget.TextView;
import org.junit.After;
@@ -38,7 +43,11 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
import java.util.Locale;
+import java.util.Set;
/**
* LinkifyTest tests {@link Linkify}.
@@ -149,4 +158,55 @@ public class LinkifyTest {
assertEquals("android.com should be linkified", 1, spans.length);
assertEquals("https://android.com", spans[0].getURL());
}
+
+ @Test
+ public void testAddLinksAsync_useLegacyIfSmartDisabled_localTextClassifier()
+ throws Exception {
+ final TextClassificationConstants settings =
+ TextClassificationConstants.loadFromString("smart_linkify_enabled=false");
+ final TextClassifier classifier = new TextClassifierImpl(mContext, settings);
+ testAddLinksAsync_useLegacyIfSmartDisabled(classifier);
+ }
+
+ @Test
+ public void testAddLinksAsync_useLegacyIfSmartDisabled_systemTextClassifier()
+ throws Exception {
+ final TextClassificationConstants settings =
+ TextClassificationConstants.loadFromString("smart_linkify_enabled=false");
+ final TextClassifier classifier = new SystemTextClassifier(mContext, settings);
+ testAddLinksAsync_useLegacyIfSmartDisabled(classifier);
+ }
+
+ private void testAddLinksAsync_useLegacyIfSmartDisabled(TextClassifier classifier)
+ throws Exception {
+ final int linkMask = Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS | Linkify.WEB_URLS;
+ final String string = "example@android.com\n"
+ + "(415) 555-1212\n"
+ + "http://android.com\n"
+ + "100 Android Rd California";
+ final Spannable expected = new SpannableString(string);
+ final Spannable actual = new SpannableString(string);
+
+ Linkify.addLinks(expected, linkMask); // legacy.
+ Linkify.addLinksAsync(actual, classifier, linkMask).get();
+
+ final URLSpan[] expectedSpans = expected.getSpans(0, expected.length(), URLSpan.class);
+ final TextLinkSpan[] actualSpans = actual.getSpans(0, actual.length(), TextLinkSpan.class);
+ assertEquals(expectedSpans.length, actualSpans.length);
+ final Set<List> expectedLinkSpec = new HashSet<>();
+ final Set<List> actualLinkSpec = new HashSet<>();
+ for (int i = 0; i < expectedSpans.length; i++) {
+ final URLSpan expectedSpan = expectedSpans[i];
+ final TextLinkSpan actualSpan = actualSpans[i];
+ expectedLinkSpec.add(Arrays.asList(
+ expected.getSpanStart(expectedSpan),
+ expected.getSpanEnd(expectedSpan),
+ expectedSpan.getURL()));
+ actualLinkSpec.add(Arrays.asList(
+ actual.getSpanStart(actualSpan),
+ actual.getSpanEnd(actualSpan),
+ actualSpan.getUrl()));
+ }
+ assertEquals(expectedLinkSpec, actualLinkSpec);
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
index e6ac68294564..1fd24e3f237e 100644
--- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
@@ -99,6 +99,10 @@ public class InputMethodUtilsTest {
assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_US,
"DummyDefaultEnKeyboardIme", "DummyNonDefaultAutoVoiceIme0",
"DummyNonDefaultAutoVoiceIme1");
+ assertDefaultEnabledMinimumImes(getImesWithDefaultVoiceIme(), LOCALE_EN_US,
+ "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledMinimumImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_US,
+ "DummyDefaultEnKeyboardIme");
// locale: en_GB
assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB,
@@ -106,6 +110,10 @@ public class InputMethodUtilsTest {
assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_GB,
"DummyDefaultEnKeyboardIme", "DummyNonDefaultAutoVoiceIme0",
"DummyNonDefaultAutoVoiceIme1");
+ assertDefaultEnabledMinimumImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB,
+ "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledMinimumImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_GB,
+ "DummyDefaultEnKeyboardIme");
// locale: ja_JP
assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP,
@@ -113,6 +121,10 @@ public class InputMethodUtilsTest {
assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_JA_JP,
"DummyDefaultEnKeyboardIme", "DummyNonDefaultAutoVoiceIme0",
"DummyNonDefaultAutoVoiceIme1");
+ assertDefaultEnabledMinimumImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP,
+ "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledMinimumImes(getImesWithoutDefaultVoiceIme(), LOCALE_JA_JP,
+ "DummyDefaultEnKeyboardIme");
}
@Test
@@ -120,34 +132,49 @@ public class InputMethodUtilsTest {
// locale: en_US
assertDefaultEnabledImes(getSamplePreinstalledImes("en-rUS"), LOCALE_EN_US,
"com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("en-rUS"), LOCALE_EN_US,
+ "com.android.apps.inputmethod.latin");
// locale: en_GB
assertDefaultEnabledImes(getSamplePreinstalledImes("en-rGB"), LOCALE_EN_GB,
"com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("en-rGB"), LOCALE_EN_GB,
+ "com.android.apps.inputmethod.latin");
// locale: en_IN
assertDefaultEnabledImes(getSamplePreinstalledImes("en-rIN"), LOCALE_EN_IN,
"com.android.apps.inputmethod.hindi",
"com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("en-rIN"), LOCALE_EN_IN,
+ "com.android.apps.inputmethod.hindi",
+ "com.android.apps.inputmethod.latin");
// locale: hi
assertDefaultEnabledImes(getSamplePreinstalledImes("hi"), LOCALE_HI,
"com.android.apps.inputmethod.hindi", "com.android.apps.inputmethod.latin",
"com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("hi"), LOCALE_HI,
+ "com.android.apps.inputmethod.hindi", "com.android.apps.inputmethod.latin");
// locale: ja_JP
assertDefaultEnabledImes(getSamplePreinstalledImes("ja-rJP"), LOCALE_JA_JP,
"com.android.apps.inputmethod.japanese", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("ja-rJP"), LOCALE_JA_JP,
+ "com.android.apps.inputmethod.japanese");
// locale: zh_CN
assertDefaultEnabledImes(getSamplePreinstalledImes("zh-rCN"), LOCALE_ZH_CN,
"com.android.apps.inputmethod.pinyin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("zh-rCN"), LOCALE_ZH_CN,
+ "com.android.apps.inputmethod.pinyin");
// locale: zh_TW
// Note: In this case, no IME is suitable for the system locale. Hence we will pick up a
// fallback IME regardless of the "default" attribute.
assertDefaultEnabledImes(getSamplePreinstalledImes("zh-rTW"), LOCALE_ZH_TW,
"com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
+ assertDefaultEnabledMinimumImes(getSamplePreinstalledImes("zh-rTW"), LOCALE_ZH_TW,
+ "com.android.apps.inputmethod.latin");
}
@Test
@@ -785,6 +812,18 @@ public class InputMethodUtilsTest {
}
}
+ private void assertDefaultEnabledMinimumImes(final ArrayList<InputMethodInfo> preinstalledImes,
+ final Locale systemLocale, String... expectedImeNames) {
+ final Context context = createTargetContextWithLocales(new LocaleList(systemLocale));
+ final String[] actualImeNames = getPackageNames(
+ InputMethodUtils.getDefaultEnabledImes(context, preinstalledImes,
+ true /* onlyMinimum */));
+ assertEquals(expectedImeNames.length, actualImeNames.length);
+ for (int i = 0; i < expectedImeNames.length; ++i) {
+ assertEquals(expectedImeNames[i], actualImeNames[i]);
+ }
+ }
+
private static List<InputMethodInfo> cloneViaParcel(final List<InputMethodInfo> list) {
Parcel p = null;
try {
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
index f5fe80c0f6ae..94492bad28a2 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -43,6 +43,7 @@ import org.junit.runners.Suite;
KernelUidCpuActiveTimeReaderTest.class,
KernelUidCpuClusterTimeReaderTest.class,
KernelWakelockReaderTest.class,
+ LongSamplingCounterTest.class,
LongSamplingCounterArrayTest.class,
PowerCalculatorTest.class,
PowerProfileTest.class
diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java
new file mode 100644
index 000000000000..853bf8a079a6
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import static android.os.BatteryStats.STATS_SINCE_CHARGED;
+
+import static com.android.internal.os.BatteryStatsImpl.LongSamplingCounter;
+import static com.android.internal.os.BatteryStatsImpl.TimeBase;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.os.Parcel;
+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.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Test class for {@link LongSamplingCounter}.
+ *
+ * To run the tests, use
+ *
+ * bit FrameworksCoreTests:com.android.internal.os.LongSamplingCounterTest
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class LongSamplingCounterTest {
+
+ private static final long COUNT = 1111;
+ private static final long CURRENT_COUNT = 5555;
+
+ @Mock
+ private TimeBase mTimeBase;
+ private LongSamplingCounter mCounter;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mCounter = new LongSamplingCounter(mTimeBase);
+ Mockito.reset(mTimeBase);
+ }
+
+ @Test
+ public void testReadWriteParcel() {
+ final Parcel parcel = Parcel.obtain();
+ updateCounts(COUNT, CURRENT_COUNT);
+ mCounter.writeToParcel(parcel);
+ parcel.setDataPosition(0);
+
+ // Now clear counterArray and verify values are read from parcel correctly.
+ updateCounts(0, 0);
+
+ mCounter = new LongSamplingCounter(mTimeBase, parcel);
+ assertEquals(COUNT, mCounter.mCount);
+ assertEquals(CURRENT_COUNT, mCounter.mCurrentCount);
+ parcel.recycle();
+ }
+
+ @Test
+ public void testReadWriteSummaryParcel() {
+ final Parcel parcel = Parcel.obtain();
+ updateCounts(COUNT, CURRENT_COUNT);
+ mCounter.writeSummaryFromParcelLocked(parcel);
+ parcel.setDataPosition(0);
+
+ // Now clear counterArray and verify values are read from parcel correctly.
+ updateCounts(0, 0);
+
+ mCounter.readSummaryFromParcelLocked(parcel);
+ assertEquals(COUNT, mCounter.mCount);
+ parcel.recycle();
+ }
+
+ @Test
+ public void testOnTimeStarted() {
+ updateCounts(COUNT, CURRENT_COUNT);
+ mCounter.onTimeStarted(0, 0, 0);
+ assertEquals(COUNT, mCounter.mCount);
+ assertEquals(COUNT, mCounter.mUnpluggedCount);
+ }
+
+ @Test
+ public void testOnTimeStopped() {
+ updateCounts(COUNT, CURRENT_COUNT);
+ mCounter.onTimeStopped(0, 0, 0);
+ assertEquals(COUNT, mCounter.mCount);
+ }
+
+ @Test
+ public void testAddCountLocked() {
+ updateCounts(0, 0);
+ assertEquals(0, mCounter.getCountLocked(0));
+ when(mTimeBase.isRunning()).thenReturn(true);
+ mCounter.addCountLocked(111);
+ assertEquals(111, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(111, mCounter.mCurrentCount);
+ mCounter.addCountLocked(222);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(333, mCounter.mCurrentCount);
+
+ when(mTimeBase.isRunning()).thenReturn(false);
+ mCounter.addCountLocked(456);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(789, mCounter.mCurrentCount);
+
+ mCounter.addCountLocked(444, true);
+ assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(1233, mCounter.mCurrentCount);
+ mCounter.addCountLocked(567, false);
+ assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(1800, mCounter.mCurrentCount);
+ }
+
+ @Test
+ public void testUpdate() {
+ updateCounts(0, 0);
+ assertEquals(0, mCounter.getCountLocked(0));
+ when(mTimeBase.isRunning()).thenReturn(true);
+ mCounter.update(111);
+ assertEquals(111, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(111, mCounter.mCurrentCount);
+ mCounter.update(333);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(333, mCounter.mCurrentCount);
+
+ when(mTimeBase.isRunning()).thenReturn(false);
+ mCounter.update(789);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(789, mCounter.mCurrentCount);
+ mCounter.update(100);
+ assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(100, mCounter.mCurrentCount);
+
+ mCounter.update(544, true);
+ assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(544, mCounter.mCurrentCount);
+ mCounter.update(1544, false);
+ assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(1544, mCounter.mCurrentCount);
+ }
+
+ @Test
+ public void testReset() {
+ updateCounts(COUNT, CURRENT_COUNT);
+ // Test with detachIfReset=false
+ mCounter.reset(false /* detachIfReset */);
+ assertEquals(0, mCounter.mCount);
+ assertEquals(CURRENT_COUNT, mCounter.mCurrentCount);
+ verifyZeroInteractions(mTimeBase);
+
+ updateCounts(COUNT, CURRENT_COUNT);
+ // Test with detachIfReset=true
+ mCounter.reset(true /* detachIfReset */);
+ assertEquals(0, mCounter.mCount);
+ assertEquals(CURRENT_COUNT, mCounter.mCurrentCount);
+ verify(mTimeBase).remove(mCounter);
+ verifyNoMoreInteractions(mTimeBase);
+ }
+
+ @Test
+ public void testDetach() {
+ mCounter.detach();
+ verify(mTimeBase).remove(mCounter);
+ verifyNoMoreInteractions(mTimeBase);
+ }
+
+ private void updateCounts(long total, long current) {
+ mCounter.mCount = total;
+ mCounter.mCurrentCount = current;
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
index 002df881f216..518cadd7d8e2 100644
--- a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
+++ b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
@@ -16,7 +16,6 @@
package com.android.internal.policy;
-import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
@@ -27,7 +26,6 @@ import static org.junit.Assert.assertThat;
import android.content.Context;
import android.platform.test.annotations.Presubmit;
import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.ActionMode;
@@ -44,7 +42,6 @@ import org.junit.runner.RunWith;
*/
@SmallTest
@Presubmit
-@FlakyTest(detail = "Promote to presubmit once monitored to be stable.")
@RunWith(AndroidJUnit4.class)
public final class PhoneWindowTest {
diff --git a/core/tests/privacytests/Android.mk b/core/tests/privacytests/Android.mk
index 374d0d0687c3..3c1526b7dc48 100644
--- a/core/tests/privacytests/Android.mk
+++ b/core/tests/privacytests/Android.mk
@@ -8,7 +8,7 @@ LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := junit rappor-tests android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := junit rappor-tests android-support-test truth-prebuilt
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_PACKAGE_NAME := FrameworksPrivacyLibraryTests
diff --git a/core/tests/privacytests/src/android/privacy/LongitudinalReportingEncoderTest.java b/core/tests/privacytests/src/android/privacy/LongitudinalReportingEncoderTest.java
index 6fe19a263e8b..c88a722c026b 100644
--- a/core/tests/privacytests/src/android/privacy/LongitudinalReportingEncoderTest.java
+++ b/core/tests/privacytests/src/android/privacy/LongitudinalReportingEncoderTest.java
@@ -16,6 +16,7 @@
package android.privacy;
+import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -72,27 +73,27 @@ public class LongitudinalReportingEncoderTest {
final LongitudinalReportingEncoder encoder =
LongitudinalReportingEncoder.createInsecureEncoderForTest(
config);
- assertEquals(0, encoder.encodeBoolean(true)[0]);
- assertEquals(0, encoder.encodeBoolean(true)[0]);
assertEquals(1, encoder.encodeBoolean(true)[0]);
- assertEquals(0, encoder.encodeBoolean(true)[0]);
assertEquals(1, encoder.encodeBoolean(true)[0]);
assertEquals(1, encoder.encodeBoolean(true)[0]);
+ assertEquals(0, encoder.encodeBoolean(true)[0]);
assertEquals(1, encoder.encodeBoolean(true)[0]);
assertEquals(1, encoder.encodeBoolean(true)[0]);
assertEquals(1, encoder.encodeBoolean(true)[0]);
assertEquals(1, encoder.encodeBoolean(true)[0]);
+ assertEquals(0, encoder.encodeBoolean(true)[0]);
+ assertEquals(0, encoder.encodeBoolean(true)[0]);
assertEquals(0, encoder.encodeBoolean(false)[0]);
assertEquals(1, encoder.encodeBoolean(false)[0]);
assertEquals(1, encoder.encodeBoolean(false)[0]);
- assertEquals(1, encoder.encodeBoolean(false)[0]);
assertEquals(0, encoder.encodeBoolean(false)[0]);
assertEquals(0, encoder.encodeBoolean(false)[0]);
- assertEquals(1, encoder.encodeBoolean(false)[0]);
assertEquals(0, encoder.encodeBoolean(false)[0]);
- assertEquals(1, encoder.encodeBoolean(false)[0]);
- assertEquals(1, encoder.encodeBoolean(false)[0]);
+ assertEquals(0, encoder.encodeBoolean(false)[0]);
+ assertEquals(0, encoder.encodeBoolean(false)[0]);
+ assertEquals(0, encoder.encodeBoolean(false)[0]);
+ assertEquals(0, encoder.encodeBoolean(false)[0]);
// Test if IRR returns original result when f = 0
final LongitudinalReportingConfig config2 = new LongitudinalReportingConfig(
@@ -128,6 +129,31 @@ public class LongitudinalReportingEncoderTest {
}
@Test
+ public void testLongitudinalReportingInsecureEncoder_setSeedCorrectly() throws Exception {
+ final int n = 10000;
+ final double f = 0.35;
+ final double expectedTrueSum = n * f;
+ final double valueRange = 5 * Math.sqrt(n * f * (1 - f));
+ int trueSum = 0;
+ for (int i = 0; i < n; i++) {
+ final LongitudinalReportingConfig config = new LongitudinalReportingConfig(
+ "encoder" + i, // encoderId
+ f, // probabilityF
+ 0, // probabilityP
+ 1); // probabilityQ
+ final LongitudinalReportingEncoder encoder
+ = LongitudinalReportingEncoder.createInsecureEncoderForTest(config);
+ boolean encodedFalse = encoder.encodeBoolean(false)[0] > 0;
+ if (encodedFalse) {
+ trueSum += 1;
+ }
+ }
+ // Total number of true(s) should be around the mean (10000 * 0.35)
+ assertThat((double) trueSum).isLessThan(expectedTrueSum + valueRange);
+ assertThat((double) trueSum).isAtLeast(expectedTrueSum - valueRange);
+ }
+
+ @Test
public void testLongitudinalReportingEncoder_basicPRRTest() throws Exception {
// Should always return original value when p = 0
for (int i = 0; i < 10; i++) {
@@ -290,8 +316,8 @@ public class LongitudinalReportingEncoderTest {
}
}
// Total number of true(s) should be around the mean (1000 * 0.8)
- assertTrue(trueSum1 < expectedTrueSum1 + valueRange1);
- assertTrue(trueSum1 > expectedTrueSum1 - valueRange1);
+ assertThat((double) trueSum1).isLessThan(expectedTrueSum1 + valueRange1);
+ assertThat((double) trueSum1).isAtLeast(expectedTrueSum1 - valueRange1);
// Confirm if PRR randomizer is working correctly
final int n2 = 1000;
@@ -314,8 +340,8 @@ public class LongitudinalReportingEncoderTest {
}
}
// Total number of true(s) should be around the mean (1000 * 0.2)
- assertTrue(trueSum2 < expectedTrueSum2 + valueRange2);
- assertTrue(trueSum2 > expectedTrueSum2 - valueRange2);
+ assertThat((double) trueSum2).isLessThan(expectedTrueSum2 + valueRange2);
+ assertThat((double) trueSum2).isAtLeast(expectedTrueSum2 - valueRange2);
}
@Test
diff --git a/core/tests/privacytests/src/android/privacy/RapporEncoderTest.java b/core/tests/privacytests/src/android/privacy/RapporEncoderTest.java
index fa0343df88b4..71bd8f1c7bf0 100644
--- a/core/tests/privacytests/src/android/privacy/RapporEncoderTest.java
+++ b/core/tests/privacytests/src/android/privacy/RapporEncoderTest.java
@@ -79,11 +79,11 @@ public class RapporEncoderTest {
public void testRapporEncoder_IRRWithPRR() throws Exception {
int numBits = 8;
final long inputValue = 254L;
- final long prrValue = 250L;
- final long prrAndIrrValue = 244L;
+ final long expectedPrrValue = 126L;
+ final long expectedPrrAndIrrValue = 79L;
final RapporConfig config1 = new RapporConfig(
- "Foo", // encoderId
+ "Foo2", // encoderId
numBits, // numBits,
0.25, // probabilityF
0, // probabilityP
@@ -93,12 +93,12 @@ public class RapporEncoderTest {
// Use insecure encoder here as we want to get the exact output.
final RapporEncoder encoder1 = RapporEncoder.createInsecureEncoderForTest(config1);
// Verify that PRR is working as expected.
- assertEquals(prrValue, toLong(encoder1.encodeBits(toBytes(inputValue))));
+ assertEquals(expectedPrrValue, toLong(encoder1.encodeBits(toBytes(inputValue))));
assertTrue(encoder1.isInsecureEncoderForTest());
// Verify that IRR is working as expected.
final RapporConfig config2 = new RapporConfig(
- "Foo", // encoderId
+ "Foo2", // encoderId
numBits, // numBits,
0, // probabilityF
0.3, // probabilityP
@@ -107,11 +107,12 @@ public class RapporEncoderTest {
2); // numBloomHashes
// Use insecure encoder here as we want to get the exact output.
final RapporEncoder encoder2 = RapporEncoder.createInsecureEncoderForTest(config2);
- assertEquals(prrAndIrrValue, toLong(encoder2.encodeBits(toBytes(prrValue))));
+ assertEquals(expectedPrrAndIrrValue,
+ toLong(encoder2.encodeBits(toBytes(expectedPrrValue))));
// Test that end-to-end is the result of PRR + IRR.
final RapporConfig config3 = new RapporConfig(
- "Foo", // encoderId
+ "Foo2", // encoderId
numBits, // numBits,
0.25, // probabilityF
0.3, // probabilityP
@@ -120,7 +121,7 @@ public class RapporEncoderTest {
2); // numBloomHashes
final RapporEncoder encoder3 = RapporEncoder.createInsecureEncoderForTest(config3);
// Verify that PRR is working as expected.
- assertEquals(prrAndIrrValue, toLong(encoder3.encodeBits(toBytes(inputValue))));
+ assertEquals(expectedPrrAndIrrValue, toLong(encoder3.encodeBits(toBytes(inputValue))));
}
@Test
diff --git a/data/etc/hiddenapi-package-whitelist.xml b/data/etc/hiddenapi-package-whitelist.xml
index be0372deb14e..bacddf14e35d 100644
--- a/data/etc/hiddenapi-package-whitelist.xml
+++ b/data/etc/hiddenapi-package-whitelist.xml
@@ -25,42 +25,50 @@ which apps should be allowed to access the entire private API.
<hidden-api-whitelisted-app package="android.car.input.service" />
<hidden-api-whitelisted-app package="android.car.usb.handler" />
<hidden-api-whitelisted-app package="android.ext.services" />
- <hidden-api-whitelisted-app package="android.ext.shared" />
+ <hidden-api-whitelisted-app package="com.android.apps.tag" />
<hidden-api-whitelisted-app package="com.android.backupconfirm" />
+ <hidden-api-whitelisted-app package="com.android.basicsmsreceiver" />
<hidden-api-whitelisted-app package="com.android.bluetooth" />
<hidden-api-whitelisted-app package="com.android.bluetoothdebug" />
<hidden-api-whitelisted-app package="com.android.bluetoothmidiservice" />
+ <hidden-api-whitelisted-app package="com.android.bookmarkprovider" />
<hidden-api-whitelisted-app package="com.android.calllogbackup" />
+ <hidden-api-whitelisted-app package="com.android.camera" />
<hidden-api-whitelisted-app package="com.android.captiveportallogin" />
<hidden-api-whitelisted-app package="com.android.car" />
+ <hidden-api-whitelisted-app package="com.android.car.dialer" />
<hidden-api-whitelisted-app package="com.android.car.hvac" />
<hidden-api-whitelisted-app package="com.android.car.mapsplaceholder" />
<hidden-api-whitelisted-app package="com.android.car.media" />
<hidden-api-whitelisted-app package="com.android.car.media.localmediaplayer" />
+ <hidden-api-whitelisted-app package="com.android.car.messenger" />
+ <hidden-api-whitelisted-app package="com.android.car.overview" />
<hidden-api-whitelisted-app package="com.android.car.radio" />
<hidden-api-whitelisted-app package="com.android.car.settings" />
+ <hidden-api-whitelisted-app package="com.android.car.stream" />
<hidden-api-whitelisted-app package="com.android.car.systemupdater" />
<hidden-api-whitelisted-app package="com.android.car.trust" />
<hidden-api-whitelisted-app package="com.android.carrierconfig" />
<hidden-api-whitelisted-app package="com.android.carrierdefaultapp" />
<hidden-api-whitelisted-app package="com.android.cellbroadcastreceiver" />
<hidden-api-whitelisted-app package="com.android.certinstaller" />
+ <hidden-api-whitelisted-app package="com.android.companiondevicemanager" />
<hidden-api-whitelisted-app package="com.android.customlocale2" />
<hidden-api-whitelisted-app package="com.android.defcontainer" />
<hidden-api-whitelisted-app package="com.android.documentsui" />
+ <hidden-api-whitelisted-app package="com.android.dreams.basic" />
<hidden-api-whitelisted-app package="com.android.egg" />
- <hidden-api-whitelisted-app package="com.android.email.policy" />
<hidden-api-whitelisted-app package="com.android.emergency" />
<hidden-api-whitelisted-app package="com.android.externalstorage" />
<hidden-api-whitelisted-app package="com.android.fakeoemfeatures" />
<hidden-api-whitelisted-app package="com.android.gallery" />
<hidden-api-whitelisted-app package="com.android.hotspot2" />
- <hidden-api-whitelisted-app package="com.android.inputdevices" />
<hidden-api-whitelisted-app package="com.android.keychain" />
<hidden-api-whitelisted-app package="com.android.location.fused" />
<hidden-api-whitelisted-app package="com.android.managedprovisioning" />
<hidden-api-whitelisted-app package="com.android.mms.service" />
<hidden-api-whitelisted-app package="com.android.mtp" />
+ <hidden-api-whitelisted-app package="com.android.musicfx" />
<hidden-api-whitelisted-app package="com.android.nfc" />
<hidden-api-whitelisted-app package="com.android.osu" />
<hidden-api-whitelisted-app package="com.android.packageinstaller" />
@@ -70,12 +78,14 @@ which apps should be allowed to access the entire private API.
<hidden-api-whitelisted-app package="com.android.printservice.recommendation" />
<hidden-api-whitelisted-app package="com.android.printspooler" />
<hidden-api-whitelisted-app package="com.android.providers.blockednumber" />
+ <hidden-api-whitelisted-app package="com.android.providers.calendar" />
<hidden-api-whitelisted-app package="com.android.providers.contacts" />
<hidden-api-whitelisted-app package="com.android.providers.downloads" />
<hidden-api-whitelisted-app package="com.android.providers.downloads.ui" />
<hidden-api-whitelisted-app package="com.android.providers.media" />
<hidden-api-whitelisted-app package="com.android.providers.settings" />
<hidden-api-whitelisted-app package="com.android.providers.telephony" />
+ <hidden-api-whitelisted-app package="com.android.providers.tv" />
<hidden-api-whitelisted-app package="com.android.providers.userdictionary" />
<hidden-api-whitelisted-app package="com.android.provision" />
<hidden-api-whitelisted-app package="com.android.proxyhandler" />
@@ -87,10 +97,15 @@ which apps should be allowed to access the entire private API.
<hidden-api-whitelisted-app package="com.android.settings" />
<hidden-api-whitelisted-app package="com.android.sharedstoragebackup" />
<hidden-api-whitelisted-app package="com.android.shell" />
+ <hidden-api-whitelisted-app package="com.android.smspush" />
+ <hidden-api-whitelisted-app package="com.android.spare_parts" />
+ <hidden-api-whitelisted-app package="com.android.statementservice" />
<hidden-api-whitelisted-app package="com.android.stk" />
+ <hidden-api-whitelisted-app package="com.android.storagemanager" />
<hidden-api-whitelisted-app package="com.android.support.car.lenspicker" />
<hidden-api-whitelisted-app package="com.android.systemui" />
- <hidden-api-whitelisted-app package="com.android.systemui.theme.dark" />
+ <hidden-api-whitelisted-app package="com.android.systemui.plugins" />
+ <hidden-api-whitelisted-app package="com.android.terminal" />
<hidden-api-whitelisted-app package="com.android.timezone.updater" />
<hidden-api-whitelisted-app package="com.android.traceur" />
<hidden-api-whitelisted-app package="com.android.tv.settings" />
@@ -99,5 +114,5 @@ which apps should be allowed to access the entire private API.
<hidden-api-whitelisted-app package="com.android.wallpaperbackup" />
<hidden-api-whitelisted-app package="com.android.wallpapercropper" />
<hidden-api-whitelisted-app package="com.googlecode.android_scripting" />
+ <hidden-api-whitelisted-app package="jp.co.omronsoft.openwnn" />
</config>
-
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index d925441e3657..b0bc1029c6df 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -1490,6 +1490,10 @@ public class Canvas extends BaseCanvas {
* across the top of the bitmap from left to right. A more general version of this method is
* drawVertices().
*
+ * Prior to API level {@value Build.VERSION_CODES#P} vertOffset and colorOffset were ignored,
+ * effectively treating them as zeros. In API level {@value Build.VERSION_CODES#P} and above
+ * these parameters will be respected.
+ *
* @param bitmap The bitmap to draw using the mesh
* @param meshWidth The number of columns in the mesh. Nothing is drawn if this is 0
* @param meshHeight The number of rows in the mesh. Nothing is drawn if this is 0
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 2f09c65a9bf7..5ca0ad63159f 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -24,6 +24,7 @@ import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.content.ContentResolver;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
@@ -102,7 +103,7 @@ public final class ImageDecoder implements AutoCloseable {
@Override
public ImageDecoder createImageDecoder() throws IOException {
- return nCreate(mData, mOffset, mLength);
+ return nCreate(mData, mOffset, mLength, this);
}
}
@@ -117,9 +118,9 @@ public final class ImageDecoder implements AutoCloseable {
if (!mBuffer.isDirect() && mBuffer.hasArray()) {
int offset = mBuffer.arrayOffset() + mBuffer.position();
int length = mBuffer.limit() - mBuffer.position();
- return nCreate(mBuffer.array(), offset, length);
+ return nCreate(mBuffer.array(), offset, length, this);
}
- return nCreate(mBuffer, mBuffer.position(), mBuffer.limit());
+ return nCreate(mBuffer, mBuffer.position(), mBuffer.limit(), this);
}
}
@@ -156,7 +157,7 @@ public final class ImageDecoder implements AutoCloseable {
throw new FileNotFoundException(mUri.toString());
}
- return createFromStream(is, true);
+ return createFromStream(is, true, this);
}
final FileDescriptor fd = assetFd.getFileDescriptor();
@@ -166,9 +167,9 @@ public final class ImageDecoder implements AutoCloseable {
try {
try {
Os.lseek(fd, offset, SEEK_SET);
- decoder = nCreate(fd);
+ decoder = nCreate(fd, this);
} catch (ErrnoException e) {
- decoder = createFromStream(new FileInputStream(fd), true);
+ decoder = createFromStream(new FileInputStream(fd), true, this);
}
} finally {
if (decoder == null) {
@@ -182,18 +183,19 @@ public final class ImageDecoder implements AutoCloseable {
}
@NonNull
- private static ImageDecoder createFromFile(@NonNull File file) throws IOException {
+ private static ImageDecoder createFromFile(@NonNull File file,
+ @NonNull Source source) throws IOException {
FileInputStream stream = new FileInputStream(file);
FileDescriptor fd = stream.getFD();
try {
Os.lseek(fd, 0, SEEK_CUR);
} catch (ErrnoException e) {
- return createFromStream(stream, true);
+ return createFromStream(stream, true, source);
}
ImageDecoder decoder = null;
try {
- decoder = nCreate(fd);
+ decoder = nCreate(fd, source);
} finally {
if (decoder == null) {
IoUtils.closeQuietly(stream);
@@ -207,12 +209,12 @@ public final class ImageDecoder implements AutoCloseable {
@NonNull
private static ImageDecoder createFromStream(@NonNull InputStream is,
- boolean closeInputStream) throws IOException {
+ boolean closeInputStream, Source source) throws IOException {
// Arbitrary size matches BitmapFactory.
byte[] storage = new byte[16 * 1024];
ImageDecoder decoder = null;
try {
- decoder = nCreate(is, storage);
+ decoder = nCreate(is, storage, source);
} finally {
if (decoder == null) {
if (closeInputStream) {
@@ -260,7 +262,7 @@ public final class ImageDecoder implements AutoCloseable {
}
InputStream is = mInputStream;
mInputStream = null;
- return createFromStream(is, false);
+ return createFromStream(is, false, this);
}
}
}
@@ -305,7 +307,7 @@ public final class ImageDecoder implements AutoCloseable {
}
AssetInputStream ais = mAssetInputStream;
mAssetInputStream = null;
- return createFromAsset(ais);
+ return createFromAsset(ais, this);
}
}
}
@@ -340,18 +342,19 @@ public final class ImageDecoder implements AutoCloseable {
mResDensity = value.density;
}
- return createFromAsset((AssetInputStream) is);
+ return createFromAsset((AssetInputStream) is, this);
}
}
/**
* ImageDecoder will own the AssetInputStream.
*/
- private static ImageDecoder createFromAsset(AssetInputStream ais) throws IOException {
+ private static ImageDecoder createFromAsset(AssetInputStream ais,
+ Source source) throws IOException {
ImageDecoder decoder = null;
try {
long asset = ais.getNativeAsset();
- decoder = nCreate(asset);
+ decoder = nCreate(asset, source);
} finally {
if (decoder == null) {
IoUtils.closeQuietly(ais);
@@ -375,7 +378,7 @@ public final class ImageDecoder implements AutoCloseable {
@Override
public ImageDecoder createImageDecoder() throws IOException {
InputStream is = mAssets.open(mFileName);
- return createFromAsset((AssetInputStream) is);
+ return createFromAsset((AssetInputStream) is, this);
}
}
@@ -388,7 +391,7 @@ public final class ImageDecoder implements AutoCloseable {
@Override
public ImageDecoder createImageDecoder() throws IOException {
- return createFromFile(mFile);
+ return createFromFile(mFile, this);
}
}
@@ -431,9 +434,10 @@ public final class ImageDecoder implements AutoCloseable {
}
};
- /**
- * Thrown if the provided data is incomplete.
+ /** @removed
+ * @deprecated Subsumed by {@link #DecodeException}.
*/
+ @java.lang.Deprecated
public static class IncompleteException extends IOException {};
/**
@@ -453,24 +457,102 @@ public final class ImageDecoder implements AutoCloseable {
};
- /**
- * An Exception was thrown reading the {@link Source}.
+ /** @removed
+ * @deprecated Replaced by {@link #DecodeException#SOURCE_EXCEPTION}.
*/
+ @java.lang.Deprecated
public static final int ERROR_SOURCE_EXCEPTION = 1;
- /**
- * The encoded data was incomplete.
+ /** @removed
+ * @deprecated Replaced by {@link #DecodeException#SOURCE_INCOMPLETE}.
*/
+ @java.lang.Deprecated
public static final int ERROR_SOURCE_INCOMPLETE = 2;
- /**
- * The encoded data contained an error.
+ /** @removed
+ * @deprecated Replaced by {@link #DecodeException#SOURCE_MALFORMED_DATA}.
*/
+ @java.lang.Deprecated
public static final int ERROR_SOURCE_ERROR = 3;
- @Retention(SOURCE)
- @IntDef({ ERROR_SOURCE_EXCEPTION, ERROR_SOURCE_INCOMPLETE, ERROR_SOURCE_ERROR })
- public @interface Error {};
+ /**
+ * Information about an interrupted decode.
+ */
+ public static final class DecodeException extends IOException {
+ /**
+ * An Exception was thrown reading the {@link Source}.
+ */
+ public static final int SOURCE_EXCEPTION = 1;
+
+ /**
+ * The encoded data was incomplete.
+ */
+ public static final int SOURCE_INCOMPLETE = 2;
+
+ /**
+ * The encoded data contained an error.
+ */
+ public static final int SOURCE_MALFORMED_DATA = 3;
+
+ /** @hide **/
+ @Retention(SOURCE)
+ @IntDef(value = { SOURCE_EXCEPTION, SOURCE_INCOMPLETE, SOURCE_MALFORMED_DATA },
+ prefix = {"SOURCE_"})
+ public @interface Error {};
+
+ @Error final int mError;
+ @NonNull final Source mSource;
+
+ DecodeException(@Error int error, @Nullable Throwable cause, @NonNull Source source) {
+ super(errorMessage(error, cause), cause);
+ mError = error;
+ mSource = source;
+ }
+
+ /**
+ * Private method called by JNI.
+ */
+ @SuppressWarnings("unused")
+ DecodeException(@Error int error, @Nullable String msg, @Nullable Throwable cause,
+ @NonNull Source source) {
+ super(msg + errorMessage(error, cause), cause);
+ mError = error;
+ mSource = source;
+ }
+
+ /**
+ * Retrieve the reason that decoding was interrupted.
+ *
+ * <p>If the error is {@link #SOURCE_EXCEPTION}, the underlying
+ * {@link java.lang.Throwable} can be retrieved with
+ * {@link java.lang.Throwable#getCause}.</p>
+ */
+ @Error
+ public int getError() {
+ return mError;
+ }
+
+ /**
+ * Retrieve the {@link Source} that was interrupted.
+ */
+ @NonNull
+ public Source getSource() {
+ return mSource;
+ }
+
+ private static String errorMessage(@Error int error, @Nullable Throwable cause) {
+ switch (error) {
+ case SOURCE_EXCEPTION:
+ return "Exception in input: " + cause;
+ case SOURCE_INCOMPLETE:
+ return "Input was incomplete.";
+ case SOURCE_MALFORMED_DATA:
+ return "Input contained an error.";
+ default:
+ return "";
+ }
+ }
+ }
/**
* Optional listener supplied to the ImageDecoder.
@@ -486,13 +568,12 @@ public final class ImageDecoder implements AutoCloseable {
* optionally finish the rest of the decode/creation process to create
* a partial {@link Drawable}/{@link Bitmap}.
*
- * @param error indicating what interrupted the decode.
- * @param source that had the error.
+ * @param e containing information about the decode interruption.
* @return True to create and return a {@link Drawable}/{@link Bitmap}
* with partial data. False (which is the default) to abort the
- * decode and throw {@link java.io.IOException}.
+ * decode and throw {@code e}.
*/
- public boolean onPartialImage(@Error int error, @NonNull Source source);
+ boolean onPartialImage(@NonNull DecodeException e);
};
// Fields
@@ -667,6 +748,7 @@ public final class ImageDecoder implements AutoCloseable {
* Internal API used to generate bitmaps for use by Drawables (i.e. BitmapDrawable)
* @hide
*/
+ @TestApi
public static Source createSource(Resources res, InputStream is, int density) {
return new InputStreamSource(res, is, density);
}
@@ -1087,14 +1169,8 @@ public final class ImageDecoder implements AutoCloseable {
@NonNull
private Bitmap decodeBitmapInternal() throws IOException {
checkState();
- // nDecodeBitmap calls onPartialImage only if mOnPartialImageListener
- // exists
- ImageDecoder partialImagePtr = mOnPartialImageListener == null ? null : this;
- // nDecodeBitmap calls postProcessAndRelease only if mPostProcessor
- // exists.
- ImageDecoder postProcessPtr = mPostProcessor == null ? null : this;
- return nDecodeBitmap(mNativePtr, partialImagePtr,
- postProcessPtr, mDesiredWidth, mDesiredHeight, mCropRect,
+ return nDecodeBitmap(mNativePtr, this, mPostProcessor != null,
+ mDesiredWidth, mDesiredHeight, mCropRect,
mMutable, mAllocator, mRequireUnpremultiplied,
mConserveMemory, mDecodeAsAlphaMask);
}
@@ -1310,23 +1386,28 @@ public final class ImageDecoder implements AutoCloseable {
* Private method called by JNI.
*/
@SuppressWarnings("unused")
- private boolean onPartialImage(@Error int error) {
- return mOnPartialImageListener.onPartialImage(error, mSource);
+ private void onPartialImage(@DecodeException.Error int error, @Nullable Throwable cause)
+ throws DecodeException {
+ DecodeException exception = new DecodeException(error, cause, mSource);
+ if (mOnPartialImageListener == null
+ || !mOnPartialImageListener.onPartialImage(exception)) {
+ throw exception;
+ }
}
- private static native ImageDecoder nCreate(long asset) throws IOException;
- private static native ImageDecoder nCreate(ByteBuffer buffer,
- int position,
- int limit) throws IOException;
- private static native ImageDecoder nCreate(byte[] data, int offset,
- int length) throws IOException;
- private static native ImageDecoder nCreate(InputStream is, byte[] storage);
+ private static native ImageDecoder nCreate(long asset, Source src) throws IOException;
+ private static native ImageDecoder nCreate(ByteBuffer buffer, int position,
+ int limit, Source src) throws IOException;
+ private static native ImageDecoder nCreate(byte[] data, int offset, int length,
+ Source src) throws IOException;
+ private static native ImageDecoder nCreate(InputStream is, byte[] storage,
+ Source src) throws IOException;
// The fd must be seekable.
- private static native ImageDecoder nCreate(FileDescriptor fd) throws IOException;
+ private static native ImageDecoder nCreate(FileDescriptor fd, Source src) throws IOException;
@NonNull
private static native Bitmap nDecodeBitmap(long nativePtr,
- @Nullable ImageDecoder partialImageListener,
- @Nullable ImageDecoder postProcessor,
+ @NonNull ImageDecoder decoder,
+ boolean doPostProcess,
int width, int height,
@Nullable Rect cropRect, boolean mutable,
int allocator, boolean requireUnpremul,
diff --git a/graphics/java/android/graphics/Picture.java b/graphics/java/android/graphics/Picture.java
index 9ac94d895a37..d01ff6fb8373 100644
--- a/graphics/java/android/graphics/Picture.java
+++ b/graphics/java/android/graphics/Picture.java
@@ -209,6 +209,8 @@ public class Picture {
public PictureCanvas(Picture pict, long nativeCanvas) {
super(nativeCanvas);
mPicture = pict;
+ // Disable bitmap density scaling. This matches DisplayListCanvas.
+ mDensity = 0;
}
@Override
diff --git a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java
index c0f49208e27e..457e4aa426b8 100644
--- a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java
@@ -261,6 +261,12 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 {
if (repeatCount != REPEAT_UNDEFINED) {
this.setRepeatCount(repeatCount);
}
+
+ boolean autoStart = a.getBoolean(
+ R.styleable.AnimatedImageDrawable_autoStart, false);
+ if (autoStart && mState.mNativePtr != 0) {
+ this.start();
+ }
}
/**
@@ -292,8 +298,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 {
mState = new State(nCreate(nativeImageDecoder, decoder, width, height, cropRect),
inputStream, afd);
- // FIXME: Use the right size for the native allocation.
- long nativeSize = 200;
+ final long nativeSize = nNativeByteSize(mState.mNativePtr);
NativeAllocationRegistry registry = new NativeAllocationRegistry(
AnimatedImageDrawable.class.getClassLoader(), nGetNativeFinalizer(), nativeSize);
registry.registerNativeAllocation(mState, mState.mNativePtr);
diff --git a/libs/androidfw/ResourceUtils.cpp b/libs/androidfw/ResourceUtils.cpp
index 1aa6cf6da28d..d63feb01ef83 100644
--- a/libs/androidfw/ResourceUtils.cpp
+++ b/libs/androidfw/ResourceUtils.cpp
@@ -26,6 +26,9 @@ bool ExtractResourceName(const StringPiece& str, StringPiece* out_package, Strin
bool has_type_separator = false;
const char* start = str.data();
const char* end = start + str.size();
+ if (start[0] == '@') {
+ start++;
+ }
const char* current = start;
while (current != end) {
if (out_type->size() == 0 && *current == '/') {
diff --git a/libs/androidfw/tests/ResourceUtils_test.cpp b/libs/androidfw/tests/ResourceUtils_test.cpp
index b64a884fb8fb..a02f166b5586 100644
--- a/libs/androidfw/tests/ResourceUtils_test.cpp
+++ b/libs/androidfw/tests/ResourceUtils_test.cpp
@@ -27,23 +27,48 @@ TEST(ResourceUtilsTest, ExtractResourceName) {
EXPECT_EQ("string", type);
EXPECT_EQ("foo", entry);
+ ASSERT_TRUE(ExtractResourceName("@android:string/foo", &package, &type, &entry));
+ EXPECT_EQ("android", package);
+ EXPECT_EQ("string", type);
+ EXPECT_EQ("foo", entry);
+
ASSERT_TRUE(ExtractResourceName("string/foo", &package, &type, &entry));
EXPECT_EQ("", package);
EXPECT_EQ("string", type);
EXPECT_EQ("foo", entry);
+ ASSERT_TRUE(ExtractResourceName("@string/foo", &package, &type, &entry));
+ EXPECT_EQ("", package);
+ EXPECT_EQ("string", type);
+ EXPECT_EQ("foo", entry);
+
ASSERT_TRUE(ExtractResourceName("foo", &package, &type, &entry));
EXPECT_EQ("", package);
EXPECT_EQ("", type);
EXPECT_EQ("foo", entry);
+ ASSERT_TRUE(ExtractResourceName("@foo", &package, &type, &entry));
+ EXPECT_EQ("", package);
+ EXPECT_EQ("", type);
+ EXPECT_EQ("foo", entry);
+
ASSERT_TRUE(ExtractResourceName("android:foo", &package, &type, &entry));
EXPECT_EQ("android", package);
EXPECT_EQ("", type);
EXPECT_EQ("foo", entry);
+// ASSERT_TRUE(ExtractResourceName("@android:foo", &package, &type, &entry));
+// EXPECT_EQ("android", package);
+// EXPECT_EQ("", type);
+// EXPECT_EQ("foo", entry);
+
EXPECT_FALSE(ExtractResourceName(":string/foo", &package, &type, &entry));
+
+ EXPECT_FALSE(ExtractResourceName("@:string/foo", &package, &type, &entry));
+
EXPECT_FALSE(ExtractResourceName("/foo", &package, &type, &entry));
+
+ EXPECT_FALSE(ExtractResourceName("@/foo", &package, &type, &entry));
}
} // namespace android
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 0742de9606cf..6470d4c16130 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -328,6 +328,10 @@ public:
bool isPivotExplicitlySet() const { return mPrimitiveFields.mPivotExplicitlySet; }
+ bool resetPivot() {
+ return RP_SET_AND_DIRTY(mPrimitiveFields.mPivotExplicitlySet, false);
+ }
+
bool setCameraDistance(float distance) {
if (distance != getCameraDistance()) {
mPrimitiveFields.mMatrixOrPivotDirty = true;
diff --git a/libs/hwui/hwui/AnimatedImageDrawable.cpp b/libs/hwui/hwui/AnimatedImageDrawable.cpp
index 28d0bc42ad2f..c529f8773bbd 100644
--- a/libs/hwui/hwui/AnimatedImageDrawable.cpp
+++ b/libs/hwui/hwui/AnimatedImageDrawable.cpp
@@ -26,8 +26,8 @@
namespace android {
-AnimatedImageDrawable::AnimatedImageDrawable(sk_sp<SkAnimatedImage> animatedImage)
- : mSkAnimatedImage(std::move(animatedImage)) {
+AnimatedImageDrawable::AnimatedImageDrawable(sk_sp<SkAnimatedImage> animatedImage, size_t bytesUsed)
+ : mSkAnimatedImage(std::move(animatedImage)), mBytesUsed(bytesUsed) {
mTimeToShowNextSnapshot = mSkAnimatedImage->currentFrameDuration();
}
diff --git a/libs/hwui/hwui/AnimatedImageDrawable.h b/libs/hwui/hwui/AnimatedImageDrawable.h
index f4e2ba751b70..a92b62db14f0 100644
--- a/libs/hwui/hwui/AnimatedImageDrawable.h
+++ b/libs/hwui/hwui/AnimatedImageDrawable.h
@@ -45,7 +45,9 @@ public:
*/
class ANDROID_API AnimatedImageDrawable : public SkDrawable {
public:
- AnimatedImageDrawable(sk_sp<SkAnimatedImage> animatedImage);
+ // bytesUsed includes the approximate sizes of the SkAnimatedImage and the SkPictures in the
+ // Snapshots.
+ AnimatedImageDrawable(sk_sp<SkAnimatedImage> animatedImage, size_t bytesUsed);
/**
* This updates the internal time and returns true if the animation needs
@@ -100,11 +102,17 @@ public:
Snapshot decodeNextFrame();
Snapshot reset();
+ size_t byteSize() const {
+ return sizeof(this) + mBytesUsed;
+ }
+
protected:
virtual void onDraw(SkCanvas* canvas) override;
private:
sk_sp<SkAnimatedImage> mSkAnimatedImage;
+ const size_t mBytesUsed;
+
bool mRunning = false;
bool mStarting = false;
diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h
index d04bb2e5ad03..f341cf96120d 100644
--- a/libs/hwui/hwui/Canvas.h
+++ b/libs/hwui/hwui/Canvas.h
@@ -276,6 +276,8 @@ public:
const SkPath& path, float hOffset, float vOffset, const Paint& paint,
const Typeface* typeface);
+ static int GetApiLevel() { return sApiLevel; }
+
protected:
void drawTextDecorations(float x, float y, float length, const SkPaint& paint);
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index 9db39d954e4c..0cd1c151629d 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -342,7 +342,8 @@ void SkiaPipeline::renderFrameImpl(const LayerUpdateQueue& layers, const SkRect&
SkAutoCanvasRestore saver(canvas, true);
canvas->androidFramework_setDeviceClipRestriction(clip.roundOut());
- if (!opaque) {
+ // STOPSHIP: Revert, temporary workaround to clear always F16 frame buffer for b/74976293
+ if (!opaque || wideColorGamut) {
canvas->clear(SK_ColorTRANSPARENT);
}
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 820789dd055d..f4d8051466f0 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -355,7 +355,14 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, int64_t sy
// Already drew for this vsync pulse, UI draw request missed
// the deadline for RT animations
info.out.canDrawThisFrame = false;
- } else if (vsyncDelta >= mRenderThread.timeLord().frameIntervalNanos() * 3 ||
+ }
+ /* This logic exists to try and recover from a display latch miss, which essentially
+ * results in the bufferqueue being double-buffered instead of triple-buffered.
+ * SurfaceFlinger itself now tries to handle & recover from this situation, so this
+ * logic should no longer be necessary. As it's occasionally triggering when
+ * undesired disable it.
+ * TODO: Remove this entirely if the results are solid.
+ else if (vsyncDelta >= mRenderThread.timeLord().frameIntervalNanos() * 3 ||
(latestVsync - mLastDropVsync) < 500_ms) {
// It's been several frame intervals, assume the buffer queue is fine
// or the last drop was too recent
@@ -367,6 +374,7 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, int64_t sy
mLastDropVsync = mRenderThread.timeLord().latestVsync();
}
}
+ */
} else {
info.out.canDrawThisFrame = true;
}
diff --git a/location/java/android/location/GnssMeasurement.java b/location/java/android/location/GnssMeasurement.java
index 412cc2910cd4..2152e1edc6f5 100644
--- a/location/java/android/location/GnssMeasurement.java
+++ b/location/java/android/location/GnssMeasurement.java
@@ -83,6 +83,20 @@ public final class GnssMeasurement implements Parcelable {
*/
public static final int MULTIPATH_INDICATOR_NOT_DETECTED = 2;
+ /**
+ * GNSS measurement tracking loop state
+ * @hide
+ */
+ @IntDef(flag = true, prefix = { "STATE_" }, value = {
+ STATE_CODE_LOCK, STATE_BIT_SYNC, STATE_SUBFRAME_SYNC,
+ STATE_TOW_DECODED, STATE_MSEC_AMBIGUOUS, STATE_SYMBOL_SYNC, STATE_GLO_STRING_SYNC,
+ STATE_GLO_TOD_DECODED, STATE_BDS_D2_BIT_SYNC, STATE_BDS_D2_SUBFRAME_SYNC,
+ STATE_GAL_E1BC_CODE_LOCK, STATE_GAL_E1C_2ND_CODE_LOCK, STATE_GAL_E1B_PAGE_SYNC,
+ STATE_SBAS_SYNC, STATE_TOW_KNOWN, STATE_GLO_TOD_KNOWN
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface State {}
+
/** This GNSS measurement's tracking state is invalid or unknown. */
public static final int STATE_UNKNOWN = 0;
/** This GNSS measurement's tracking state has code lock. */
@@ -133,29 +147,68 @@ public final class GnssMeasurement implements Parcelable {
private static final int STATE_ALL = 0x3fff; // 2 bits + 4 bits + 4 bits + 4 bits = 14 bits
/**
- * The state of the 'Accumulated Delta Range' is invalid or unknown.
+ * GNSS measurement accumulated delta range state
+ * @hide
+ */
+ @IntDef(flag = true, prefix = { "ADR_STATE_" }, value = {
+ ADR_STATE_VALID, ADR_STATE_RESET, ADR_STATE_CYCLE_SLIP, ADR_STATE_HALF_CYCLE_RESOLVED,
+ ADR_STATE_HALF_CYCLE_REPORTED
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AdrState {}
+
+ /**
+ * The state of the value {@link #getAccumulatedDeltaRangeMeters()} is invalid or unknown.
*/
public static final int ADR_STATE_UNKNOWN = 0;
/**
- * The state of the 'Accumulated Delta Range' is valid.
+ * The state of the {@link #getAccumulatedDeltaRangeMeters()} is valid.
*/
public static final int ADR_STATE_VALID = (1<<0);
/**
- * The state of the 'Accumulated Delta Range' has detected a reset.
+ * The state of the {@link #getAccumulatedDeltaRangeMeters()} has detected a reset.
*/
public static final int ADR_STATE_RESET = (1<<1);
/**
- * The state of the 'Accumulated Delta Range' has a cycle slip detected.
+ * The state of the {@link #getAccumulatedDeltaRangeMeters()} has a cycle slip detected.
*/
public static final int ADR_STATE_CYCLE_SLIP = (1<<2);
/**
+ * Reports whether the value {@link #getAccumulatedDeltaRangeMeters()} has resolved the half
+ * cycle ambiguity.
+ *
+ * <p> When this bit is set, the {@link #getAccumulatedDeltaRangeMeters()} corresponds to the
+ * carrier phase measurement plus an accumulated integer number of carrier full cycles.
+ *
+ * <p> When this bit is unset, the {@link #getAccumulatedDeltaRangeMeters()} corresponds to the
+ * carrier phase measurement plus an accumulated integer number of carrier half cycles.
+ */
+ public static final int ADR_STATE_HALF_CYCLE_RESOLVED = (1<<3);
+
+ /**
+ * Reports whether the flag {@link #ADR_STATE_HALF_CYCLE_RESOLVED} has been reported by the
+ * GNSS hardware.
+ *
+ * <p> When this bit is set, the value of {@link #getAccumulatedDeltaRangeUncertaintyMeters()}
+ * can be low (centimeter level) whether or not the half cycle ambiguity is resolved.
+ *
+ * <p> When this bit is unset, the value of {@link #getAccumulatedDeltaRangeUncertaintyMeters()}
+ * is larger, to cover the potential error due to half cycle ambiguity being unresolved.
+ */
+ public static final int ADR_STATE_HALF_CYCLE_REPORTED = (1<<4);
+
+ /**
* All the 'Accumulated Delta Range' flags.
+ * @hide
*/
- private static final int ADR_ALL = ADR_STATE_VALID | ADR_STATE_RESET | ADR_STATE_CYCLE_SLIP;
+ @TestApi
+ public static final int ADR_STATE_ALL =
+ ADR_STATE_VALID | ADR_STATE_RESET | ADR_STATE_CYCLE_SLIP |
+ ADR_STATE_HALF_CYCLE_RESOLVED | ADR_STATE_HALF_CYCLE_REPORTED;
// End enumerations in sync with gps.h
@@ -278,6 +331,7 @@ public final class GnssMeasurement implements Parcelable {
*
* <p>This value helps interpret {@link #getReceivedSvTimeNanos()}.
*/
+ @State
public int getState() {
return mState;
}
@@ -287,7 +341,7 @@ public final class GnssMeasurement implements Parcelable {
* @hide
*/
@TestApi
- public void setState(int value) {
+ public void setState(@State int value) {
mState = value;
}
@@ -557,6 +611,7 @@ public final class GnssMeasurement implements Parcelable {
* <p>It indicates whether {@link #getAccumulatedDeltaRangeMeters()} is reset or there is a
* cycle slip (indicating 'loss of lock').
*/
+ @AdrState
public int getAccumulatedDeltaRangeState() {
return mAccumulatedDeltaRangeState;
}
@@ -566,7 +621,7 @@ public final class GnssMeasurement implements Parcelable {
* @hide
*/
@TestApi
- public void setAccumulatedDeltaRangeState(int value) {
+ public void setAccumulatedDeltaRangeState(@AdrState int value) {
mAccumulatedDeltaRangeState = value;
}
@@ -589,7 +644,15 @@ public final class GnssMeasurement implements Parcelable {
if ((mAccumulatedDeltaRangeState & ADR_STATE_CYCLE_SLIP) == ADR_STATE_CYCLE_SLIP) {
builder.append("CycleSlip|");
}
- int remainingStates = mAccumulatedDeltaRangeState & ~ADR_ALL;
+ if ((mAccumulatedDeltaRangeState & ADR_STATE_HALF_CYCLE_RESOLVED) ==
+ ADR_STATE_HALF_CYCLE_RESOLVED) {
+ builder.append("HalfCycleResolved|");
+ }
+ if ((mAccumulatedDeltaRangeState & ADR_STATE_HALF_CYCLE_REPORTED)
+ == ADR_STATE_HALF_CYCLE_REPORTED) {
+ builder.append("HalfCycleReported|");
+ }
+ int remainingStates = mAccumulatedDeltaRangeState & ~ADR_STATE_ALL;
if (remainingStates > 0) {
builder.append("Other(");
builder.append(Integer.toBinaryString(remainingStates));
@@ -674,7 +737,7 @@ public final class GnssMeasurement implements Parcelable {
* L5 = 1176.45 MHz, varying GLO channels, etc. If the field is not set, it is the primary
* common use central frequency, e.g. L1 = 1575.45 MHz for GPS.
*
- * For an L1, L5 receiver tracking a satellite on L1 and L5 at the same time, two raw
+ * <p> For an L1, L5 receiver tracking a satellite on L1 and L5 at the same time, two raw
* measurement objects will be reported for this same satellite, in one of the measurement
* objects, all the values related to L1 will be filled, and in the other all of the values
* related to L5 will be filled.
@@ -709,7 +772,10 @@ public final class GnssMeasurement implements Parcelable {
/**
* Returns {@code true} if {@link #getCarrierCycles()} is available, {@code false} otherwise.
+ *
+ * @deprecated use {@link #getAccumulatedDeltaRangeState()} instead.
*/
+ @Deprecated
public boolean hasCarrierCycles() {
return isFlagSet(HAS_CARRIER_CYCLES);
}
@@ -720,16 +786,24 @@ public final class GnssMeasurement implements Parcelable {
* <p>The reference frequency is given by the value of {@link #getCarrierFrequencyHz()}.
*
* <p>The value is only available if {@link #hasCarrierCycles()} is {@code true}.
+ *
+ * @deprecated use {@link #getAccumulatedDeltaRangeMeters()} instead.
*/
+ @Deprecated
public long getCarrierCycles() {
return mCarrierCycles;
}
/**
* Sets the number of full carrier cycles between the satellite and the receiver.
+ *
+ * @deprecated use {@link #setAccumulatedDeltaRangeMeters(double)}
+ * and {@link #setAccumulatedDeltaRangeState(int)} instead.
+ *
* @hide
*/
@TestApi
+ @Deprecated
public void setCarrierCycles(long value) {
setFlag(HAS_CARRIER_CYCLES);
mCarrierCycles = value;
@@ -737,9 +811,13 @@ public final class GnssMeasurement implements Parcelable {
/**
* Resets the number of full carrier cycles between the satellite and the receiver.
+ *
+ * @deprecated use {@link #setAccumulatedDeltaRangeMeters(double)}
+ * and {@link #setAccumulatedDeltaRangeState(int)} instead.
* @hide
*/
@TestApi
+ @Deprecated
public void resetCarrierCycles() {
resetFlag(HAS_CARRIER_CYCLES);
mCarrierCycles = Long.MIN_VALUE;
@@ -747,7 +825,10 @@ public final class GnssMeasurement implements Parcelable {
/**
* Returns {@code true} if {@link #getCarrierPhase()} is available, {@code false} otherwise.
+ *
+ * @deprecated use {@link #getAccumulatedDeltaRangeState()} instead.
*/
+ @Deprecated
public boolean hasCarrierPhase() {
return isFlagSet(HAS_CARRIER_PHASE);
}
@@ -764,16 +845,24 @@ public final class GnssMeasurement implements Parcelable {
* <p>The error estimate for this value is {@link #getCarrierPhaseUncertainty()}.
*
* <p>The value is only available if {@link #hasCarrierPhase()} is {@code true}.
+ *
+ * @deprecated use {@link #getAccumulatedDeltaRangeMeters()} instead.
*/
+ @Deprecated
public double getCarrierPhase() {
return mCarrierPhase;
}
/**
* Sets the RF phase detected by the receiver.
+ *
+ * @deprecated use {@link #setAccumulatedDeltaRangeMeters(double)}
+ * and {@link #setAccumulatedDeltaRangeState(int)} instead.
+ *
* @hide
*/
@TestApi
+ @Deprecated
public void setCarrierPhase(double value) {
setFlag(HAS_CARRIER_PHASE);
mCarrierPhase = value;
@@ -781,9 +870,14 @@ public final class GnssMeasurement implements Parcelable {
/**
* Resets the RF phase detected by the receiver.
+ *
+ * @deprecated use {@link #setAccumulatedDeltaRangeMeters(double)}
+ * and {@link #setAccumulatedDeltaRangeState(int)} instead.
+ *
* @hide
*/
@TestApi
+ @Deprecated
public void resetCarrierPhase() {
resetFlag(HAS_CARRIER_PHASE);
mCarrierPhase = Double.NaN;
@@ -792,7 +886,10 @@ public final class GnssMeasurement implements Parcelable {
/**
* Returns {@code true} if {@link #getCarrierPhaseUncertainty()} is available, {@code false}
* otherwise.
+ *
+ * @deprecated use {@link #getAccumulatedDeltaRangeState()} instead.
*/
+ @Deprecated
public boolean hasCarrierPhaseUncertainty() {
return isFlagSet(HAS_CARRIER_PHASE_UNCERTAINTY);
}
@@ -803,16 +900,24 @@ public final class GnssMeasurement implements Parcelable {
* <p>The uncertainty is represented as an absolute (single sided) value.
*
* <p>The value is only available if {@link #hasCarrierPhaseUncertainty()} is {@code true}.
+ *
+ * @deprecated use {@link #getAccumulatedDeltaRangeUncertaintyMeters()} instead.
*/
+ @Deprecated
public double getCarrierPhaseUncertainty() {
return mCarrierPhaseUncertainty;
}
/**
* Sets the Carrier-phase's uncertainty (1-Sigma) in cycles.
+ *
+ * @deprecated use {@link #setAccumulatedDeltaRangeUncertaintyMeters(double)}
+ * and {@link #setAccumulatedDeltaRangeState(int)} instead.
+ *
* @hide
*/
@TestApi
+ @Deprecated
public void setCarrierPhaseUncertainty(double value) {
setFlag(HAS_CARRIER_PHASE_UNCERTAINTY);
mCarrierPhaseUncertainty = value;
@@ -820,9 +925,14 @@ public final class GnssMeasurement implements Parcelable {
/**
* Resets the Carrier-phase's uncertainty (1-Sigma) in cycles.
+ *
+ * @deprecated use {@link #setAccumulatedDeltaRangeUncertaintyMeters(double)}
+ * and {@link #setAccumulatedDeltaRangeState(int)} instead.
+ *
* @hide
*/
@TestApi
+ @Deprecated
public void resetCarrierPhaseUncertainty() {
resetFlag(HAS_CARRIER_PHASE_UNCERTAINTY);
mCarrierPhaseUncertainty = Double.NaN;
@@ -859,7 +969,7 @@ public final class GnssMeasurement implements Parcelable {
case MULTIPATH_INDICATOR_NOT_DETECTED:
return "NotDetected";
default:
- return "<Invalid:" + mMultipathIndicator + ">";
+ return "<Invalid: " + mMultipathIndicator + ">";
}
}
@@ -916,11 +1026,12 @@ public final class GnssMeasurement implements Parcelable {
* number. Hence in cases of strong jamming, in the band of this signal, this value will go more
* negative.
*
- * <p>Note: Different hardware designs (e.g. antenna, pre-amplification, or other RF HW
+ * <p> Note: Different hardware designs (e.g. antenna, pre-amplification, or other RF HW
* components) may also affect the typical output of of this value on any given hardware design
* in an open sky test - the important aspect of this output is that changes in this value are
* indicative of changes on input signal power in the frequency band for this measurement.
- * <p>The value is only available if {@link #hasAutomaticGainControlLevelDb()} is {@code true}
+ *
+ * <p> The value is only available if {@link #hasAutomaticGainControlLevelDb()} is {@code true}
*/
public double getAutomaticGainControlLevelDb() {
return mAutomaticGainControlLevelInDb;
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 2dd8c36f1165..a523958080d3 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -23,6 +23,7 @@ import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
import android.Manifest;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
@@ -42,12 +43,14 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.Log;
import com.android.internal.location.ProviderProperties;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
+import java.util.Set;
/**
* This class provides access to the system location services. These
@@ -234,12 +237,6 @@ public class LocationManager {
"android.location.HIGH_POWER_REQUEST_CHANGE";
/**
- * The value returned by {@link LocationManager#getGnssHardwareModelName()} when the hardware
- * does not support providing the actual value.
- */
- public static final String GNSS_HARDWARE_MODEL_NAME_UNKNOWN = "Model Name Unknown";
-
- /**
* Broadcast intent action for Settings app to inject a footer at the bottom of location
* settings.
*
@@ -1252,12 +1249,40 @@ public class LocationManager {
@SystemApi
@RequiresPermission(WRITE_SECURE_SETTINGS)
public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
- for (String provider : getAllProviders()) {
+ final List<String> allProvidersList = getAllProviders();
+ // Update all providers on device plus gps and network provider when disabling location.
+ Set<String> allProvidersSet = new ArraySet<>(allProvidersList.size() + 2);
+ allProvidersSet.addAll(allProvidersList);
+ // When disabling location, disable gps and network provider that could have been enabled by
+ // location mode api.
+ if (enabled == false) {
+ allProvidersSet.add(GPS_PROVIDER);
+ allProvidersSet.add(NETWORK_PROVIDER);
+ }
+ if (allProvidersSet.isEmpty()) {
+ return;
+ }
+ // to ensure thread safety, we write the provider name with a '+' or '-'
+ // and let the SettingsProvider handle it rather than reading and modifying
+ // the list of enabled providers.
+ final String prefix = enabled ? "+" : "-";
+ StringBuilder locationProvidersAllowed = new StringBuilder();
+ for (String provider : allProvidersSet) {
+ checkProvider(provider);
if (provider.equals(PASSIVE_PROVIDER)) {
continue;
}
- setProviderEnabledForUser(provider, enabled, userHandle);
- }
+ locationProvidersAllowed.append(prefix);
+ locationProvidersAllowed.append(provider);
+ locationProvidersAllowed.append(",");
+ }
+ // Remove the trailing comma
+ locationProvidersAllowed.setLength(locationProvidersAllowed.length() - 1);
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ locationProvidersAllowed.toString(),
+ userHandle.getIdentifier());
}
/**
@@ -2176,7 +2201,9 @@ public class LocationManager {
/**
* Returns the model year of the GNSS hardware and software build.
*
- * May return 0 if the model year is less than 2016.
+ * <p> More details, such as build date, may be available in {@link #getGnssHardwareModelName()}.
+ *
+ * <p> May return 0 if the model year is less than 2016.
*/
public int getGnssYearOfHardware() {
try {
@@ -2190,10 +2217,12 @@ public class LocationManager {
* Returns the Model Name (including Vendor and Hardware/Software Version) of the GNSS hardware
* driver.
*
- * Will return {@link LocationManager#GNSS_HARDWARE_MODEL_NAME_UNKNOWN} when the GNSS hardware
- * abstraction layer does not support providing this value.
+ * <p> No device-specific serial number or ID is returned from this API.
+ *
+ * <p> Will return null when the GNSS hardware abstraction layer does not support providing
+ * this value.
*/
- @NonNull
+ @Nullable
public String getGnssHardwareModelName() {
try {
return mService.getGnssHardwareModelName();
diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java
index 6abba9543218..96a0817ae561 100644
--- a/location/java/android/location/LocationRequest.java
+++ b/location/java/android/location/LocationRequest.java
@@ -339,7 +339,8 @@ public final class LocationRequest implements Parcelable {
* substantially restrict power.
*
* <p>In this mode, the GNSS chipset will not, on average, run power hungry operations like RF &
- * signal searches for more than one second per interval {@link #mInterval}
+ * signal searches for more than one second per interval (specified by
+ * {@link #setInterval(long)}).
*
* @param enabled Enable or disable low power mode
* @return the same object, so that setters can be chained
diff --git a/location/lib/Android.mk b/location/lib/Android.mk
index 8424601a57ef..6642134ec32b 100644
--- a/location/lib/Android.mk
+++ b/location/lib/Android.mk
@@ -42,3 +42,25 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
+
+# ==== Stub library ===========================================
+include $(CLEAR_VARS)
+LOCAL_MODULE := com.android.location.provider-stubs-gen
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_SRC_FILES := $(call all-java-files-under,java)
+LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/com.android.location.provider.stubs_intermediates/src
+LOCAL_DROIDDOC_OPTIONS:= \
+ -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \
+ -stubpackages com.android.location.provider \
+ -nodocs
+LOCAL_UNINSTALLABLE_MODULE := true
+include $(BUILD_DROIDDOC)
+com_android_nfc_extras_gen_stamp := $(full_target)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := com.android.location.provider.stubs
+LOCAL_SOURCE_FILES_ALL_GENERATED := true
+LOCAL_SDK_VERSION := current
+LOCAL_ADDITIONAL_DEPENDENCIES := $(com_android_nfc_extras_gen_stamp)
+com_android_nfc_extras_gen_stamp :=
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/location/lib/java/com/android/location/provider/ActivityChangedEvent.java b/location/lib/java/com/android/location/provider/ActivityChangedEvent.java
index c7dfc887bbbb..843dd670315a 100644
--- a/location/lib/java/com/android/location/provider/ActivityChangedEvent.java
+++ b/location/lib/java/com/android/location/provider/ActivityChangedEvent.java
@@ -23,6 +23,7 @@ import java.util.List;
/**
* A class representing an event for Activity changes.
+ * @hide
*/
public class ActivityChangedEvent {
private final List<ActivityRecognitionEvent> mActivityRecognitionEvents;
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java b/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java
index a39cff228567..e54dea40d690 100644
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java
+++ b/location/lib/java/com/android/location/provider/ActivityRecognitionEvent.java
@@ -18,6 +18,7 @@ package com.android.location.provider;
/**
* A class that represents an Activity Recognition Event.
+ * @hide
*/
public class ActivityRecognitionEvent {
private final String mActivity;
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java
index bc2dae14be38..0eff7d3f2014 100644
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java
+++ b/location/lib/java/com/android/location/provider/ActivityRecognitionProvider.java
@@ -28,6 +28,7 @@ import java.util.HashSet;
/**
* A class that exposes {@link IActivityRecognitionHardware} functionality to unbundled services.
+ * @hide
*/
public final class ActivityRecognitionProvider {
private final IActivityRecognitionHardware mService;
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java
index 0b878d7c1f2b..326d901b9daa 100644
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java
+++ b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderClient.java
@@ -27,6 +27,7 @@ import android.util.Log;
/**
* A client class for interaction with an Activity-Recognition provider.
+ * @hide
*/
public abstract class ActivityRecognitionProviderClient {
private static final String TAG = "ArProviderClient";
diff --git a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java
index 7139025d2722..42f77b42766f 100644
--- a/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java
+++ b/location/lib/java/com/android/location/provider/ActivityRecognitionProviderWatcher.java
@@ -30,6 +30,7 @@ import android.util.Log;
* A watcher class for Activity-Recognition instances.
*
* @deprecated use {@link ActivityRecognitionProviderClient} instead.
+ * @hide
*/
@Deprecated
public class ActivityRecognitionProviderWatcher {
diff --git a/location/lib/java/com/android/location/provider/FusedLocationHardware.java b/location/lib/java/com/android/location/provider/FusedLocationHardware.java
deleted file mode 100644
index eb3b2f4609e7..000000000000
--- a/location/lib/java/com/android/location/provider/FusedLocationHardware.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.location.provider;
-
-import android.hardware.location.IFusedLocationHardware;
-import android.hardware.location.IFusedLocationHardwareSink;
-
-import android.location.Location;
-
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Class that exposes IFusedLocationHardware functionality to unbundled services.
- */
-public final class FusedLocationHardware {
- private static final String TAG = "FusedLocationHardware";
-
- private IFusedLocationHardware mLocationHardware;
-
- // the list uses a copy-on-write pattern to update its contents
- HashMap<FusedLocationHardwareSink, DispatcherHandler> mSinkList =
- new HashMap<FusedLocationHardwareSink, DispatcherHandler>();
-
- private IFusedLocationHardwareSink mInternalSink = new IFusedLocationHardwareSink.Stub() {
- @Override
- public void onLocationAvailable(Location[] locations) {
- dispatchLocations(locations);
- }
-
- @Override
- public void onDiagnosticDataAvailable(String data) {
- dispatchDiagnosticData(data);
- }
-
- @Override
- public void onCapabilities(int capabilities) {
- dispatchCapabilities(capabilities);
- }
-
- @Override
- public void onStatusChanged(int status) {
- dispatchStatus(status);
- }
- };
-
- /**
- * @hide
- */
- public FusedLocationHardware(IFusedLocationHardware locationHardware) {
- mLocationHardware = locationHardware;
- }
-
- /*
- * Methods to provide a Facade for IFusedLocationHardware
- */
- public void registerSink(FusedLocationHardwareSink sink, Looper looper) {
- if(sink == null || looper == null) {
- throw new IllegalArgumentException("Parameter sink and looper cannot be null.");
- }
-
- boolean registerSink;
- synchronized (mSinkList) {
- // register only on first insertion
- registerSink = mSinkList.size() == 0;
- // guarantee uniqueness
- if(mSinkList.containsKey(sink)) {
- return;
- }
-
- HashMap<FusedLocationHardwareSink, DispatcherHandler> newSinkList =
- new HashMap<FusedLocationHardwareSink, DispatcherHandler>(mSinkList);
- newSinkList.put(sink, new DispatcherHandler(looper));
- mSinkList = newSinkList;
- }
-
- if(registerSink) {
- try {
- mLocationHardware.registerSink(mInternalSink);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at registerSink");
- }
- }
- }
-
- public void unregisterSink(FusedLocationHardwareSink sink) {
- if(sink == null) {
- throw new IllegalArgumentException("Parameter sink cannot be null.");
- }
-
- boolean unregisterSink;
- synchronized(mSinkList) {
- if(!mSinkList.containsKey(sink)) {
- //done
- return;
- }
-
- HashMap<FusedLocationHardwareSink, DispatcherHandler> newSinkList =
- new HashMap<FusedLocationHardwareSink, DispatcherHandler>(mSinkList);
- newSinkList.remove(sink);
- //unregister after the last sink
- unregisterSink = newSinkList.size() == 0;
-
- mSinkList = newSinkList;
- }
-
- if(unregisterSink) {
- try {
- mLocationHardware.unregisterSink(mInternalSink);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at unregisterSink");
- }
- }
- }
-
- public int getSupportedBatchSize() {
- try {
- return mLocationHardware.getSupportedBatchSize();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at getSupportedBatchSize");
- return 0;
- }
- }
-
- public void startBatching(int id, GmsFusedBatchOptions batchOptions) {
- try {
- mLocationHardware.startBatching(id, batchOptions.getParcelableOptions());
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at startBatching");
- }
- }
-
- public void stopBatching(int id) {
- try {
- mLocationHardware.stopBatching(id);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at stopBatching");
- }
- }
-
- public void updateBatchingOptions(int id, GmsFusedBatchOptions batchOptions) {
- try {
- mLocationHardware.updateBatchingOptions(id, batchOptions.getParcelableOptions());
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at updateBatchingOptions");
- }
- }
-
- public void requestBatchOfLocations(int batchSizeRequest) {
- try {
- mLocationHardware.requestBatchOfLocations(batchSizeRequest);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at requestBatchOfLocations");
- }
- }
-
- public void flushBatchedLocations() {
- try {
- mLocationHardware.flushBatchedLocations();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at flushBatchedLocations");
- }
- }
-
- public boolean supportsDiagnosticDataInjection() {
- try {
- return mLocationHardware.supportsDiagnosticDataInjection();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at supportsDiagnisticDataInjection");
- return false;
- }
- }
-
- public void injectDiagnosticData(String data) {
- try {
- mLocationHardware.injectDiagnosticData(data);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at injectDiagnosticData");
- }
- }
-
- public boolean supportsDeviceContextInjection() {
- try {
- return mLocationHardware.supportsDeviceContextInjection();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at supportsDeviceContextInjection");
- return false;
- }
- }
-
- public void injectDeviceContext(int deviceEnabledContext) {
- try {
- mLocationHardware.injectDeviceContext(deviceEnabledContext);
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at injectDeviceContext");
- }
- }
-
-
- /**
- * Returns the version of the FLP HAL.
- *
- * <p>Version 1 is the initial release.
- * <p>Version 2 adds the ability to use {@link #flushBatchedLocations},
- * {@link FusedLocationHardwareSink#onCapabilities}, and
- * {@link FusedLocationHardwareSink#onStatusChanged}.
- *
- * <p>This method is only available on API 23 or later. Older APIs have version 1.
- */
- public int getVersion() {
- try {
- return mLocationHardware.getVersion();
- } catch(RemoteException e) {
- Log.e(TAG, "RemoteException at getVersion");
- }
- return 1;
- }
-
- /*
- * Helper methods and classes
- */
- private class DispatcherHandler extends Handler {
- public static final int DISPATCH_LOCATION = 1;
- public static final int DISPATCH_DIAGNOSTIC_DATA = 2;
- public static final int DISPATCH_CAPABILITIES = 3;
- public static final int DISPATCH_STATUS = 4;
-
- public DispatcherHandler(Looper looper) {
- super(looper, null /*callback*/ , true /*async*/);
- }
-
- @Override
- public void handleMessage(Message message) {
- MessageCommand command = (MessageCommand) message.obj;
- switch(message.what) {
- case DISPATCH_LOCATION:
- command.dispatchLocation();
- break;
- case DISPATCH_DIAGNOSTIC_DATA:
- command.dispatchDiagnosticData();
- break;
- case DISPATCH_CAPABILITIES:
- command.dispatchCapabilities();
- break;
- case DISPATCH_STATUS:
- command.dispatchStatus();
- break;
- default:
- Log.e(TAG, "Invalid dispatch message");
- break;
- }
- }
- }
-
- private class MessageCommand {
- private final FusedLocationHardwareSink mSink;
- private final Location[] mLocations;
- private final String mData;
- private final int mCapabilities;
- private final int mStatus;
-
- public MessageCommand(
- FusedLocationHardwareSink sink,
- Location[] locations,
- String data,
- int capabilities,
- int status) {
- mSink = sink;
- mLocations = locations;
- mData = data;
- mCapabilities = capabilities;
- mStatus = status;
- }
-
- public void dispatchLocation() {
- mSink.onLocationAvailable(mLocations);
- }
-
- public void dispatchDiagnosticData() {
- mSink.onDiagnosticDataAvailable(mData);
- }
-
- public void dispatchCapabilities() {
- mSink.onCapabilities(mCapabilities);
- }
-
- public void dispatchStatus() {
- mSink.onStatusChanged(mStatus);
- }
- }
-
- private void dispatchLocations(Location[] locations) {
- HashMap<FusedLocationHardwareSink, DispatcherHandler> sinks;
- synchronized (mSinkList) {
- sinks = mSinkList;
- }
-
- for(Map.Entry<FusedLocationHardwareSink, DispatcherHandler> entry : sinks.entrySet()) {
- Message message = Message.obtain(
- entry.getValue(),
- DispatcherHandler.DISPATCH_LOCATION,
- new MessageCommand(entry.getKey(), locations, null /*data*/, 0, 0));
- message.sendToTarget();
- }
- }
-
- private void dispatchDiagnosticData(String data) {
- HashMap<FusedLocationHardwareSink, DispatcherHandler> sinks;
- synchronized(mSinkList) {
- sinks = mSinkList;
- }
-
- for(Map.Entry<FusedLocationHardwareSink, DispatcherHandler> entry : sinks.entrySet()) {
- Message message = Message.obtain(
- entry.getValue(),
- DispatcherHandler.DISPATCH_DIAGNOSTIC_DATA,
- new MessageCommand(entry.getKey(), null /*locations*/, data, 0, 0));
- message.sendToTarget();
- }
- }
-
- private void dispatchCapabilities(int capabilities) {
- HashMap<FusedLocationHardwareSink, DispatcherHandler> sinks;
- synchronized(mSinkList) {
- sinks = mSinkList;
- }
-
- for(Map.Entry<FusedLocationHardwareSink, DispatcherHandler> entry : sinks.entrySet()) {
- Message message = Message.obtain(
- entry.getValue(),
- DispatcherHandler.DISPATCH_CAPABILITIES,
- new MessageCommand(entry.getKey(), null /*locations*/, null, capabilities, 0));
- message.sendToTarget();
- }
- }
-
- private void dispatchStatus(int status) {
- HashMap<FusedLocationHardwareSink, DispatcherHandler> sinks;
- synchronized(mSinkList) {
- sinks = mSinkList;
- }
-
- for(Map.Entry<FusedLocationHardwareSink, DispatcherHandler> entry : sinks.entrySet()) {
- Message message = Message.obtain(
- entry.getValue(),
- DispatcherHandler.DISPATCH_STATUS,
- new MessageCommand(entry.getKey(), null /*locations*/, null, 0, status));
- message.sendToTarget();
- }
- }
-}
diff --git a/location/lib/java/com/android/location/provider/FusedLocationHardwareSink.java b/location/lib/java/com/android/location/provider/FusedLocationHardwareSink.java
deleted file mode 100644
index 01d37acde7b8..000000000000
--- a/location/lib/java/com/android/location/provider/FusedLocationHardwareSink.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.location.provider;
-
-import android.location.Location;
-
-/**
- * Base class for sinks to interact with FusedLocationHardware.
- *
- * <p>Default implementations allow new methods to be added without crashing
- * clients compiled against an old library version.
- */
-public class FusedLocationHardwareSink {
- /**
- * Called when one or more locations are available from the FLP
- * HAL.
- */
- public void onLocationAvailable(Location[] locations) {
- // default do nothing
- }
-
- /**
- * Called when diagnostic data is available from the FLP HAL.
- */
- public void onDiagnosticDataAvailable(String data) {
- // default do nothing
- }
-
- /**
- * Called when capabilities are available from the FLP HAL.
- * Should be called once right after initialization.
- *
- * @param capabilities A bitmask of capabilities defined in
- * fused_location.h.
- */
- public void onCapabilities(int capabilities) {
- // default do nothing
- }
-
- /**
- * Called when the status changes in the underlying FLP HAL
- * implementation (the ability to compute location). This
- * callback will only be made on version 2 or later
- * (see {@link FusedLocationHardware#getVersion()}).
- *
- * @param status One of FLP_STATUS_LOCATION_AVAILABLE or
- * FLP_STATUS_LOCATION_UNAVAILABLE as defined in
- * fused_location.h.
- */
- public void onStatusChanged(int status) {
- // default do nothing
- }
-} \ No newline at end of file
diff --git a/location/lib/java/com/android/location/provider/FusedProvider.java b/location/lib/java/com/android/location/provider/FusedProvider.java
index c966adeadc6f..78a593b6670b 100644
--- a/location/lib/java/com/android/location/provider/FusedProvider.java
+++ b/location/lib/java/com/android/location/provider/FusedProvider.java
@@ -16,8 +16,6 @@
package com.android.location.provider;
-import android.hardware.location.IFusedLocationHardware;
-import android.location.IFusedProvider;
import android.os.IBinder;
/**
@@ -26,17 +24,12 @@ import android.os.IBinder;
* <p>Fused providers can be implemented as services and return the result of
* {@link com.android.location.provider.FusedProvider#getBinder()} in its getBinder() method.
*
- * <p>IMPORTANT: This class is effectively a public API for unbundled applications, and must remain
- * API stable. See README.txt in the root of this package for more information.
+ * @deprecated This class should no longer be used. The location service does not uses this.
+ * This class exist here just to prevent existing apps having reference to this class from
+ * breaking.
*/
+@Deprecated
public abstract class FusedProvider {
- private IFusedProvider.Stub mProvider = new IFusedProvider.Stub() {
- @Override
- public void onFusedLocationHardwareChange(IFusedLocationHardware instance) {
- setFusedLocationHardware(new FusedLocationHardware(instance));
- }
- };
-
/**
* Gets the Binder associated with the provider.
* This is intended to be used for the onBind() method of a service that implements a fused
@@ -45,13 +38,6 @@ public abstract class FusedProvider {
* @return The IBinder instance associated with the provider.
*/
public IBinder getBinder() {
- return mProvider;
+ return null;
}
-
- /**
- * Sets the FusedLocationHardware instance in the provider..
- * @param value The instance to set. This can be null in cases where the service connection
- * is disconnected.
- */
- public abstract void setFusedLocationHardware(FusedLocationHardware value);
}
diff --git a/location/lib/java/com/android/location/provider/GeocodeProvider.java b/location/lib/java/com/android/location/provider/GeocodeProvider.java
index d7a34af332ca..f7f3d82169a7 100644
--- a/location/lib/java/com/android/location/provider/GeocodeProvider.java
+++ b/location/lib/java/com/android/location/provider/GeocodeProvider.java
@@ -33,6 +33,7 @@ import java.util.List;
* <p>IMPORTANT: This class is effectively a public API for unbundled
* applications, and must remain API stable. See README.txt in the root
* of this package for more information.
+ * @hide
*/
public abstract class GeocodeProvider {
diff --git a/location/lib/java/com/android/location/provider/GeofenceProvider.java b/location/lib/java/com/android/location/provider/GeofenceProvider.java
index fafaa8462dd9..43690ab87cf2 100644
--- a/location/lib/java/com/android/location/provider/GeofenceProvider.java
+++ b/location/lib/java/com/android/location/provider/GeofenceProvider.java
@@ -31,6 +31,7 @@ import android.location.IGeofenceProvider;
* <p>IMPORTANT: This class is effectively a public API for unbundled
* applications, and must remain API stable. See README.txt in the root
* of this package for more information.
+ * @hide
*/
public abstract class GeofenceProvider {
diff --git a/location/lib/java/com/android/location/provider/GmsFusedBatchOptions.java b/location/lib/java/com/android/location/provider/GmsFusedBatchOptions.java
deleted file mode 100644
index 29818ecb85cb..000000000000
--- a/location/lib/java/com/android/location/provider/GmsFusedBatchOptions.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.location.provider;
-
-import android.location.FusedBatchOptions;
-
-/**
- * Class that exposes FusedBatchOptions to the GmsCore .
- */
-public class GmsFusedBatchOptions {
- private FusedBatchOptions mOptions = new FusedBatchOptions();
-
- /*
- * Methods that provide a facade for properties in FusedBatchOptions.
- */
- public void setMaxPowerAllocationInMW(double value) {
- mOptions.setMaxPowerAllocationInMW(value);
- }
-
- public double getMaxPowerAllocationInMW() {
- return mOptions.getMaxPowerAllocationInMW();
- }
-
- public void setPeriodInNS(long value) {
- mOptions.setPeriodInNS(value);
- }
-
- public long getPeriodInNS() {
- return mOptions.getPeriodInNS();
- }
-
- public void setSmallestDisplacementMeters(float value) {
- mOptions.setSmallestDisplacementMeters(value);
- }
-
- public float getSmallestDisplacementMeters() {
- return mOptions.getSmallestDisplacementMeters();
- }
-
- public void setSourceToUse(int source) {
- mOptions.setSourceToUse(source);
- }
-
- public void resetSourceToUse(int source) {
- mOptions.resetSourceToUse(source);
- }
-
- public boolean isSourceToUseSet(int source) {
- return mOptions.isSourceToUseSet(source);
- }
-
- public int getSourcesToUse() {
- return mOptions.getSourcesToUse();
- }
-
- public void setFlag(int flag) {
- mOptions.setFlag(flag);
- }
-
- public void resetFlag(int flag) {
- mOptions.resetFlag(flag);
- }
-
- public boolean isFlagSet(int flag) {
- return mOptions.isFlagSet(flag);
- }
-
- public int getFlags() {
- return mOptions.getFlags();
- }
-
- /**
- * Definition of enum flag sets needed by this class.
- * Such values need to be kept in sync with the ones in fused_location.h
- */
-
- public static final class SourceTechnologies {
- public static int GNSS = 1<<0;
- public static int WIFI = 1<<1;
- public static int SENSORS = 1<<2;
- public static int CELL = 1<<3;
- public static int BLUETOOTH = 1<<4;
- }
-
- public static final class BatchFlags {
- public static int WAKEUP_ON_FIFO_FULL = 1<<0;
- public static int CALLBACK_ON_LOCATION_FIX = 1<<1;
- }
-
- /*
- * Method definitions for internal use.
- */
-
- /*
- * @hide
- */
- public FusedBatchOptions getParcelableOptions() {
- return mOptions;
- }
-}
diff --git a/location/lib/java/com/android/location/provider/LocationProviderBase.java b/location/lib/java/com/android/location/provider/LocationProviderBase.java
index d717f40cab59..30655f5bbf10 100644
--- a/location/lib/java/com/android/location/provider/LocationProviderBase.java
+++ b/location/lib/java/com/android/location/provider/LocationProviderBase.java
@@ -56,6 +56,7 @@ import com.android.internal.util.FastPrintWriter;
public abstract class LocationProviderBase {
private final String TAG;
+ /** @hide */
protected final ILocationManager mLocationManager;
private final ProviderProperties mProperties;
private final IBinder mBinder;
diff --git a/location/lib/java/com/android/location/provider/ProviderPropertiesUnbundled.java b/location/lib/java/com/android/location/provider/ProviderPropertiesUnbundled.java
index 9ee4df21c894..b1a1bda45f39 100644
--- a/location/lib/java/com/android/location/provider/ProviderPropertiesUnbundled.java
+++ b/location/lib/java/com/android/location/provider/ProviderPropertiesUnbundled.java
@@ -41,6 +41,7 @@ public final class ProviderPropertiesUnbundled {
mProperties = properties;
}
+ /** @hide */
public ProviderProperties getProviderProperties() {
return mProperties;
}
diff --git a/location/lib/java/com/android/location/provider/ProviderRequestUnbundled.java b/location/lib/java/com/android/location/provider/ProviderRequestUnbundled.java
index ad3d1df35548..6a8e61877e46 100644
--- a/location/lib/java/com/android/location/provider/ProviderRequestUnbundled.java
+++ b/location/lib/java/com/android/location/provider/ProviderRequestUnbundled.java
@@ -33,6 +33,7 @@ import com.android.internal.location.ProviderRequest;
public final class ProviderRequestUnbundled {
private final ProviderRequest mRequest;
+ /** @hide */
public ProviderRequestUnbundled(ProviderRequest request) {
mRequest = request;
}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 1536bb688073..e408a115787c 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -1352,6 +1352,7 @@ public class AudioManager {
//====================================================================
// Offload query
/**
+ * @hide
* Returns whether offloaded playback of an audio format is supported on the device.
* Offloaded playback is where the decoding of an audio stream is not competing with other
* software resources. In general, it is supported by dedicated hardware, such as audio DSPs.
diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java
index 0a1de33b845b..98c2d7fdd55f 100644
--- a/media/java/android/media/AudioManagerInternal.java
+++ b/media/java/android/media/AudioManagerInternal.java
@@ -42,6 +42,8 @@ public abstract class AudioManagerInternal {
public abstract void setRingerModeInternal(int ringerMode, String caller);
+ public abstract void silenceRingerModeInternal(String caller);
+
public abstract void updateRingerModeAffectedStreamsInternal();
public abstract void setAccessibilityServiceUids(IntArray uids);
diff --git a/media/java/android/media/AudioPresentation.java b/media/java/android/media/AudioPresentation.java
index 4652c180936c..e39cb7db3480 100644
--- a/media/java/android/media/AudioPresentation.java
+++ b/media/java/android/media/AudioPresentation.java
@@ -17,6 +17,9 @@
package android.media;
import android.annotation.IntDef;
+import android.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -88,10 +91,14 @@ public final class AudioPresentation {
*/
public static final int MASTERED_FOR_HEADPHONE = 4;
- AudioPresentation(int presentationId,
+ /**
+ * @hide
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public AudioPresentation(int presentationId,
int programId,
- Map<String, String> labels,
- String language,
+ @NonNull Map<String, String> labels,
+ @NonNull String language,
@MasteringIndicationType int masteringIndication,
boolean audioDescriptionAvailable,
boolean spokenSubtitlesAvailable,
@@ -112,6 +119,7 @@ public final class AudioPresentation {
* decoder. Presentation id is typically sequential, but does not have to be.
* @hide
*/
+ @VisibleForTesting
public int getPresentationId() {
return mPresentationId;
}
@@ -121,13 +129,14 @@ public final class AudioPresentation {
* Program id can be used to further uniquely identify the presentation to a decoder.
* @hide
*/
+ @VisibleForTesting
public int getProgramId() {
return mProgramId;
}
/**
* @return a map of available text labels for this presentation. Each label is indexed by its
- * locale corresponding to the language code as specified by ISO 639-2 [42]. Either ISO 639-2/B
+ * locale corresponding to the language code as specified by ISO 639-2. Either ISO 639-2/B
* or ISO 639-2/T could be used.
*/
public Map<Locale, String> getLabels() {
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 3885f9017655..acab8bbb2e0b 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -747,7 +747,8 @@ public class AudioSystem
public static final int FOR_SYSTEM = 4;
public static final int FOR_HDMI_SYSTEM_AUDIO = 5;
public static final int FOR_ENCODED_SURROUND = 6;
- private static final int NUM_FORCE_USE = 7;
+ public static final int FOR_VIBRATE_RINGING = 7;
+ private static final int NUM_FORCE_USE = 8;
public static String forceUseUsageToString(int usage) {
switch (usage) {
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 2d5fad5dde5b..87b5d437cb0e 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -896,6 +896,7 @@ public class AudioTrack extends PlayerBase
}
/**
+ * @hide
* Sets whether this track will play through the offloaded audio path.
* When set to true, at build time, the audio format will be checked against
* {@link AudioManager#isOffloadedPlaybackSupported(AudioFormat)} to verify the audio format
@@ -2012,9 +2013,10 @@ public class AudioTrack extends PlayerBase
* If the audio presentation is invalid then {@link #ERROR_BAD_VALUE} will be returned.
* If a multi-stream decoder (MSD) is not present, or the format does not support
* multiple presentations, then {@link #ERROR_INVALID_OPERATION} will be returned.
+ * {@link #ERROR} is returned in case of any other error.
* @param presentation see {@link AudioPresentation}. In particular, id should be set.
- * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE},
- * {@link #ERROR_INVALID_OPERATION}
+ * @return error code or success, see {@link #SUCCESS}, {@link #ERROR},
+ * {@link #ERROR_BAD_VALUE}, {@link #ERROR_INVALID_OPERATION}
* @throws IllegalArgumentException if the audio presentation is null.
* @throws IllegalStateException if track is not initialized.
*/
@@ -2978,6 +2980,7 @@ public class AudioTrack extends PlayerBase
}
/**
+ * @hide
* Abstract class to receive event notification about the stream playback.
* See {@link AudioTrack#setStreamEventCallback(Executor, StreamEventCallback)} to register
* the callback on the given {@link AudioTrack} instance.
@@ -3011,6 +3014,7 @@ public class AudioTrack extends PlayerBase
private final Object mStreamEventCbLock = new Object();
/**
+ * @hide
* Sets the callback for the notification of stream events.
* @param executor {@link Executor} to handle the callbacks
* @param eventCallback the callback to receive the stream event notifications
@@ -3030,6 +3034,7 @@ public class AudioTrack extends PlayerBase
}
/**
+ * @hide
* Unregisters the callback for notification of stream events, previously set
* by {@link #setStreamEventCallback(Executor, StreamEventCallback)}.
*/
diff --git a/media/java/android/media/DataSourceDesc.java b/media/java/android/media/DataSourceDesc.java
index 6d58a9440996..a53fa11f1777 100644
--- a/media/java/android/media/DataSourceDesc.java
+++ b/media/java/android/media/DataSourceDesc.java
@@ -40,6 +40,7 @@ import java.util.List;
import java.util.Map;
/**
+ * @hide
* Structure for data source descriptor.
*
* Used by {@link MediaPlayer2#setDataSource(DataSourceDesc)}
diff --git a/media/java/android/media/Media2DataSource.java b/media/java/android/media/Media2DataSource.java
index 8ee4a705b446..08df632a99b3 100644
--- a/media/java/android/media/Media2DataSource.java
+++ b/media/java/android/media/Media2DataSource.java
@@ -21,6 +21,7 @@ import java.io.Closeable;
import java.io.IOException;
/**
+ * @hide
* For supplying media data to the framework. Implement this if your app has
* special requirements for the way media data is obtained.
*
diff --git a/media/java/android/media/MediaBrowser2.java b/media/java/android/media/MediaBrowser2.java
index cf3395858534..452371a43a8e 100644
--- a/media/java/android/media/MediaBrowser2.java
+++ b/media/java/android/media/MediaBrowser2.java
@@ -30,6 +30,7 @@ import java.util.List;
import java.util.concurrent.Executor;
/**
+ * @hide
* Browses media content offered by a {@link MediaLibraryService2}.
*/
public class MediaBrowser2 extends MediaController2 {
@@ -142,8 +143,8 @@ public class MediaBrowser2 extends MediaController2 {
@Override
MediaBrowser2Provider createProvider(Context context, SessionToken2 token,
Executor executor, ControllerCallback callback) {
- return ApiLoader.getProvider(context)
- .createMediaBrowser2(context, this, token, executor, (BrowserCallback) callback);
+ return ApiLoader.getProvider().createMediaBrowser2(
+ context, this, token, executor, (BrowserCallback) callback);
}
/**
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index ba9056ed8709..e3fba0cdfa08 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -2359,17 +2359,61 @@ final public class MediaCodec {
public static final int CRYPTO_MODE_AES_CBC = 2;
/**
- * Metadata describing the structure of a (at least partially) encrypted
- * input sample.
- * A buffer's data is considered to be partitioned into "subSamples",
- * each subSample starts with a (potentially empty) run of plain,
- * unencrypted bytes followed by a (also potentially empty) run of
- * encrypted bytes. If pattern encryption applies, each of the latter runs
- * is encrypted only partly, according to a repeating pattern of "encrypt"
- * and "skip" blocks. numBytesOfClearData can be null to indicate that all
- * data is encrypted. This information encapsulates per-sample metadata as
- * outlined in ISO/IEC FDIS 23001-7:2011 "Common encryption in ISO base
- * media file format files".
+ * Metadata describing the structure of an encrypted input sample.
+ * <p>
+ * A buffer's data is considered to be partitioned into "subSamples". Each subSample starts with
+ * a run of plain, unencrypted bytes followed by a run of encrypted bytes. Either of these runs
+ * may be empty. If pattern encryption applies, each of the encrypted runs is encrypted only
+ * partly, according to a repeating pattern of "encrypt" and "skip" blocks.
+ * {@link #numBytesOfClearData} can be null to indicate that all data is encrypted, and
+ * {@link #numBytesOfEncryptedData} can be null to indicate that all data is clear. At least one
+ * of {@link #numBytesOfClearData} and {@link #numBytesOfEncryptedData} must be non-null.
+ * <p>
+ * This information encapsulates per-sample metadata as outlined in ISO/IEC FDIS 23001-7:2016
+ * "Common encryption in ISO base media file format files".
+ * <p>
+ * <h3>ISO-CENC Schemes</h3>
+ * ISO/IEC FDIS 23001-7:2016 defines four possible schemes by which media may be encrypted,
+ * corresponding to each possible combination of an AES mode with the presence or absence of
+ * patterned encryption.
+ *
+ * <table style="width: 0%">
+ * <thead>
+ * <tr>
+ * <th>&nbsp;</th>
+ * <th>AES-CTR</th>
+ * <th>AES-CBC</th>
+ * </tr>
+ * </thead>
+ * <tbody>
+ * <tr>
+ * <th>Without Patterns</th>
+ * <td>cenc</td>
+ * <td>cbc1</td>
+ * </tr><tr>
+ * <th>With Patterns</th>
+ * <td>cens</td>
+ * <td>cbcs</td>
+ * </tr>
+ * </tbody>
+ * </table>
+ *
+ * For {@code CryptoInfo}, the scheme is selected implicitly by the combination of the
+ * {@link #mode} field and the value set with {@link #setPattern}. For the pattern, setting the
+ * pattern to all zeroes (that is, both {@code blocksToEncrypt} and {@code blocksToSkip} are
+ * zero) is interpreted as turning patterns off completely. A scheme that does not use patterns
+ * will be selected, either cenc or cbc1. Setting the pattern to any nonzero value will choose
+ * one of the pattern-supporting schemes, cens or cbcs. The default pattern if
+ * {@link #setPattern} is never called is all zeroes.
+ * <p>
+ * <h4>HLS SAMPLE-AES Audio</h4>
+ * HLS SAMPLE-AES audio is encrypted in a manner compatible with the cbcs scheme, except that it
+ * does not use patterned encryption. However, if {@link #setPattern} is used to set the pattern
+ * to all zeroes, this will be interpreted as selecting the cbc1 scheme. The cbc1 scheme cannot
+ * successfully decrypt HLS SAMPLE-AES audio because of differences in how the IVs are handled.
+ * For this reason, it is recommended that a pattern of {@code 1} encrypted block and {@code 0}
+ * skip blocks be used with HLS SAMPLE-AES audio. This will trigger decryption to use cbcs mode
+ * while still decrypting every block.
*/
public final static class CryptoInfo {
/**
@@ -2377,11 +2421,13 @@ final public class MediaCodec {
*/
public int numSubSamples;
/**
- * The number of leading unencrypted bytes in each subSample.
+ * The number of leading unencrypted bytes in each subSample. If null, all bytes are treated
+ * as encrypted and {@link #numBytesOfEncryptedData} must be specified.
*/
public int[] numBytesOfClearData;
/**
- * The number of trailing encrypted bytes in each subSample.
+ * The number of trailing encrypted bytes in each subSample. If null, all bytes are treated
+ * as clear and {@link #numBytesOfClearData} must be specified.
*/
public int[] numBytesOfEncryptedData;
/**
@@ -2400,35 +2446,34 @@ final public class MediaCodec {
public int mode;
/**
- * Metadata describing an encryption pattern for the protected bytes in
- * a subsample. An encryption pattern consists of a repeating sequence
- * of crypto blocks comprised of a number of encrypted blocks followed
- * by a number of unencrypted, or skipped, blocks.
+ * Metadata describing an encryption pattern for the protected bytes in a subsample. An
+ * encryption pattern consists of a repeating sequence of crypto blocks comprised of a
+ * number of encrypted blocks followed by a number of unencrypted, or skipped, blocks.
*/
public final static class Pattern {
/**
- * Number of blocks to be encrypted in the pattern. If zero, pattern
- * encryption is inoperative.
+ * Number of blocks to be encrypted in the pattern. If both this and
+ * {@link #mSkipBlocks} are zero, pattern encryption is inoperative.
*/
private int mEncryptBlocks;
/**
- * Number of blocks to be skipped (left clear) in the pattern. If zero,
- * pattern encryption is inoperative.
+ * Number of blocks to be skipped (left clear) in the pattern. If both this and
+ * {@link #mEncryptBlocks} are zero, pattern encryption is inoperative.
*/
private int mSkipBlocks;
/**
- * Construct a sample encryption pattern given the number of blocks to
- * encrypt and skip in the pattern.
+ * Construct a sample encryption pattern given the number of blocks to encrypt and skip
+ * in the pattern. If both parameters are zero, pattern encryption is inoperative.
*/
public Pattern(int blocksToEncrypt, int blocksToSkip) {
set(blocksToEncrypt, blocksToSkip);
}
/**
- * Set the number of blocks to encrypt and skip in a sample encryption
- * pattern.
+ * Set the number of blocks to encrypt and skip in a sample encryption pattern. If both
+ * parameters are zero, pattern encryption is inoperative.
*/
public void set(int blocksToEncrypt, int blocksToSkip) {
mEncryptBlocks = blocksToEncrypt;
diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java
index 20c320947f45..234a4f452fe5 100644
--- a/media/java/android/media/MediaController2.java
+++ b/media/java/android/media/MediaController2.java
@@ -40,6 +40,7 @@ import java.util.List;
import java.util.concurrent.Executor;
/**
+ * @hide
* Allows an app to interact with an active {@link MediaSession2} or a
* {@link MediaSessionService2} in any status. Media buttons and other commands can be sent to
* the session.
@@ -366,8 +367,8 @@ public class MediaController2 implements AutoCloseable {
MediaController2Provider createProvider(@NonNull Context context,
@NonNull SessionToken2 token, @NonNull Executor executor,
@NonNull ControllerCallback callback) {
- return ApiLoader.getProvider(context)
- .createMediaController2(context, this, token, executor, callback);
+ return ApiLoader.getProvider().createMediaController2(
+ context, this, token, executor, callback);
}
/**
@@ -735,8 +736,10 @@ public class MediaController2 implements AutoCloseable {
return mProvider.getPlaylistMetadata_impl();
}
+
/**
- * Inserts the media item to the playlist at position index.
+ * Adds the media item to the playlist at position index. Index equals or greater than
+ * the current playlist size will add the item at the end of the playlist.
* <p>
* This will not change the currently playing media item.
* If index is less than or equal to the current index of the playlist,
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index b50aa477d511..3bfbcc2039d3 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -105,10 +105,10 @@ import java.util.Map;
* <tr><td>{@link #KEY_HEIGHT}</td><td>Integer</td><td></td></tr>
* <tr><td>{@link #KEY_COLOR_FORMAT}</td><td>Integer</td><td>set by the user
* for encoders, readable in the output format of decoders</b></td></tr>
- * <tr><td>{@link #KEY_GRID_WIDTH}</td><td>Integer</td><td>required if the image has grid</td></tr>
- * <tr><td>{@link #KEY_GRID_HEIGHT}</td><td>Integer</td><td>required if the image has grid</td></tr>
+ * <tr><td>{@link #KEY_TILE_WIDTH}</td><td>Integer</td><td>required if the image has grid</td></tr>
+ * <tr><td>{@link #KEY_TILE_HEIGHT}</td><td>Integer</td><td>required if the image has grid</td></tr>
* <tr><td>{@link #KEY_GRID_ROWS}</td><td>Integer</td><td>required if the image has grid</td></tr>
- * <tr><td>{@link #KEY_GRID_COLS}</td><td>Integer</td><td>required if the image has grid</td></tr>
+ * <tr><td>{@link #KEY_GRID_COLUMNS}</td><td>Integer</td><td>required if the image has grid</td></tr>
* </table>
*/
public final class MediaFormat {
@@ -150,17 +150,17 @@ public final class MediaFormat {
* The track's MediaFormat will come with {@link #KEY_WIDTH} and
* {@link #KEY_HEIGHT} keys, which describes the width and height
* of the image. If the image doesn't contain grid (i.e. none of
- * {@link #KEY_GRID_WIDTH}, {@link #KEY_GRID_HEIGHT},
- * {@link #KEY_GRID_ROWS}, {@link #KEY_GRID_COLS} are present}), the
+ * {@link #KEY_TILE_WIDTH}, {@link #KEY_TILE_HEIGHT},
+ * {@link #KEY_GRID_ROWS}, {@link #KEY_GRID_COLUMNS} are present}), the
* track will contain a single sample of coded data for the entire image,
* and the image width and height should be used to set up the decoder.
*
* If the image does come with grid, each sample from the track will
* contain one tile in the grid, of which the size is described by
- * {@link #KEY_GRID_WIDTH} and {@link #KEY_GRID_HEIGHT}. This size
+ * {@link #KEY_TILE_WIDTH} and {@link #KEY_TILE_HEIGHT}. This size
* (instead of {@link #KEY_WIDTH} and {@link #KEY_HEIGHT}) should be
* used to set up the decoder. The track contains {@link #KEY_GRID_ROWS}
- * by {@link #KEY_GRID_COLS} samples in row-major, top-row first,
+ * by {@link #KEY_GRID_COLUMNS} samples in row-major, top-row first,
* left-to-right order. The output image should be reconstructed by
* first tiling the decoding results of the tiles in the correct order,
* then trimming (before rotation is applied) on the bottom and right
@@ -275,28 +275,28 @@ public final class MediaFormat {
public static final String KEY_FRAME_RATE = "frame-rate";
/**
- * A key describing the grid width of the content in a {@link #MIMETYPE_IMAGE_ANDROID_HEIC}
- * track. The associated value is an integer.
+ * A key describing the width (in pixels) of each tile of the content in a
+ * {@link #MIMETYPE_IMAGE_ANDROID_HEIC} track. The associated value is an integer.
*
* Refer to {@link #MIMETYPE_IMAGE_ANDROID_HEIC} on decoding instructions of such tracks.
*
- * @see #KEY_GRID_HEIGHT
+ * @see #KEY_TILE_HEIGHT
* @see #KEY_GRID_ROWS
- * @see #KEY_GRID_COLS
+ * @see #KEY_GRID_COLUMNS
*/
- public static final String KEY_GRID_WIDTH = "grid-width";
+ public static final String KEY_TILE_WIDTH = "tile-width";
/**
- * A key describing the grid height of the content in a {@link #MIMETYPE_IMAGE_ANDROID_HEIC}
- * track. The associated value is an integer.
+ * A key describing the height (in pixels) of each tile of the content in a
+ * {@link #MIMETYPE_IMAGE_ANDROID_HEIC} track. The associated value is an integer.
*
* Refer to {@link #MIMETYPE_IMAGE_ANDROID_HEIC} on decoding instructions of such tracks.
*
- * @see #KEY_GRID_WIDTH
+ * @see #KEY_TILE_WIDTH
* @see #KEY_GRID_ROWS
- * @see #KEY_GRID_COLS
+ * @see #KEY_GRID_COLUMNS
*/
- public static final String KEY_GRID_HEIGHT = "grid-height";
+ public static final String KEY_TILE_HEIGHT = "tile-height";
/**
* A key describing the number of grid rows in the content in a
@@ -304,9 +304,9 @@ public final class MediaFormat {
*
* Refer to {@link #MIMETYPE_IMAGE_ANDROID_HEIC} on decoding instructions of such tracks.
*
- * @see #KEY_GRID_WIDTH
- * @see #KEY_GRID_HEIGHT
- * @see #KEY_GRID_COLS
+ * @see #KEY_TILE_WIDTH
+ * @see #KEY_TILE_HEIGHT
+ * @see #KEY_GRID_COLUMNS
*/
public static final String KEY_GRID_ROWS = "grid-rows";
@@ -316,11 +316,11 @@ public final class MediaFormat {
*
* Refer to {@link #MIMETYPE_IMAGE_ANDROID_HEIC} on decoding instructions of such tracks.
*
- * @see #KEY_GRID_WIDTH
- * @see #KEY_GRID_HEIGHT
+ * @see #KEY_TILE_WIDTH
+ * @see #KEY_TILE_HEIGHT
* @see #KEY_GRID_ROWS
*/
- public static final String KEY_GRID_COLS = "grid-cols";
+ public static final String KEY_GRID_COLUMNS = "grid-cols";
/**
* A key describing the raw audio sample encoding/format.
diff --git a/media/java/android/media/MediaItem2.java b/media/java/android/media/MediaItem2.java
index b50c3e4bcd0b..1967a1c43000 100644
--- a/media/java/android/media/MediaItem2.java
+++ b/media/java/android/media/MediaItem2.java
@@ -28,6 +28,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
+ * @hide
* A class with information on a single media item with the metadata information.
* Media item are application dependent so we cannot guarantee that they contain the right values.
* <p>
@@ -81,7 +82,7 @@ public class MediaItem2 {
}
public static MediaItem2 fromBundle(Context context, Bundle bundle) {
- return ApiLoader.getProvider(context).fromBundle_MediaItem2(context, bundle);
+ return ApiLoader.getProvider().fromBundle_MediaItem2(context, bundle);
}
public String toString() {
@@ -164,8 +165,7 @@ public class MediaItem2 {
* @param flags
*/
public Builder(@NonNull Context context, @Flags int flags) {
- mProvider = ApiLoader.getProvider(context).createMediaItem2Builder(
- context, this, flags);
+ mProvider = ApiLoader.getProvider().createMediaItem2Builder(context, this, flags);
}
/**
diff --git a/media/java/android/media/MediaLibraryService2.java b/media/java/android/media/MediaLibraryService2.java
index 6cab43017034..034d17e14154 100644
--- a/media/java/android/media/MediaLibraryService2.java
+++ b/media/java/android/media/MediaLibraryService2.java
@@ -34,6 +34,7 @@ import java.util.List;
import java.util.concurrent.Executor;
/**
+ * @hide
* Base class for media library services.
* <p>
* Media library services enable applications to browse media content provided by an application
@@ -210,9 +211,8 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 {
public Builder(@NonNull MediaLibraryService2 service,
@NonNull @CallbackExecutor Executor callbackExecutor,
@NonNull MediaLibrarySessionCallback callback) {
- super((instance) -> ApiLoader.getProvider(service)
- .createMediaLibraryService2Builder(service, (Builder) instance,
- callbackExecutor, callback));
+ super((instance) -> ApiLoader.getProvider().createMediaLibraryService2Builder(
+ service, (Builder) instance, callbackExecutor, callback));
}
@Override
@@ -309,7 +309,7 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 {
@Override
MediaSessionService2Provider createProvider() {
- return ApiLoader.getProvider(this).createMediaLibraryService2(this);
+ return ApiLoader.getProvider().createMediaLibraryService2(this);
}
/**
@@ -403,7 +403,7 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 {
*/
public LibraryRoot(@NonNull Context context,
@NonNull String rootId, @Nullable Bundle extras) {
- mProvider = ApiLoader.getProvider(context).createMediaLibraryService2LibraryRoot(
+ mProvider = ApiLoader.getProvider().createMediaLibraryService2LibraryRoot(
context, this, rootId, extras);
}
diff --git a/media/java/android/media/MediaMetadata2.java b/media/java/android/media/MediaMetadata2.java
index fb1206515ef5..1a15962cb958 100644
--- a/media/java/android/media/MediaMetadata2.java
+++ b/media/java/android/media/MediaMetadata2.java
@@ -31,6 +31,7 @@ import java.lang.annotation.RetentionPolicy;
import java.util.Set;
/**
+ * @hide
* Contains metadata about an item, such as the title, artist, etc.
*/
// New version of MediaMetadata with following changes
@@ -684,7 +685,7 @@ public final class MediaMetadata2 {
*/
public static @NonNull MediaMetadata2 fromBundle(@NonNull Context context,
@Nullable Bundle bundle) {
- return ApiLoader.getProvider(context).fromBundle_MediaMetadata2(context, bundle);
+ return ApiLoader.getProvider().fromBundle_MediaMetadata2(context, bundle);
}
/**
@@ -699,8 +700,7 @@ public final class MediaMetadata2 {
* {@link MediaMetadata2} must be added.
*/
public Builder(@NonNull Context context) {
- mProvider = ApiLoader.getProvider(context).createMediaMetadata2Builder(
- context, this);
+ mProvider = ApiLoader.getProvider().createMediaMetadata2Builder(context, this);
}
/**
@@ -711,8 +711,7 @@ public final class MediaMetadata2 {
* @param source
*/
public Builder(@NonNull Context context, @NonNull MediaMetadata2 source) {
- mProvider = ApiLoader.getProvider(context).createMediaMetadata2Builder(
- context, this, source);
+ mProvider = ApiLoader.getProvider().createMediaMetadata2Builder(context, this, source);
}
/**
diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java
index 1aeed6da3a31..0955dd633c1c 100644
--- a/media/java/android/media/MediaMetadataRetriever.java
+++ b/media/java/android/media/MediaMetadataRetriever.java
@@ -427,20 +427,40 @@ public class MediaMetadataRetriever
* a valid frame. The total number of frames available for retrieval can be queried
* via the {@link #METADATA_KEY_VIDEO_FRAME_COUNT} key.
* @param params BitmapParams that controls the returned bitmap config (such as pixel formats).
- * If null, default config will be chosen.
*
* @throws IllegalStateException if the container doesn't contain video or image sequences.
* @throws IllegalArgumentException if the requested frame index does not exist.
*
* @return A Bitmap containing the requested video frame, or null if the retrieval fails.
*
+ * @see #getFrameAtIndex(int)
* @see #getFramesAtIndex(int, int, BitmapParams)
+ * @see #getFramesAtIndex(int, int)
*/
- public Bitmap getFrameAtIndex(int frameIndex, @Nullable BitmapParams params) {
+ public Bitmap getFrameAtIndex(int frameIndex, @NonNull BitmapParams params) {
List<Bitmap> bitmaps = getFramesAtIndex(frameIndex, 1, params);
- if (bitmaps == null || bitmaps.size() < 1) {
- return null;
- }
+ return bitmaps.get(0);
+ }
+
+ /**
+ * This method is similar to {@link #getFrameAtIndex(int, BitmapParams)} except that
+ * the default for {@link BitmapParams} will be used.
+ *
+ * @param frameIndex 0-based index of the video frame. The frame index must be that of
+ * a valid frame. The total number of frames available for retrieval can be queried
+ * via the {@link #METADATA_KEY_VIDEO_FRAME_COUNT} key.
+ *
+ * @throws IllegalStateException if the container doesn't contain video or image sequences.
+ * @throws IllegalArgumentException if the requested frame index does not exist.
+ *
+ * @return A Bitmap containing the requested video frame, or null if the retrieval fails.
+ *
+ * @see #getFrameAtIndex(int, BitmapParams)
+ * @see #getFramesAtIndex(int, int, BitmapParams)
+ * @see #getFramesAtIndex(int, int)
+ */
+ public Bitmap getFrameAtIndex(int frameIndex) {
+ List<Bitmap> bitmaps = getFramesAtIndex(frameIndex, 1);
return bitmaps.get(0);
}
@@ -461,7 +481,6 @@ public class MediaMetadataRetriever
* @param numFrames number of consecutive video frames to retrieve. Must be a positive
* value. The stream must contain at least numFrames frames starting at frameIndex.
* @param params BitmapParams that controls the returned bitmap config (such as pixel formats).
- * If null, default config will be chosen.
*
* @throws IllegalStateException if the container doesn't contain video or image sequences.
* @throws IllegalArgumentException if the frameIndex or numFrames is invalid, or the
@@ -471,8 +490,40 @@ public class MediaMetadataRetriever
* array could contain less frames than requested if the retrieval fails.
*
* @see #getFrameAtIndex(int, BitmapParams)
+ * @see #getFrameAtIndex(int)
+ * @see #getFramesAtIndex(int, int)
*/
- public List<Bitmap> getFramesAtIndex(
+ public @NonNull List<Bitmap> getFramesAtIndex(
+ int frameIndex, int numFrames, @NonNull BitmapParams params) {
+ return getFramesAtIndexInternal(frameIndex, numFrames, params);
+ }
+
+ /**
+ * This method is similar to {@link #getFramesAtIndex(int, int, BitmapParams)} except that
+ * the default for {@link BitmapParams} will be used.
+ *
+ * @param frameIndex 0-based index of the first video frame to retrieve. The frame index
+ * must be that of a valid frame. The total number of frames available for retrieval
+ * can be queried via the {@link #METADATA_KEY_VIDEO_FRAME_COUNT} key.
+ * @param numFrames number of consecutive video frames to retrieve. Must be a positive
+ * value. The stream must contain at least numFrames frames starting at frameIndex.
+ *
+ * @throws IllegalStateException if the container doesn't contain video or image sequences.
+ * @throws IllegalArgumentException if the frameIndex or numFrames is invalid, or the
+ * stream doesn't contain at least numFrames starting at frameIndex.
+
+ * @return An list of Bitmaps containing the requested video frames. The returned
+ * array could contain less frames than requested if the retrieval fails.
+ *
+ * @see #getFrameAtIndex(int, BitmapParams)
+ * @see #getFrameAtIndex(int)
+ * @see #getFramesAtIndex(int, int, BitmapParams)
+ */
+ public @NonNull List<Bitmap> getFramesAtIndex(int frameIndex, int numFrames) {
+ return getFramesAtIndexInternal(frameIndex, numFrames, null);
+ }
+
+ private @NonNull List<Bitmap> getFramesAtIndexInternal(
int frameIndex, int numFrames, @Nullable BitmapParams params) {
if (!"yes".equals(extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO))) {
throw new IllegalStateException("Does not contail video or image sequences");
@@ -487,7 +538,8 @@ public class MediaMetadataRetriever
}
return _getFrameAtIndex(frameIndex, numFrames, params);
}
- private native List<Bitmap> _getFrameAtIndex(
+
+ private native @NonNull List<Bitmap> _getFrameAtIndex(
int frameIndex, int numFrames, @Nullable BitmapParams params);
/**
@@ -498,29 +550,39 @@ public class MediaMetadataRetriever
* used to create the bitmap from the {@code BitmapParams} argument, for instance
* to query the bitmap config used for the bitmap with {@link BitmapParams#getActualConfig}.
*
- * @param imageIndex 0-based index of the image, with negative value indicating
- * the primary image.
+ * @param imageIndex 0-based index of the image.
* @param params BitmapParams that controls the returned bitmap config (such as pixel formats).
- * If null, default config will be chosen.
*
* @throws IllegalStateException if the container doesn't contain still images.
* @throws IllegalArgumentException if the requested image does not exist.
*
* @return the requested still image, or null if the image cannot be retrieved.
*
+ * @see #getImageAtIndex(int)
* @see #getPrimaryImage(BitmapParams)
+ * @see #getPrimaryImage()
*/
- public Bitmap getImageAtIndex(int imageIndex, @Nullable BitmapParams params) {
- if (!"yes".equals(extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE))) {
- throw new IllegalStateException("Does not contail still images");
- }
-
- String imageCount = extractMetadata(MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT);
- if (imageIndex >= Integer.parseInt(imageCount)) {
- throw new IllegalArgumentException("Invalid image index: " + imageCount);
- }
+ public Bitmap getImageAtIndex(int imageIndex, @NonNull BitmapParams params) {
+ return getImageAtIndexInternal(imageIndex, params);
+ }
- return _getImageAtIndex(imageIndex, params);
+ /**
+ * This method is similar to {@link #getImageAtIndex(int, BitmapParams)} except that
+ * the default for {@link BitmapParams} will be used.
+ *
+ * @param imageIndex 0-based index of the image.
+ *
+ * @throws IllegalStateException if the container doesn't contain still images.
+ * @throws IllegalArgumentException if the requested image does not exist.
+ *
+ * @return the requested still image, or null if the image cannot be retrieved.
+ *
+ * @see #getImageAtIndex(int, BitmapParams)
+ * @see #getPrimaryImage(BitmapParams)
+ * @see #getPrimaryImage()
+ */
+ public Bitmap getImageAtIndex(int imageIndex) {
+ return getImageAtIndexInternal(imageIndex, null);
}
/**
@@ -532,16 +594,46 @@ public class MediaMetadataRetriever
* to query the bitmap config used for the bitmap with {@link BitmapParams#getActualConfig}.
*
* @param params BitmapParams that controls the returned bitmap config (such as pixel formats).
- * If null, default config will be chosen.
*
* @return the primary image, or null if it cannot be retrieved.
*
* @throws IllegalStateException if the container doesn't contain still images.
*
* @see #getImageAtIndex(int, BitmapParams)
+ * @see #getImageAtIndex(int)
+ * @see #getPrimaryImage()
*/
- public Bitmap getPrimaryImage(@Nullable BitmapParams params) {
- return getImageAtIndex(-1, params);
+ public Bitmap getPrimaryImage(@NonNull BitmapParams params) {
+ return getImageAtIndexInternal(-1, params);
+ }
+
+ /**
+ * This method is similar to {@link #getPrimaryImage(BitmapParams)} except that
+ * the default for {@link BitmapParams} will be used.
+ *
+ * @return the primary image, or null if it cannot be retrieved.
+ *
+ * @throws IllegalStateException if the container doesn't contain still images.
+ *
+ * @see #getImageAtIndex(int, BitmapParams)
+ * @see #getImageAtIndex(int)
+ * @see #getPrimaryImage(BitmapParams)
+ */
+ public Bitmap getPrimaryImage() {
+ return getImageAtIndexInternal(-1, null);
+ }
+
+ private Bitmap getImageAtIndexInternal(int imageIndex, @Nullable BitmapParams params) {
+ if (!"yes".equals(extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE))) {
+ throw new IllegalStateException("Does not contail still images");
+ }
+
+ String imageCount = extractMetadata(MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT);
+ if (imageIndex >= Integer.parseInt(imageCount)) {
+ throw new IllegalArgumentException("Invalid image index: " + imageCount);
+ }
+
+ return _getImageAtIndex(imageIndex, params);
}
private native Bitmap _getImageAtIndex(int imageIndex, @Nullable BitmapParams params);
@@ -788,7 +880,8 @@ public class MediaMetadataRetriever
public static final int METADATA_KEY_IMAGE_HEIGHT = 30;
/**
* If the media contains still images, this key retrieves the rotation
- * of the primary image.
+ * angle (in degrees clockwise) of the primary image. The image rotation
+ * angle must be one of 0, 90, 180, or 270 degrees.
*/
public static final int METADATA_KEY_IMAGE_ROTATION = 31;
/**
diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java
index ece19b9ca37b..dcc872c16e15 100644
--- a/media/java/android/media/MediaPlayer2.java
+++ b/media/java/android/media/MediaPlayer2.java
@@ -43,6 +43,7 @@ import java.util.concurrent.Executor;
/**
+ * @hide
* MediaPlayer2 class can be used to control playback
* of audio/video files and streams. An example on how to use the methods in
* this class can be found in {@link android.widget.VideoView}.
diff --git a/media/java/android/media/MediaPlayerBase.java b/media/java/android/media/MediaPlayerBase.java
index 48b7a51fc1eb..1fcf02b5686a 100644
--- a/media/java/android/media/MediaPlayerBase.java
+++ b/media/java/android/media/MediaPlayerBase.java
@@ -26,6 +26,7 @@ import java.util.List;
import java.util.concurrent.Executor;
/**
+ * @hide
* Base class for all media players that want media session.
*/
public abstract class MediaPlayerBase implements AutoCloseable {
@@ -306,8 +307,9 @@ public abstract class MediaPlayerBase implements AutoCloseable {
public static abstract class PlayerEventCallback {
/**
* Called when the player's current data source has changed.
+ *
* @param mpb the player whose data source changed.
- * @param dsd the new current data source.
+ * @param dsd the new current data source. null, if no more data sources available.
*/
public void onCurrentDataSourceChanged(@NonNull MediaPlayerBase mpb,
@Nullable DataSourceDesc dsd) { }
diff --git a/media/java/android/media/MediaPlaylistAgent.java b/media/java/android/media/MediaPlaylistAgent.java
index 6b3620b62dc3..453e24a63f52 100644
--- a/media/java/android/media/MediaPlaylistAgent.java
+++ b/media/java/android/media/MediaPlaylistAgent.java
@@ -30,6 +30,7 @@ import java.util.List;
import java.util.concurrent.Executor;
/**
+ * @hide
* MediaPlaylistAgent is the abstract class an application needs to derive from to pass an object
* to a MediaSession2 that will override default playlist handling behaviors. It contains a set of
* notify methods to signal MediaSession2 that playlist-related state has changed.
@@ -148,7 +149,7 @@ public abstract class MediaPlaylistAgent {
}
public MediaPlaylistAgent(@NonNull Context context) {
- mProvider = ApiLoader.getProvider(context).createMediaPlaylistAgent(context, this);
+ mProvider = ApiLoader.getProvider().createMediaPlaylistAgent(context, this);
}
/**
@@ -228,10 +229,15 @@ public abstract class MediaPlaylistAgent {
}
/**
- * Adds the media item to the playlist at the index
+ * Adds the media item to the playlist at position index. Index equals or greater than
+ * the current playlist size will add the item at the end of the playlist.
+ * <p>
+ * This will not change the currently playing media item.
+ * If index is less than or equal to the current index of the playlist,
+ * the current index of the playlist will be incremented correspondingly.
*
- * @param index index
- * @param item media item to add
+ * @param index the index you want to add
+ * @param item the media item you want to add
*/
public void addPlaylistItem(int index, @NonNull MediaItem2 item) {
mProvider.addPlaylistItem_impl(index, item);
diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java
index 66478318eb3b..0f4b5da476f1 100644
--- a/media/java/android/media/MediaSession2.java
+++ b/media/java/android/media/MediaSession2.java
@@ -49,6 +49,7 @@ import java.util.List;
import java.util.concurrent.Executor;
/**
+ * @hide
* Allows a media app to expose its transport controls and playback information in a process to
* other processes including the Android framework and other apps. Common use cases are as follows.
* <ul>
@@ -431,16 +432,16 @@ public class MediaSession2 implements AutoCloseable {
private final CommandProvider mProvider;
public Command(@NonNull Context context, int commandCode) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2Command(this, commandCode, null, null);
+ mProvider = ApiLoader.getProvider().createMediaSession2Command(
+ this, commandCode, null, null);
}
public Command(@NonNull Context context, @NonNull String action, @Nullable Bundle extras) {
if (action == null) {
throw new IllegalArgumentException("action shouldn't be null");
}
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2Command(this, COMMAND_CODE_CUSTOM, action, extras);
+ mProvider = ApiLoader.getProvider().createMediaSession2Command(
+ this, COMMAND_CODE_CUSTOM, action, extras);
}
/**
@@ -488,7 +489,7 @@ public class MediaSession2 implements AutoCloseable {
* @hide
*/
public static Command fromBundle(@NonNull Context context, @NonNull Bundle command) {
- return ApiLoader.getProvider(context).fromBundle_MediaSession2Command(context, command);
+ return ApiLoader.getProvider().fromBundle_MediaSession2Command(context, command);
}
}
@@ -499,13 +500,13 @@ public class MediaSession2 implements AutoCloseable {
private final CommandGroupProvider mProvider;
public CommandGroup(@NonNull Context context) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2CommandGroup(context, this, null);
+ mProvider = ApiLoader.getProvider().createMediaSession2CommandGroup(
+ context, this, null);
}
public CommandGroup(@NonNull Context context, @Nullable CommandGroup others) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2CommandGroup(context, this, others);
+ mProvider = ApiLoader.getProvider().createMediaSession2CommandGroup(
+ context, this, others);
}
/**
@@ -559,8 +560,7 @@ public class MediaSession2 implements AutoCloseable {
* @hide
*/
public static @Nullable CommandGroup fromBundle(Context context, Bundle commands) {
- return ApiLoader.getProvider(context)
- .fromBundle_MediaSession2CommandGroup(context, commands);
+ return ApiLoader.getProvider().fromBundle_MediaSession2CommandGroup(context, commands);
}
}
@@ -1010,7 +1010,7 @@ public class MediaSession2 implements AutoCloseable {
// This workarounds javadoc issue described in the MediaSession2.BuilderBase.
public static final class Builder extends BuilderBase<MediaSession2, Builder, SessionCallback> {
public Builder(Context context) {
- super((instance) -> ApiLoader.getProvider(context).createMediaSession2Builder(
+ super((instance) -> ApiLoader.getProvider().createMediaSession2Builder(
context, (Builder) instance));
}
@@ -1062,9 +1062,8 @@ public class MediaSession2 implements AutoCloseable {
*/
public ControllerInfo(@NonNull Context context, int uid, int pid,
@NonNull String packageName, @NonNull IInterface callback) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2ControllerInfo(
- context, this, uid, pid, packageName, callback);
+ mProvider = ApiLoader.getProvider().createMediaSession2ControllerInfo(
+ context, this, uid, pid, packageName, callback);
}
/**
@@ -1192,8 +1191,8 @@ public class MediaSession2 implements AutoCloseable {
private final CommandButtonProvider.BuilderProvider mProvider;
public Builder(@NonNull Context context) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSession2CommandButtonBuilder(context, this);
+ mProvider = ApiLoader.getProvider().createMediaSession2CommandButtonBuilder(
+ context, this);
}
public @NonNull Builder setCommand(@Nullable Command command) {
@@ -1543,7 +1542,7 @@ public class MediaSession2 implements AutoCloseable {
* @see #COMMAND_CODE_PLAYLIST_REPLACE_ITEM
*/
public void setOnDataSourceMissingHelper(@NonNull OnDataSourceMissingHelper helper) {
- // TODO(jaewan): Implement (b/74090741).
+ mProvider.setOnDataSourceMissingHelper_impl(helper);
}
/**
@@ -1552,7 +1551,7 @@ public class MediaSession2 implements AutoCloseable {
* @see #setOnDataSourceMissingHelper(OnDataSourceMissingHelper)
*/
public void clearOnDataSourceMissingHelper() {
- // TODO(jaewan): Implement (b/74090741)
+ mProvider.clearOnDataSourceMissingHelper_impl();
}
/**
@@ -1648,7 +1647,8 @@ public class MediaSession2 implements AutoCloseable {
}
/**
- * Adds the media item to the playlist at position index.
+ * Adds the media item to the playlist at position index. Index equals or greater than
+ * the current playlist size will add the item at the end of the playlist.
* <p>
* This will not change the currently playing media item.
* If index is less than or equal to the current index of the play list,
diff --git a/media/java/android/media/MediaSessionService2.java b/media/java/android/media/MediaSessionService2.java
index 32caf4b5a0e7..85ac9b223eff 100644
--- a/media/java/android/media/MediaSessionService2.java
+++ b/media/java/android/media/MediaSessionService2.java
@@ -30,6 +30,7 @@ import android.media.update.MediaSessionService2Provider.MediaNotificationProvid
import android.os.IBinder;
/**
+ * @hide
* Base class for media session services, which is the service version of the {@link MediaSession2}.
* <p>
* It's highly recommended for an app to use this instead of {@link MediaSession2} if it wants
@@ -123,7 +124,7 @@ public abstract class MediaSessionService2 extends Service {
}
MediaSessionService2Provider createProvider() {
- return ApiLoader.getProvider(this).createMediaSessionService2(this);
+ return ApiLoader.getProvider().createMediaSessionService2(this);
}
/**
@@ -220,9 +221,8 @@ public abstract class MediaSessionService2 extends Service {
*/
public MediaNotification(@NonNull Context context,
int notificationId, @NonNull Notification notification) {
- mProvider = ApiLoader.getProvider(context)
- .createMediaSessionService2MediaNotification(
- context, this, notificationId, notification);
+ mProvider = ApiLoader.getProvider().createMediaSessionService2MediaNotification(
+ context, this, notificationId, notification);
}
public int getNotificationId() {
diff --git a/media/java/android/media/Rating2.java b/media/java/android/media/Rating2.java
index 29bd9220bdc1..5f7a3340603a 100644
--- a/media/java/android/media/Rating2.java
+++ b/media/java/android/media/Rating2.java
@@ -131,7 +131,7 @@ public final class Rating2 {
* @return new Rating2 instance or {@code null} for error
*/
public static Rating2 fromBundle(@NonNull Context context, @Nullable Bundle bundle) {
- return ApiLoader.getProvider(context).fromBundle_Rating2(context, bundle);
+ return ApiLoader.getProvider().fromBundle_Rating2(context, bundle);
}
/**
@@ -154,7 +154,7 @@ public final class Rating2 {
*/
public static @Nullable Rating2 newUnratedRating(@NonNull Context context,
@Style int ratingStyle) {
- return ApiLoader.getProvider(context).newUnratedRating_Rating2(context, ratingStyle);
+ return ApiLoader.getProvider().newUnratedRating_Rating2(context, ratingStyle);
}
/**
@@ -166,7 +166,7 @@ public final class Rating2 {
* @return a new Rating2 instance.
*/
public static @Nullable Rating2 newHeartRating(@NonNull Context context, boolean hasHeart) {
- return ApiLoader.getProvider(context).newHeartRating_Rating2(context, hasHeart);
+ return ApiLoader.getProvider().newHeartRating_Rating2(context, hasHeart);
}
/**
@@ -178,7 +178,7 @@ public final class Rating2 {
* @return a new Rating2 instance.
*/
public static @Nullable Rating2 newThumbRating(@NonNull Context context, boolean thumbIsUp) {
- return ApiLoader.getProvider(context).newThumbRating_Rating2(context, thumbIsUp);
+ return ApiLoader.getProvider().newThumbRating_Rating2(context, thumbIsUp);
}
/**
@@ -196,8 +196,7 @@ public final class Rating2 {
*/
public static @Nullable Rating2 newStarRating(@NonNull Context context,
@StarStyle int starRatingStyle, float starRating) {
- return ApiLoader.getProvider(context).newStarRating_Rating2(
- context, starRatingStyle, starRating);
+ return ApiLoader.getProvider().newStarRating_Rating2(context, starRatingStyle, starRating);
}
/**
@@ -209,7 +208,7 @@ public final class Rating2 {
* @return null if the rating is out of range, a new Rating2 instance otherwise.
*/
public static @Nullable Rating2 newPercentageRating(@NonNull Context context, float percent) {
- return ApiLoader.getProvider(context).newPercentageRating_Rating2(context, percent);
+ return ApiLoader.getProvider().newPercentageRating_Rating2(context, percent);
}
/**
diff --git a/media/java/android/media/SessionToken2.java b/media/java/android/media/SessionToken2.java
index fdfa43abd178..f088be352d6b 100644
--- a/media/java/android/media/SessionToken2.java
+++ b/media/java/android/media/SessionToken2.java
@@ -28,6 +28,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
+ * @hide
* Represents an ongoing {@link MediaSession2} or a {@link MediaSessionService2}.
* If it's representing a session service, it may not be ongoing.
* <p>
@@ -80,7 +81,7 @@ public final class SessionToken2 {
*/
public SessionToken2(@NonNull Context context, @NonNull String packageName,
@NonNull String serviceName, int uid) {
- mProvider = ApiLoader.getProvider(context).createSessionToken2(
+ mProvider = ApiLoader.getProvider().createSessionToken2(
context, this, packageName, serviceName, uid);
}
@@ -150,7 +151,7 @@ public final class SessionToken2 {
* @return
*/
public static SessionToken2 fromBundle(@NonNull Context context, @NonNull Bundle bundle) {
- return ApiLoader.getProvider(context).fromBundle_SessionToken2(context, bundle);
+ return ApiLoader.getProvider().fromBundle_SessionToken2(context, bundle);
}
/**
diff --git a/media/java/android/media/VolumeProvider2.java b/media/java/android/media/VolumeProvider2.java
index 711f51f81013..2d96d096bf3a 100644
--- a/media/java/android/media/VolumeProvider2.java
+++ b/media/java/android/media/VolumeProvider2.java
@@ -26,6 +26,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
+ * @hide
* Handles requests to adjust or set the volume on a session. This is also used
* to push volume updates back to the session. The provider must call
* {@link #setCurrentVolume(int)} each time the volume being provided changes.
@@ -76,7 +77,7 @@ public abstract class VolumeProvider2 {
*/
public VolumeProvider2(@NonNull Context context, @ControlType int controlType,
int maxVolume, int currentVolume) {
- mProvider = ApiLoader.getProvider(context).createVolumeProvider2(
+ mProvider = ApiLoader.getProvider().createVolumeProvider2(
context, this, controlType, maxVolume, currentVolume);
}
diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl
index 963457bedb60..56664a9839c8 100644
--- a/media/java/android/media/session/ISessionManager.aidl
+++ b/media/java/android/media/session/ISessionManager.aidl
@@ -52,12 +52,13 @@ interface ISessionManager {
void setOnMediaKeyListener(in IOnMediaKeyListener listener);
// MediaSession2
- boolean isTrusted(int uid, String packageName);
+ boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid);
boolean createSession2(in Bundle sessionToken);
void destroySession2(in Bundle sessionToken);
- List<Bundle> getSessionTokens(boolean activeSessionOnly, boolean sessionServiceOnly);
+ List<Bundle> getSessionTokens(boolean activeSessionOnly, boolean sessionServiceOnly,
+ String packageName);
void addSessionTokensListener(in ISessionTokensListener listener, int userId,
String packageName);
- void removeSessionTokensListener(in ISessionTokensListener listener);
+ void removeSessionTokensListener(in ISessionTokensListener listener, String packageName);
}
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 051321c84d9a..b7f49988022e 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -342,16 +342,17 @@ public final class MediaSessionManager {
/**
* Returns whether the api
*
- * @param uid uid of the app
* @param packageName packageName
+ * @param pid pid of the app
+ * @param uid uid of the app
* @hide
*/
- public boolean isTrusted(int uid, @NonNull String packageName) {
+ public boolean isTrusted(@NonNull String packageName, int pid, int uid) {
if (packageName == null) {
return false;
}
try {
- return mService.isTrusted(uid, packageName);
+ return mService.isTrusted(packageName, pid, uid);
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
}
@@ -390,6 +391,7 @@ public final class MediaSessionManager {
}
/**
+ * @hide
* Get {@link List} of {@link SessionToken2} whose sessions are active now. This list represents
* active sessions regardless of whether they're {@link MediaSession2} or
* {@link MediaSessionService2}.
@@ -403,7 +405,8 @@ public final class MediaSessionManager {
public List<SessionToken2> getActiveSessionTokens() {
try {
List<Bundle> bundles = mService.getSessionTokens(
- /* activeSessionOnly */ true, /* sessionServiceOnly */ false);
+ /* activeSessionOnly */ true, /* sessionServiceOnly */ false,
+ mContext.getPackageName());
return toTokenList(mContext, bundles);
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
@@ -412,6 +415,7 @@ public final class MediaSessionManager {
}
/**
+ * @hide
* Get {@link List} of {@link SessionToken2} for {@link MediaSessionService2} regardless of their
* activeness. This list represents media apps that support background playback.
* <p>
@@ -424,7 +428,8 @@ public final class MediaSessionManager {
public List<SessionToken2> getSessionServiceTokens() {
try {
List<Bundle> bundles = mService.getSessionTokens(
- /* activeSessionOnly */ false, /* sessionServiceOnly */ true);
+ /* activeSessionOnly */ false, /* sessionServiceOnly */ true,
+ mContext.getPackageName());
return toTokenList(mContext, bundles);
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
@@ -433,6 +438,7 @@ public final class MediaSessionManager {
}
/**
+ * @hide
* Get all {@link SessionToken2}s. This is the combined list of {@link #getActiveSessionTokens()}
* and {@link #getSessionServiceTokens}.
* <p>
@@ -447,7 +453,8 @@ public final class MediaSessionManager {
public List<SessionToken2> getAllSessionTokens() {
try {
List<Bundle> bundles = mService.getSessionTokens(
- /* activeSessionOnly */ false, /* sessionServiceOnly */ false);
+ /* activeSessionOnly */ false, /* sessionServiceOnly */ false,
+ mContext.getPackageName());
return toTokenList(mContext, bundles);
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
@@ -456,6 +463,7 @@ public final class MediaSessionManager {
}
/**
+ * @hide
* Add a listener to be notified when the {@link #getAllSessionTokens()} changes.
* <p>
* This requires the android.Manifest.permission.MEDIA_CONTENT_CONTROL permission be held by the
@@ -508,6 +516,7 @@ public final class MediaSessionManager {
}
/**
+ * @hide
* Stop receiving session token updates on the specified listener.
*
* @param listener The listener to remove.
@@ -521,7 +530,7 @@ public final class MediaSessionManager {
SessionTokensChangedWrapper wrapper = mSessionTokensListener.remove(listener);
if (wrapper != null) {
try {
- mService.removeSessionTokensListener(wrapper.mStub);
+ mService.removeSessionTokensListener(wrapper.mStub, mContext.getPackageName());
} catch (RemoteException e) {
Log.e(TAG, "Error in removeSessionTokensListener.", e);
} finally {
@@ -666,6 +675,7 @@ public final class MediaSessionManager {
}
/**
+ * @hide
* Listens for changes to the {@link #getAllSessionTokens()}. This can be added
* using {@link #addOnActiveSessionsChangedListener}.
*/
diff --git a/media/java/android/media/soundtrigger/ISoundTriggerDetectionService.aidl b/media/java/android/media/soundtrigger/ISoundTriggerDetectionService.aidl
new file mode 100644
index 000000000000..ef4bb01cb46f
--- /dev/null
+++ b/media/java/android/media/soundtrigger/ISoundTriggerDetectionService.aidl
@@ -0,0 +1,35 @@
+/*
+ * 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.media.soundtrigger;
+
+import android.media.soundtrigger.ISoundTriggerDetectionServiceClient;
+import android.hardware.soundtrigger.SoundTrigger;
+import android.os.Bundle;
+import android.os.ParcelUuid;
+
+/**
+ * AIDL for the SoundTriggerDetectionService to run detection operations when triggered.
+ *
+ * {@hide}
+ */
+oneway interface ISoundTriggerDetectionService {
+ void setClient(in ParcelUuid uuid, in Bundle params, in ISoundTriggerDetectionServiceClient client);
+ void removeClient(in ParcelUuid uuid);
+ void onGenericRecognitionEvent(in ParcelUuid uuid, int opId, in SoundTrigger.GenericRecognitionEvent event);
+ void onError(in ParcelUuid uuid, int opId, int status);
+ void onStopOperation(in ParcelUuid uuid, int opId);
+}
diff --git a/core/java/android/hardware/camera2/dispatch/NullDispatcher.java b/media/java/android/media/soundtrigger/ISoundTriggerDetectionServiceClient.aidl
index fada075cba67..230735afaf42 100644
--- a/core/java/android/hardware/camera2/dispatch/NullDispatcher.java
+++ b/media/java/android/media/soundtrigger/ISoundTriggerDetectionServiceClient.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * 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.
@@ -13,26 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.hardware.camera2.dispatch;
-
-import java.lang.reflect.Method;
+package android.media.soundtrigger;
/**
- * Do nothing when dispatching; follows the null object pattern.
+ * AIDL for the callbacks from a ISoundTriggerDetectionService.
+ *
+ * {@hide}
*/
-public class NullDispatcher<T> implements Dispatchable<T> {
- /**
- * Create a dispatcher that does nothing when dispatched to.
- */
- public NullDispatcher() {
- }
-
- /**
- * Do nothing; all parameters are ignored.
- */
- @Override
- public Object dispatch(Method method, Object[] args) {
- return null;
- }
+oneway interface ISoundTriggerDetectionServiceClient {
+ void onOpFinished(int opId);
}
diff --git a/media/java/android/media/soundtrigger/SoundTriggerDetectionService.java b/media/java/android/media/soundtrigger/SoundTriggerDetectionService.java
new file mode 100644
index 000000000000..7381d977b7b5
--- /dev/null
+++ b/media/java/android/media/soundtrigger/SoundTriggerDetectionService.java
@@ -0,0 +1,292 @@
+/*
+ * 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.media.soundtrigger;
+
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+
+import android.annotation.CallSuper;
+import android.annotation.MainThread;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.soundtrigger.SoundTrigger;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.ParcelUuid;
+import android.os.RemoteException;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.UUID;
+
+/**
+ * A service that allows interaction with the actual sound trigger detection on the system.
+ *
+ * <p> Sound trigger detection refers to detectors that match generic sound patterns that are
+ * not voice-based. The voice-based recognition models should utilize the {@link
+ * android.service.voice.VoiceInteractionService} instead. Access to this class needs to be
+ * protected by the {@value android.Manifest.permission.BIND_SOUND_TRIGGER_DETECTION_SERVICE}
+ * permission granted only to the system.
+ *
+ * <p>This service has to be explicitly started by an app, the system does not scan for and start
+ * these services.
+ *
+ * <p>If an operation ({@link #onGenericRecognitionEvent}, {@link #onError},
+ * {@link #onRecognitionPaused}, {@link #onRecognitionResumed}) is triggered the service is
+ * considered as running in the foreground. Once the operation is processed the service should call
+ * {@link #operationFinished(UUID, int)}. If this does not happen in
+ * {@link SoundTriggerManager#getDetectionServiceOperationsTimeout()} milliseconds
+ * {@link #onStopOperation(UUID, Bundle, int)} is called and the service is unbound.
+ *
+ * <p>The total amount of operations per day might be limited.
+ *
+ * @hide
+ */
+@SystemApi
+public abstract class SoundTriggerDetectionService extends Service {
+ private static final String LOG_TAG = SoundTriggerDetectionService.class.getSimpleName();
+
+ private static final boolean DEBUG = false;
+
+ private final Object mLock = new Object();
+
+ /**
+ * Client indexed by model uuid. This is needed for the {@link #operationFinished(UUID, int)}
+ * callbacks.
+ */
+ @GuardedBy("mLock")
+ private final ArrayMap<UUID, ISoundTriggerDetectionServiceClient> mClients =
+ new ArrayMap<>();
+
+ private Handler mHandler;
+
+ /**
+ * @hide
+ */
+ @Override
+ protected final void attachBaseContext(Context base) {
+ super.attachBaseContext(base);
+ mHandler = new Handler(base.getMainLooper());
+ }
+
+ private void setClient(@NonNull UUID uuid, @Nullable Bundle params,
+ @NonNull ISoundTriggerDetectionServiceClient client) {
+ if (DEBUG) Log.i(LOG_TAG, uuid + ": handle setClient");
+
+ synchronized (mLock) {
+ mClients.put(uuid, client);
+ }
+ onConnected(uuid, params);
+ }
+
+ private void removeClient(@NonNull UUID uuid, @Nullable Bundle params) {
+ if (DEBUG) Log.i(LOG_TAG, uuid + ": handle removeClient");
+
+ synchronized (mLock) {
+ mClients.remove(uuid);
+ }
+ onDisconnected(uuid, params);
+ }
+
+ /**
+ * The system has connected to this service for the recognition registered for the model
+ * {@code uuid}.
+ *
+ * <p> This is called before any operations are delivered.
+ *
+ * @param uuid The {@code uuid} of the model the recognitions is registered for
+ * @param params The {@code params} passed when the recognition was started
+ */
+ @MainThread
+ public void onConnected(@NonNull UUID uuid, @Nullable Bundle params) {
+ /* do nothing */
+ }
+
+ /**
+ * The system has disconnected from this service for the recognition registered for the model
+ * {@code uuid}.
+ *
+ * <p>Once this is called {@link #operationFinished} cannot be called anymore for
+ * {@code uuid}.
+ *
+ * <p> {@link #onConnected(UUID, Bundle)} is called before any further operations are delivered.
+ *
+ * @param uuid The {@code uuid} of the model the recognitions is registered for
+ * @param params The {@code params} passed when the recognition was started
+ */
+ @MainThread
+ public void onDisconnected(@NonNull UUID uuid, @Nullable Bundle params) {
+ /* do nothing */
+ }
+
+ /**
+ * A new generic sound trigger event has been detected.
+ *
+ * @param uuid The {@code uuid} of the model the recognition is registered for
+ * @param params The {@code params} passed when the recognition was started
+ * @param opId The id of this operation. Once the operation is done, this service needs to call
+ * {@link #operationFinished(UUID, int)}
+ * @param event The event that has been detected
+ */
+ @MainThread
+ public void onGenericRecognitionEvent(@NonNull UUID uuid, @Nullable Bundle params, int opId,
+ @NonNull SoundTrigger.RecognitionEvent event) {
+ operationFinished(uuid, opId);
+ }
+
+ /**
+ * A error has been detected.
+ *
+ * @param uuid The {@code uuid} of the model the recognition is registered for
+ * @param params The {@code params} passed when the recognition was started
+ * @param opId The id of this operation. Once the operation is done, this service needs to call
+ * {@link #operationFinished(UUID, int)}
+ * @param status The error code detected
+ */
+ @MainThread
+ public void onError(@NonNull UUID uuid, @Nullable Bundle params, int opId, int status) {
+ operationFinished(uuid, opId);
+ }
+
+ /**
+ * An operation took too long and should be stopped.
+ *
+ * @param uuid The {@code uuid} of the model the recognition is registered for
+ * @param params The {@code params} passed when the recognition was started
+ * @param opId The id of the operation that took too long
+ */
+ @MainThread
+ public abstract void onStopOperation(@NonNull UUID uuid, @Nullable Bundle params, int opId);
+
+ /**
+ * Tell that the system that an operation has been fully processed.
+ *
+ * @param uuid The {@code uuid} of the model the recognition is registered for
+ * @param opId The id of the operation that is processed
+ */
+ public final void operationFinished(@Nullable UUID uuid, int opId) {
+ try {
+ ISoundTriggerDetectionServiceClient client;
+ synchronized (mLock) {
+ client = mClients.get(uuid);
+
+ if (client == null) {
+ throw new IllegalStateException("operationFinished called, but no client for "
+ + uuid + ". Was this called after onDisconnected?");
+ }
+ }
+ client.onOpFinished(opId);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * @hide
+ */
+ @Override
+ public final IBinder onBind(Intent intent) {
+ return new ISoundTriggerDetectionService.Stub() {
+ private final Object mBinderLock = new Object();
+
+ /** Cached params bundles indexed by the model uuid */
+ @GuardedBy("mBinderLock")
+ public final ArrayMap<UUID, Bundle> mParams = new ArrayMap<>();
+
+ @Override
+ public void setClient(ParcelUuid puuid, Bundle params,
+ ISoundTriggerDetectionServiceClient client) {
+ UUID uuid = puuid.getUuid();
+ synchronized (mBinderLock) {
+ mParams.put(uuid, params);
+ }
+
+ if (DEBUG) Log.i(LOG_TAG, uuid + ": setClient(" + params + ")");
+ mHandler.sendMessage(obtainMessage(SoundTriggerDetectionService::setClient,
+ SoundTriggerDetectionService.this, uuid, params, client));
+ }
+
+ @Override
+ public void removeClient(ParcelUuid puuid) {
+ UUID uuid = puuid.getUuid();
+ Bundle params;
+ synchronized (mBinderLock) {
+ params = mParams.remove(uuid);
+ }
+
+ if (DEBUG) Log.i(LOG_TAG, uuid + ": removeClient");
+ mHandler.sendMessage(obtainMessage(SoundTriggerDetectionService::removeClient,
+ SoundTriggerDetectionService.this, uuid, params));
+ }
+
+ @Override
+ public void onGenericRecognitionEvent(ParcelUuid puuid, int opId,
+ SoundTrigger.GenericRecognitionEvent event) {
+ UUID uuid = puuid.getUuid();
+ Bundle params;
+ synchronized (mBinderLock) {
+ params = mParams.get(uuid);
+ }
+
+ if (DEBUG) Log.i(LOG_TAG, uuid + "(" + opId + "): onGenericRecognitionEvent");
+ mHandler.sendMessage(
+ obtainMessage(SoundTriggerDetectionService::onGenericRecognitionEvent,
+ SoundTriggerDetectionService.this, uuid, params, opId, event));
+ }
+
+ @Override
+ public void onError(ParcelUuid puuid, int opId, int status) {
+ UUID uuid = puuid.getUuid();
+ Bundle params;
+ synchronized (mBinderLock) {
+ params = mParams.get(uuid);
+ }
+
+ if (DEBUG) Log.i(LOG_TAG, uuid + "(" + opId + "): onError(" + status + ")");
+ mHandler.sendMessage(obtainMessage(SoundTriggerDetectionService::onError,
+ SoundTriggerDetectionService.this, uuid, params, opId, status));
+ }
+
+ @Override
+ public void onStopOperation(ParcelUuid puuid, int opId) {
+ UUID uuid = puuid.getUuid();
+ Bundle params;
+ synchronized (mBinderLock) {
+ params = mParams.get(uuid);
+ }
+
+ if (DEBUG) Log.i(LOG_TAG, uuid + "(" + opId + "): onStopOperation");
+ mHandler.sendMessage(obtainMessage(SoundTriggerDetectionService::onStopOperation,
+ SoundTriggerDetectionService.this, uuid, params, opId));
+ }
+ };
+ }
+
+ @CallSuper
+ @Override
+ public boolean onUnbind(Intent intent) {
+ mClients.clear();
+
+ return false;
+ }
+}
diff --git a/media/java/android/media/soundtrigger/SoundTriggerManager.java b/media/java/android/media/soundtrigger/SoundTriggerManager.java
index 92ffae0fe560..c9ec7526fd6a 100644
--- a/media/java/android/media/soundtrigger/SoundTriggerManager.java
+++ b/media/java/android/media/soundtrigger/SoundTriggerManager.java
@@ -15,26 +15,31 @@
*/
package android.media.soundtrigger;
+
import static android.hardware.soundtrigger.SoundTrigger.STATUS_ERROR;
-import android.app.PendingIntent;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.app.PendingIntent;
+import android.content.ComponentName;
import android.content.Context;
import android.hardware.soundtrigger.SoundTrigger;
-import android.hardware.soundtrigger.SoundTrigger.SoundModel;
import android.hardware.soundtrigger.SoundTrigger.GenericSoundModel;
import android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel;
import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig;
+import android.hardware.soundtrigger.SoundTrigger.SoundModel;
+import android.os.Bundle;
import android.os.Handler;
import android.os.ParcelUuid;
import android.os.RemoteException;
+import android.provider.Settings;
import android.util.Slog;
import com.android.internal.app.ISoundTriggerService;
+import com.android.internal.util.Preconditions;
import java.util.HashMap;
import java.util.UUID;
@@ -276,6 +281,40 @@ public final class SoundTriggerManager {
}
/**
+ * Starts recognition for the given model id. All events from the model will be sent to the
+ * service.
+ *
+ * <p>This only supports generic sound trigger events. For keyphrase events, please use
+ * {@link android.service.voice.VoiceInteractionService}.
+ *
+ * @param soundModelId Id of the sound model
+ * @param params Opaque data sent to each service call of the service as the {@code params}
+ * argument
+ * @param detectionService The component name of the service that should receive the events.
+ * Needs to subclass {@link SoundTriggerDetectionService}
+ * @param config Configures the recognition
+ *
+ * @return {@link SoundTrigger#STATUS_OK} if the recognition could be started, error code
+ * otherwise
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
+ public int startRecognition(@NonNull UUID soundModelId, @Nullable Bundle params,
+ @NonNull ComponentName detectionService, @NonNull RecognitionConfig config) {
+ Preconditions.checkNotNull(soundModelId);
+ Preconditions.checkNotNull(detectionService);
+ Preconditions.checkNotNull(config);
+
+ try {
+ return mSoundTriggerService.startRecognitionForService(new ParcelUuid(soundModelId),
+ params, detectionService, config);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Stops the given model's recognition.
* @hide
*/
@@ -324,4 +363,19 @@ public final class SoundTriggerManager {
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Get the amount of time (in milliseconds) an operation of the
+ * {@link ISoundTriggerDetectionService} is allowed to ask.
+ *
+ * @return The amount of time an sound trigger detection service operation is allowed to last
+ */
+ public int getDetectionServiceOperationsTimeout() {
+ try {
+ return Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT);
+ } catch (Settings.SettingNotFoundException e) {
+ return Integer.MAX_VALUE;
+ }
+ }
}
diff --git a/media/java/android/media/update/ApiLoader.java b/media/java/android/media/update/ApiLoader.java
index cf18bddbb57f..6f82f68304c9 100644
--- a/media/java/android/media/update/ApiLoader.java
+++ b/media/java/android/media/update/ApiLoader.java
@@ -46,11 +46,6 @@ public final class ApiLoader {
private ApiLoader() { }
- @Deprecated
- public static StaticProvider getProvider(Context context) {
- return getProvider();
- }
-
public static StaticProvider getProvider() {
if (sMediaUpdatable != null) return sMediaUpdatable;
@@ -79,7 +74,7 @@ public final class ApiLoader {
ActivityManager.getService().addPackageDependency(ai.packageName);
}
- PathClassLoader classLoader = new PathClassLoader(ai.sourceDir,
+ ClassLoader classLoader = new PathClassLoader(ai.sourceDir,
ai.nativeLibraryDir + File.pathSeparator + System.getProperty("java.library.path"),
ClassLoader.getSystemClassLoader().getParent());
return sMediaUpdatable = (StaticProvider) classLoader.loadClass(UPDATE_CLASS)
diff --git a/media/java/android/media/update/MediaSession2Provider.java b/media/java/android/media/update/MediaSession2Provider.java
index e5ea38667983..0faed9dae80c 100644
--- a/media/java/android/media/update/MediaSession2Provider.java
+++ b/media/java/android/media/update/MediaSession2Provider.java
@@ -21,7 +21,6 @@ import android.media.AudioFocusRequest;
import android.media.MediaItem2;
import android.media.MediaMetadata2;
import android.media.MediaPlayerBase;
-import android.media.MediaPlayerBase.PlayerEventCallback;
import android.media.MediaPlaylistAgent;
import android.media.MediaSession2;
import android.media.MediaSession2.Command;
@@ -29,6 +28,7 @@ import android.media.MediaSession2.CommandButton;
import android.media.MediaSession2.CommandButton.Builder;
import android.media.MediaSession2.CommandGroup;
import android.media.MediaSession2.ControllerInfo;
+import android.media.MediaSession2.OnDataSourceMissingHelper;
import android.media.MediaSession2.SessionCallback;
import android.media.SessionToken2;
import android.media.VolumeProvider2;
@@ -68,6 +68,8 @@ public interface MediaSession2Provider extends TransportControlProvider {
int getPlayerState_impl();
long getPosition_impl();
long getBufferedPosition_impl();
+ void setOnDataSourceMissingHelper_impl(OnDataSourceMissingHelper helper);
+ void clearOnDataSourceMissingHelper_impl();
interface CommandProvider {
int getCommandCode_impl();
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index 3a6714279bb7..4f6763e55ce5 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -449,13 +449,14 @@ static jobject android_media_MediaMetadataRetriever_getFrameAtIndex(
std::vector<sp<IMemory> > frames;
status_t err = retriever->getFrameAtIndex(&frames, frameIndex, numFrames, colorFormat);
if (err != OK || frames.size() == 0) {
- ALOGE("failed to get frames from retriever, err=%d, size=%zu",
- err, frames.size());
+ jniThrowException(env,
+ "java/lang/IllegalStateException", "No frames from retriever");
return NULL;
}
jobject arrayList = env->NewObject(fields.arrayListClazz, fields.arrayListInit);
if (arrayList == NULL) {
- ALOGE("can't create bitmap array list object");
+ jniThrowException(env,
+ "java/lang/IllegalStateException", "Can't create bitmap array");
return NULL;
}
diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp
index 23ef84f6ad90..12d7440e3762 100644
--- a/media/jni/android_mtp_MtpDatabase.cpp
+++ b/media/jni/android_mtp_MtpDatabase.cpp
@@ -39,6 +39,7 @@ extern "C" {
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
#include <jni.h>
+#include <media/stagefright/NuMediaExtractor.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedLocalRef.h>
@@ -788,6 +789,41 @@ static long getLongFromExifEntry(ExifEntry *e) {
return exif_get_long(e->data, o);
}
+static ExifData *getExifFromExtractor(const char *path) {
+ std::unique_ptr<uint8_t[]> exifBuf;
+ ExifData *exifdata = NULL;
+
+ FILE *fp = fopen (path, "rb");
+ if (!fp) {
+ ALOGE("failed to open file");
+ return NULL;
+ }
+
+ sp<NuMediaExtractor> extractor = new NuMediaExtractor();
+ fseek(fp, 0L, SEEK_END);
+ if (extractor->setDataSource(fileno(fp), 0, ftell(fp)) != OK) {
+ ALOGE("failed to setDataSource");
+ fclose(fp);
+ return NULL;
+ }
+
+ off64_t offset;
+ size_t size;
+ if (extractor->getExifOffsetSize(&offset, &size) != OK) {
+ fclose(fp);
+ return NULL;
+ }
+
+ exifBuf.reset(new uint8_t[size]);
+ fseek(fp, offset, SEEK_SET);
+ if (fread(exifBuf.get(), 1, size, fp) == size) {
+ exifdata = exif_data_new_from_data(exifBuf.get(), size);
+ }
+
+ fclose(fp);
+ return exifdata;
+}
+
MtpResponseCode MtpDatabase::getObjectInfo(MtpObjectHandle handle,
MtpObjectInfo& info) {
MtpString path;
@@ -834,7 +870,12 @@ MtpResponseCode MtpDatabase::getObjectInfo(MtpObjectHandle handle,
case MTP_FORMAT_EXIF_JPEG:
case MTP_FORMAT_HEIF:
case MTP_FORMAT_JFIF: {
- ExifData *exifdata = exif_data_new_from_file(path);
+ ExifData *exifdata;
+ if (info.mFormat == MTP_FORMAT_HEIF) {
+ exifdata = getExifFromExtractor(path);
+ } else {
+ exifdata = exif_data_new_from_file(path);
+ }
if (exifdata) {
if ((false)) {
exif_data_foreach_content(exifdata, foreachcontent, NULL);
@@ -892,7 +933,12 @@ void* MtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) {
case MTP_FORMAT_EXIF_JPEG:
case MTP_FORMAT_HEIF:
case MTP_FORMAT_JFIF: {
- ExifData *exifdata = exif_data_new_from_file(path);
+ ExifData *exifdata;
+ if (format == MTP_FORMAT_HEIF) {
+ exifdata = getExifFromExtractor(path);
+ } else {
+ exifdata = exif_data_new_from_file(path);
+ }
if (exifdata) {
if (exifdata->data) {
result = malloc(exifdata->size);
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 589608a8caf8..1a9ce95dc867 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -150,6 +150,13 @@
<!-- Bluetooth settings. Message when connected to a device, except for phone/media audio, showing remote device battery level. [CHAR LIMIT=NONE] -->
<string name="bluetooth_connected_no_headset_no_a2dp_battery_level">Connected (no phone or media), battery <xliff:g id="battery_level_as_percentage">%1$s</xliff:g><xliff:g id="active_device">%2$s</xliff:g></string>
+ <!-- Connected devices settings. Message when Bluetooth is connected and active, showing remote device status and battery level. [CHAR LIMIT=NONE] -->
+ <string name="bluetooth_active_battery_level">Active, <xliff:g id="battery_level_as_percentage">%1$s</xliff:g> battery</string>
+ <!-- Connected devices settings. Message when Bluetooth is connected but not in use, showing remote device battery level. [CHAR LIMIT=NONE] -->
+ <string name="bluetooth_battery_level"><xliff:g id="battery_level_as_percentage">%1$s</xliff:g> battery</string>
+ <!-- Connected devices settings. Message when Bluetooth is connected and active but no battery information, showing remote device status. [CHAR LIMIT=NONE] -->
+ <string name="bluetooth_active_no_battery_level">Active</string>
+
<!-- Bluetooth settings. The user-visible string that is used whenever referring to the A2DP profile. -->
<string name="bluetooth_profile_a2dp">Media audio</string>
<!-- Bluetooth settings. The user-visible string that is used whenever referring to the headset or handsfree profile. -->
@@ -1093,4 +1100,7 @@
<string name="zen_mode_duration_settings_title">Duration</string>
<!-- Do not disturb: Duration option to always prompt for the duration of dnd -->
<string name="zen_mode_duration_always_prompt_title">Ask every time</string>
+
+ <!-- time label for event have that happened very recently [CHAR LIMIT=60] -->
+ <string name="time_unit_just_now">Just now</string>
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java b/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java
index 8e29e50fc848..d39ec4b43151 100644
--- a/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java
@@ -15,6 +15,9 @@
*/
package com.android.settingslib;
+import static android.text.InputType.TYPE_CLASS_TEXT;
+import static android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
+
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
@@ -80,6 +83,7 @@ public class CustomEditTextPreference extends EditTextPreference {
protected void onBindDialogView(View view) {
final EditText editText = view.findViewById(android.R.id.edit);
if (editText != null) {
+ editText.setInputType(TYPE_CLASS_TEXT | TYPE_TEXT_FLAG_CAP_SENTENCES);
editText.requestFocus();
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 3a0ae9f532bb..093b1bd2b8f8 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -16,6 +16,7 @@
package com.android.settingslib.applications;
+import android.annotation.IntDef;
import android.app.ActivityManager;
import android.app.AppGlobals;
import android.app.Application;
@@ -59,6 +60,8 @@ import com.android.internal.util.ArrayUtils;
import java.io.File;
import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.text.Collator;
import java.text.Normalizer;
import java.text.Normalizer.Form;
@@ -135,6 +138,38 @@ public class ApplicationsState {
final BackgroundHandler mBackgroundHandler;
final MainHandler mMainHandler = new MainHandler(Looper.getMainLooper());
+ /** Requests that the home app is loaded. */
+ public static final int FLAG_SESSION_REQUEST_HOME_APP = 1 << 0;
+
+ /** Requests that icons are loaded. */
+ public static final int FLAG_SESSION_REQUEST_ICONS = 1 << 1;
+
+ /** Requests that sizes are loaded. */
+ public static final int FLAG_SESSION_REQUEST_SIZES = 1 << 2;
+
+ /** Requests that launcher intents are resolved. */
+ public static final int FLAG_SESSION_REQUEST_LAUNCHER = 1 << 3;
+
+ /** Requests that leanback launcher intents are resolved. */
+ public static final int FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER = 1 << 4;
+
+ /**
+ * Flags to configure the session to request various types of info.
+ */
+ @IntDef(prefix = { "FLAG_SESSION_" }, value = {
+ FLAG_SESSION_REQUEST_HOME_APP,
+ FLAG_SESSION_REQUEST_ICONS,
+ FLAG_SESSION_REQUEST_SIZES,
+ FLAG_SESSION_REQUEST_LAUNCHER,
+ FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SessionFlags {}
+
+ public static final @SessionFlags int DEFAULT_SESSION_FLAGS =
+ FLAG_SESSION_REQUEST_HOME_APP | FLAG_SESSION_REQUEST_ICONS |
+ FLAG_SESSION_REQUEST_SIZES | FLAG_SESSION_REQUEST_LAUNCHER;
+
private ApplicationsState(Application app) {
mContext = app;
mPm = mContext.getPackageManager();
@@ -265,7 +300,8 @@ public class ApplicationsState {
}
}
- private void clearEntries() {
+ @VisibleForTesting
+ void clearEntries() {
for (int i = 0; i < mEntriesMap.size(); i++) {
mEntriesMap.valueAt(i).clear();
}
@@ -346,7 +382,7 @@ public class ApplicationsState {
if (DEBUG_LOCKING) Log.v(TAG, "requestSize about to acquire lock...");
synchronized (mEntriesMap) {
AppEntry entry = mEntriesMap.get(userId).get(packageName);
- if (entry != null && (entry.info.flags & ApplicationInfo.FLAG_INSTALLED) != 0) {
+ if (entry != null && hasFlag(entry.info.flags, ApplicationInfo.FLAG_INSTALLED)) {
mBackgroundHandler.post(
() -> {
try {
@@ -595,6 +631,7 @@ public class ApplicationsState {
}
public class Session implements LifecycleObserver {
+
final Callbacks mCallbacks;
boolean mResumed;
@@ -609,6 +646,7 @@ public class ApplicationsState {
boolean mRebuildForeground;
private final boolean mHasLifecycle;
+ @SessionFlags private int mFlags = DEFAULT_SESSION_FLAGS;
Session(Callbacks callbacks, Lifecycle lifecycle) {
mCallbacks = callbacks;
@@ -620,6 +658,14 @@ public class ApplicationsState {
}
}
+ public @SessionFlags int getSessionFlags() {
+ return mFlags;
+ }
+
+ public void setSessionFlags(@SessionFlags int flags) {
+ mFlags = flags;
+ }
+
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
if (DEBUG_LOCKING) Log.v(TAG, "resume about to acquire lock...");
@@ -833,10 +879,11 @@ public class ApplicationsState {
private class BackgroundHandler extends Handler {
static final int MSG_REBUILD_LIST = 1;
static final int MSG_LOAD_ENTRIES = 2;
- static final int MSG_LOAD_ICONS = 3;
- static final int MSG_LOAD_SIZES = 4;
- static final int MSG_LOAD_LAUNCHER = 5;
- static final int MSG_LOAD_HOME_APP = 6;
+ static final int MSG_LOAD_HOME_APP = 3;
+ static final int MSG_LOAD_LAUNCHER = 4;
+ static final int MSG_LOAD_LEANBACK_LAUNCHER = 5;
+ static final int MSG_LOAD_ICONS = 6;
+ static final int MSG_LOAD_SIZES = 7;
boolean mRunning;
@@ -860,6 +907,8 @@ public class ApplicationsState {
}
}
+ int flags = getCombinedSessionFlags(mSessions);
+
switch (msg.what) {
case MSG_REBUILD_LIST: {
} break;
@@ -889,8 +938,8 @@ public class ApplicationsState {
// happens because of the way we generate the list in
// doResumeIfNeededLocked.
AppEntry entry = mEntriesMap.get(0).get(info.packageName);
- if (entry != null &&
- (entry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) {
+ if (entry != null && !hasFlag(entry.info.flags,
+ ApplicationInfo.FLAG_INSTALLED)) {
mEntriesMap.get(0).remove(info.packageName);
mAppEntries.remove(entry);
}
@@ -909,166 +958,206 @@ public class ApplicationsState {
}
} break;
case MSG_LOAD_HOME_APP: {
- final List<ResolveInfo> homeActivities = new ArrayList<>();
- mPm.getHomeActivities(homeActivities);
- synchronized (mEntriesMap) {
- final int entryCount = mEntriesMap.size();
- for (int i = 0; i < entryCount; i++) {
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_HOME_APP acquired lock");
- final HashMap<String, AppEntry> userEntries = mEntriesMap.valueAt(i);
- for (ResolveInfo activity : homeActivities) {
- String packageName = activity.activityInfo.packageName;
- AppEntry entry = userEntries.get(packageName);
- if (entry != null) {
- entry.isHomeApp = true;
+ if (hasFlag(flags, FLAG_SESSION_REQUEST_HOME_APP)) {
+ final List<ResolveInfo> homeActivities = new ArrayList<>();
+ mPm.getHomeActivities(homeActivities);
+ synchronized (mEntriesMap) {
+ final int entryCount = mEntriesMap.size();
+ for (int i = 0; i < entryCount; i++) {
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_HOME_APP acquired lock");
+ final HashMap<String, AppEntry> userEntries = mEntriesMap.valueAt(
+ i);
+ for (ResolveInfo activity : homeActivities) {
+ String packageName = activity.activityInfo.packageName;
+ AppEntry entry = userEntries.get(packageName);
+ if (entry != null) {
+ entry.isHomeApp = true;
+ }
}
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_HOME_APP releasing lock");
}
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_HOME_APP releasing lock");
}
}
sendEmptyMessage(MSG_LOAD_LAUNCHER);
- }
- break;
- case MSG_LOAD_LAUNCHER: {
- Intent launchIntent = new Intent(Intent.ACTION_MAIN, null)
- .addCategory(Intent.CATEGORY_LAUNCHER);
- for (int i = 0; i < mEntriesMap.size(); i++) {
- int userId = mEntriesMap.keyAt(i);
- // If we do not specify MATCH_DIRECT_BOOT_AWARE or
- // MATCH_DIRECT_BOOT_UNAWARE, system will derive and update the flags
- // according to the user's lock state. When the user is locked, components
- // with ComponentInfo#directBootAware == false will be filtered. We should
- // explicitly include both direct boot aware and unaware components here.
- List<ResolveInfo> intents = mPm.queryIntentActivitiesAsUser(
- launchIntent,
- PackageManager.MATCH_DISABLED_COMPONENTS
- | PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
- userId
- );
- synchronized (mEntriesMap) {
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER acquired lock");
- HashMap<String, AppEntry> userEntries = mEntriesMap.valueAt(i);
- final int N = intents.size();
- for (int j = 0; j < N; j++) {
- String packageName = intents.get(j).activityInfo.packageName;
- AppEntry entry = userEntries.get(packageName);
- if (entry != null) {
- entry.hasLauncherEntry = true;
- } else {
- Log.w(TAG, "Cannot find pkg: " + packageName
- + " on user " + userId);
+ } break;
+ case MSG_LOAD_LAUNCHER:
+ case MSG_LOAD_LEANBACK_LAUNCHER: {
+ if ((msg.what == MSG_LOAD_LAUNCHER &&
+ hasFlag(flags, FLAG_SESSION_REQUEST_LAUNCHER))
+ || (msg.what == MSG_LOAD_LEANBACK_LAUNCHER &&
+ hasFlag(flags, FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER))) {
+
+ Intent launchIntent = new Intent(Intent.ACTION_MAIN, null);
+ launchIntent.addCategory(msg.what == MSG_LOAD_LAUNCHER
+ ? Intent.CATEGORY_LAUNCHER : Intent.CATEGORY_LEANBACK_LAUNCHER);
+ for (int i = 0; i < mEntriesMap.size(); i++) {
+ int userId = mEntriesMap.keyAt(i);
+ // If we do not specify MATCH_DIRECT_BOOT_AWARE or
+ // MATCH_DIRECT_BOOT_UNAWARE, system will derive and update the flags
+ // according to the user's lock state. When the user is locked,
+ // components
+ // with ComponentInfo#directBootAware == false will be filtered. We should
+ // explicitly include both direct boot aware and unaware components here.
+ List<ResolveInfo> intents = mPm.queryIntentActivitiesAsUser(
+ launchIntent,
+ PackageManager.MATCH_DISABLED_COMPONENTS
+ | PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+ userId
+ );
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER acquired lock");
+ HashMap<String, AppEntry> userEntries = mEntriesMap.valueAt(i);
+ final int N = intents.size();
+ for (int j = 0; j < N; j++) {
+ ResolveInfo resolveInfo = intents.get(j);
+ String packageName = resolveInfo.activityInfo.packageName;
+ AppEntry entry = userEntries.get(packageName);
+ if (entry != null) {
+ entry.hasLauncherEntry = true;
+ entry.launcherEntryEnabled |=
+ resolveInfo.activityInfo.enabled;
+ } else {
+ Log.w(TAG, "Cannot find pkg: " + packageName
+ + " on user " + userId);
+ }
}
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER releasing lock");
}
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER releasing lock");
}
- }
- if (!mMainHandler.hasMessages(MainHandler.MSG_LAUNCHER_INFO_CHANGED)) {
- mMainHandler.sendEmptyMessage(MainHandler.MSG_LAUNCHER_INFO_CHANGED);
+ if (!mMainHandler.hasMessages(MainHandler.MSG_LAUNCHER_INFO_CHANGED)) {
+ mMainHandler.sendEmptyMessage(MainHandler.MSG_LAUNCHER_INFO_CHANGED);
+ }
+ }
+ if (msg.what == MSG_LOAD_LAUNCHER) {
+ sendEmptyMessage(MSG_LOAD_LEANBACK_LAUNCHER);
+ } else {
+ sendEmptyMessage(MSG_LOAD_ICONS);
}
- sendEmptyMessage(MSG_LOAD_ICONS);
} break;
case MSG_LOAD_ICONS: {
- int numDone = 0;
- synchronized (mEntriesMap) {
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ICONS acquired lock");
- for (int i=0; i<mAppEntries.size() && numDone<2; i++) {
- AppEntry entry = mAppEntries.get(i);
- if (entry.icon == null || !entry.mounted) {
- synchronized (entry) {
- if (entry.ensureIconLocked(mContext, mDrawableFactory)) {
- if (!mRunning) {
- mRunning = true;
- Message m = mMainHandler.obtainMessage(
- MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
- mMainHandler.sendMessage(m);
+ if (hasFlag(flags, FLAG_SESSION_REQUEST_ICONS)) {
+ int numDone = 0;
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ICONS acquired lock");
+ for (int i = 0; i < mAppEntries.size() && numDone < 2; i++) {
+ AppEntry entry = mAppEntries.get(i);
+ if (entry.icon == null || !entry.mounted) {
+ synchronized (entry) {
+ if (entry.ensureIconLocked(mContext, mDrawableFactory)) {
+ if (!mRunning) {
+ mRunning = true;
+ Message m = mMainHandler.obtainMessage(
+ MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
+ mMainHandler.sendMessage(m);
+ }
+ numDone++;
}
- numDone++;
}
}
}
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ICONS releasing lock");
}
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ICONS releasing lock");
- }
- if (numDone > 0) {
- if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_ICON_CHANGED)) {
- mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_ICON_CHANGED);
+ if (numDone > 0) {
+ if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_ICON_CHANGED)) {
+ mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_ICON_CHANGED);
+ }
+ }
+ if (numDone >= 2) {
+ sendEmptyMessage(MSG_LOAD_ICONS);
+ break;
}
}
- if (numDone >= 2) {
- sendEmptyMessage(MSG_LOAD_ICONS);
- } else {
- sendEmptyMessage(MSG_LOAD_SIZES);
- }
+ sendEmptyMessage(MSG_LOAD_SIZES);
} break;
case MSG_LOAD_SIZES: {
- synchronized (mEntriesMap) {
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES acquired lock");
- if (mCurComputingSizePkg != null) {
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES releasing: currently computing");
- return;
- }
+ if (hasFlag(flags, FLAG_SESSION_REQUEST_SIZES)) {
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES acquired lock");
+ if (mCurComputingSizePkg != null) {
+ if (DEBUG_LOCKING) Log.v(TAG,
+ "MSG_LOAD_SIZES releasing: currently computing");
+ return;
+ }
- long now = SystemClock.uptimeMillis();
- for (int i=0; i<mAppEntries.size(); i++) {
- AppEntry entry = mAppEntries.get(i);
- if ((entry.info.flags & ApplicationInfo.FLAG_INSTALLED) != 0
- && (entry.size == SIZE_UNKNOWN || entry.sizeStale)) {
- if (entry.sizeLoadStart == 0 ||
- (entry.sizeLoadStart < (now-20*1000))) {
- if (!mRunning) {
- mRunning = true;
- Message m = mMainHandler.obtainMessage(
- MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
- mMainHandler.sendMessage(m);
- }
- entry.sizeLoadStart = now;
- mCurComputingSizeUuid = entry.info.storageUuid;
- mCurComputingSizePkg = entry.info.packageName;
- mCurComputingSizeUserId = UserHandle.getUserId(entry.info.uid);
-
- mBackgroundHandler.post(() -> {
- try {
- final StorageStats stats = mStats.queryStatsForPackage(
- mCurComputingSizeUuid, mCurComputingSizePkg,
- UserHandle.of(mCurComputingSizeUserId));
- final PackageStats legacy = new PackageStats(
- mCurComputingSizePkg, mCurComputingSizeUserId);
- legacy.codeSize = stats.getCodeBytes();
- legacy.dataSize = stats.getDataBytes();
- legacy.cacheSize = stats.getCacheBytes();
- try {
- mStatsObserver.onGetStatsCompleted(legacy, true);
- } catch (RemoteException ignored) {
- }
- } catch (NameNotFoundException | IOException e) {
- Log.w(TAG, "Failed to query stats: " + e);
+ long now = SystemClock.uptimeMillis();
+ for (int i = 0; i < mAppEntries.size(); i++) {
+ AppEntry entry = mAppEntries.get(i);
+ if (hasFlag(entry.info.flags, ApplicationInfo.FLAG_INSTALLED)
+ && (entry.size == SIZE_UNKNOWN || entry.sizeStale)) {
+ if (entry.sizeLoadStart == 0 ||
+ (entry.sizeLoadStart < (now - 20 * 1000))) {
+ if (!mRunning) {
+ mRunning = true;
+ Message m = mMainHandler.obtainMessage(
+ MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
+ mMainHandler.sendMessage(m);
+ }
+ entry.sizeLoadStart = now;
+ mCurComputingSizeUuid = entry.info.storageUuid;
+ mCurComputingSizePkg = entry.info.packageName;
+ mCurComputingSizeUserId = UserHandle.getUserId(
+ entry.info.uid);
+
+ mBackgroundHandler.post(() -> {
try {
- mStatsObserver.onGetStatsCompleted(null, false);
- } catch (RemoteException ignored) {
+ final StorageStats stats =
+ mStats.queryStatsForPackage(
+ mCurComputingSizeUuid,
+ mCurComputingSizePkg,
+ UserHandle.of(
+ mCurComputingSizeUserId));
+ final PackageStats legacy = new PackageStats(
+ mCurComputingSizePkg,
+ mCurComputingSizeUserId);
+ legacy.codeSize = stats.getCodeBytes();
+ legacy.dataSize = stats.getDataBytes();
+ legacy.cacheSize = stats.getCacheBytes();
+ try {
+ mStatsObserver.onGetStatsCompleted(legacy,
+ true);
+ } catch (RemoteException ignored) {
+ }
+ } catch (NameNotFoundException | IOException e) {
+ Log.w(TAG, "Failed to query stats: " + e);
+ try {
+ mStatsObserver.onGetStatsCompleted(null, false);
+ } catch (RemoteException ignored) {
+ }
}
- }
- });
+ });
+ }
+ if (DEBUG_LOCKING) Log.v(TAG,
+ "MSG_LOAD_SIZES releasing: now computing");
+ return;
}
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES releasing: now computing");
- return;
}
+ if (!mMainHandler.hasMessages(MainHandler.MSG_ALL_SIZES_COMPUTED)) {
+ mMainHandler.sendEmptyMessage(MainHandler.MSG_ALL_SIZES_COMPUTED);
+ mRunning = false;
+ Message m = mMainHandler.obtainMessage(
+ MainHandler.MSG_RUNNING_STATE_CHANGED, 0);
+ mMainHandler.sendMessage(m);
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES releasing lock");
}
- if (!mMainHandler.hasMessages(MainHandler.MSG_ALL_SIZES_COMPUTED)) {
- mMainHandler.sendEmptyMessage(MainHandler.MSG_ALL_SIZES_COMPUTED);
- mRunning = false;
- Message m = mMainHandler.obtainMessage(
- MainHandler.MSG_RUNNING_STATE_CHANGED, 0);
- mMainHandler.sendMessage(m);
- }
- if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES releasing lock");
}
} break;
}
}
+ private @SessionFlags int getCombinedSessionFlags(List<Session> sessions) {
+ synchronized (mEntriesMap) {
+ int flags = 0;
+ for (Session session : sessions) {
+ flags |= session.mFlags;
+ }
+ return flags;
+ }
+ }
+
final IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() {
public void onGetStatsCompleted(PackageStats stats, boolean succeeded) {
if (!succeeded) {
@@ -1257,6 +1346,11 @@ public class ApplicationsState {
public boolean hasLauncherEntry;
/**
+ * Whether the component that has a launcher intent filter is enabled.
+ */
+ public boolean launcherEntryEnabled;
+
+ /**
* Whether or not it's a Home app.
*/
public boolean isHomeApp;
@@ -1283,7 +1377,7 @@ public class ApplicationsState {
// A location where extra info can be placed to be used by custom filters.
public Object extraInfo;
- @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
+ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
public AppEntry(Context context, ApplicationInfo info, long id) {
apkFile = new File(info.sourceDir);
this.id = id;
@@ -1336,6 +1430,10 @@ public class ApplicationsState {
}
}
+ private static boolean hasFlag(int flags, int flag) {
+ return (flags & flag) != 0;
+ }
+
/**
* Compare by label, then package name, then uid.
*/
@@ -1449,13 +1547,13 @@ public class ApplicationsState {
public boolean filterApp(AppEntry entry) {
if (AppUtils.isInstant(entry.info)) {
return false;
- } else if ((entry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
+ } else if (hasFlag(entry.info.flags, ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) {
return true;
- } else if ((entry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ } else if (!hasFlag(entry.info.flags, ApplicationInfo.FLAG_SYSTEM)) {
return true;
} else if (entry.hasLauncherEntry) {
return true;
- } else if ((entry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0 && entry.isHomeApp) {
+ } else if (hasFlag(entry.info.flags, ApplicationInfo.FLAG_SYSTEM) && entry.isHomeApp) {
return true;
}
return false;
@@ -1486,9 +1584,9 @@ public class ApplicationsState {
@Override
public boolean filterApp(AppEntry entry) {
- if ((entry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
+ if (hasFlag(entry.info.flags, ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) {
return true;
- } else if ((entry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ } else if (!hasFlag(entry.info.flags, ApplicationInfo.FLAG_SYSTEM)) {
return true;
}
return false;
@@ -1547,7 +1645,7 @@ public class ApplicationsState {
@Override
public boolean filterApp(AppEntry entry) {
return !AppUtils.isInstant(entry.info)
- && (entry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0;
+ && hasFlag(entry.info.privateFlags, ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS);
}
};
@@ -1589,7 +1687,7 @@ public class ApplicationsState {
// TODO: Update for the new game category.
boolean isGame;
synchronized (info.info) {
- isGame = ((info.info.flags & ApplicationInfo.FLAG_IS_GAME) != 0)
+ isGame = hasFlag(info.info.flags, ApplicationInfo.FLAG_IS_GAME)
|| info.info.category == ApplicationInfo.CATEGORY_GAME;
}
return isGame;
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
index 784c714f0b01..b74b2cd03a52 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
@@ -21,6 +21,7 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
+import android.bluetooth.BluetoothHearingAid;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -115,6 +116,8 @@ public class BluetoothEventManager {
new ActiveDeviceChangedHandler());
addHandler(BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED,
new ActiveDeviceChangedHandler());
+ addHandler(BluetoothHearingAid.ACTION_ACTIVE_DEVICE_CHANGED,
+ new ActiveDeviceChangedHandler());
mContext.registerReceiver(mBroadcastReceiver, mAdapterIntentFilter, null, mReceiverHandler);
mContext.registerReceiver(mProfileBroadcastReceiver, mProfileIntentFilter, null, mReceiverHandler);
@@ -434,6 +437,8 @@ public class BluetoothEventManager {
bluetoothProfile = BluetoothProfile.A2DP;
} else if (Objects.equals(action, BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED)) {
bluetoothProfile = BluetoothProfile.HEADSET;
+ } else if (Objects.equals(action, BluetoothHearingAid.ACTION_ACTIVE_DEVICE_CHANGED)) {
+ bluetoothProfile = BluetoothProfile.HEARING_AID;
} else {
Log.w(TAG, "ActiveDeviceChangedHandler: unknown action " + action);
return;
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index ec25d2ddba62..6c068ff1ab4c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -109,6 +109,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
// Active device state
private boolean mIsActiveDeviceA2dp = false;
private boolean mIsActiveDeviceHeadset = false;
+ private boolean mIsActiveDeviceHearingAid = false;
/**
* Describes the current device and profile for logging.
@@ -436,6 +437,13 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
result = true;
}
}
+ HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile();
+ if ((hearingAidProfile != null) && isConnectedProfile(hearingAidProfile)) {
+ if (hearingAidProfile.setActiveDevice(getDevice())) {
+ Log.i(TAG, "OnPreferenceClickListener: Hearing Aid active device=" + this);
+ result = true;
+ }
+ }
return result;
}
@@ -501,6 +509,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
changed = (mIsActiveDeviceHeadset != isActive);
mIsActiveDeviceHeadset = isActive;
break;
+ case BluetoothProfile.HEARING_AID:
+ changed = (mIsActiveDeviceHearingAid != isActive);
+ mIsActiveDeviceHearingAid = isActive;
+ break;
default:
Log.w(TAG, "onActiveDeviceChanged: unknown profile " + bluetoothProfile +
" isActive " + isActive);
@@ -524,6 +536,8 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
return mIsActiveDeviceA2dp;
case BluetoothProfile.HEADSET:
return mIsActiveDeviceHeadset;
+ case BluetoothProfile.HEARING_AID:
+ return mIsActiveDeviceHearingAid;
default:
Log.w(TAG, "getActiveDevice: unknown profile " + bluetoothProfile);
break;
@@ -615,6 +629,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
if (headsetProfile != null) {
mIsActiveDeviceHeadset = mDevice.equals(headsetProfile.getActiveDevice());
}
+ HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile();
+ if (hearingAidProfile != null) {
+ mIsActiveDeviceHearingAid = hearingAidProfile.isActiveDevice(mDevice);
+ }
}
/**
@@ -945,6 +963,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
boolean profileConnected = false; // at least one profile is connected
boolean a2dpNotConnected = false; // A2DP is preferred but not connected
boolean hfpNotConnected = false; // HFP is preferred but not connected
+ boolean hearingAidNotConnected = false; // Hearing Aid is preferred but not connected
for (LocalBluetoothProfile profile : getProfiles()) {
int connectionStatus = getProfileConnectionState(profile);
@@ -966,6 +985,8 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
} else if ((profile instanceof HeadsetProfile) ||
(profile instanceof HfpClientProfile)) {
hfpNotConnected = true;
+ } else if (profile instanceof HearingAidProfile) {
+ hearingAidNotConnected = true;
}
}
break;
@@ -998,6 +1019,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
activeDeviceString = activeDeviceStringsArray[3]; // Active for Phone only
}
}
+ if (!hearingAidNotConnected && mIsActiveDeviceHearingAid) {
+ activeDeviceString = activeDeviceStringsArray[1];
+ return mContext.getString(R.string.bluetooth_connected, activeDeviceString);
+ }
if (profileConnected) {
if (a2dpNotConnected && hfpNotConnected) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
index 8f9e4635bb4b..920500f97223 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
@@ -134,6 +134,17 @@ public class HearingAidProfile implements LocalBluetoothProfile {
return mService.getConnectionState(device);
}
+ public boolean setActiveDevice(BluetoothDevice device) {
+ if (mService == null) return false;
+ mService.setActiveDevice(device);
+ return true;
+ }
+
+ public boolean isActiveDevice(BluetoothDevice device) {
+ if (mService == null) return false;
+ return mService.isActiveDevice(device);
+ }
+
public boolean isPreferred(BluetoothDevice device) {
if (mService == null) return false;
return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF;
diff --git a/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java
index 3c02f6a234f4..2d3dfe4511e0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java
@@ -59,7 +59,8 @@ public abstract class AbstractEnableAdbPreferenceController extends
@Override
public boolean isAvailable() {
- return mContext.getSystemService(UserManager.class).isAdminUser();
+ final UserManager um = mContext.getSystemService(UserManager.class);
+ return um != null && (um.isAdminUser() || um.isDemoUser());
}
@Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java b/packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java
index 85bf4e83bd55..d21da4e1cd0e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java
+++ b/packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java
@@ -45,8 +45,7 @@ public class DevelopmentSettingsEnabler {
Build.TYPE.equals("eng") ? 1 : 0) != 0;
final boolean hasRestriction = um.hasUserRestriction(
UserManager.DISALLOW_DEBUGGING_FEATURES);
- final boolean isAdmin = um.isAdminUser();
-
- return isAdmin && !hasRestriction && settingEnabled;
+ final boolean isAdminOrDemo = um.isAdminUser() || um.isDemoUser();
+ return isAdminOrDemo && !hasRestriction && settingEnabled;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java
new file mode 100644
index 000000000000..e2c7747e3231
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.fuelgauge;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.PowerManager;
+import android.provider.Settings.Secure;
+import android.util.Log;
+
+/**
+ * Utilities related to battery saver.
+ */
+public class BatterySaverUtils {
+ private static final String TAG = "BatterySaverUtils";
+
+ private BatterySaverUtils() {
+ }
+
+ private static final boolean DEBUG = false;
+
+ // Broadcast action for SystemUI to show the battery saver confirmation dialog.
+ public static final String ACTION_SHOW_START_SAVER_CONFIRMATION = "PNW.startSaverConfirmation";
+
+ /**
+ * Enable / disable battery saver by user request.
+ * - If it's the first time and needFirstTimeWarning, show the first time dialog.
+ * - If it's 4th time through 8th time, show the schedule suggestion notification.
+ *
+ * @param enable true to disable battery saver.
+ *
+ * @return true if the request succeeded.
+ */
+ public static synchronized boolean setPowerSaveMode(Context context,
+ boolean enable, boolean needFirstTimeWarning) {
+ if (DEBUG) {
+ Log.d(TAG, "Battery saver turning " + (enable ? "ON" : "OFF"));
+ }
+ final ContentResolver cr = context.getContentResolver();
+
+ if (enable && needFirstTimeWarning && maybeShowBatterySaverConfirmation(context)) {
+ return false;
+ }
+ if (enable && !needFirstTimeWarning) {
+ setBatterySaverConfirmationAcknowledged(context);
+ }
+
+ if (context.getSystemService(PowerManager.class).setPowerSaveMode(enable)) {
+ if (enable) {
+ Secure.putInt(cr, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT,
+ Secure.getInt(cr, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, 0) + 1);
+
+ // TODO If enabling, and the count is between 4 and 8 (inclusive), then
+ // show the "battery saver schedule suggestion" notification.
+ }
+
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean maybeShowBatterySaverConfirmation(Context context) {
+ if (Secure.getInt(context.getContentResolver(),
+ Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 0) != 0) {
+ return false; // Already shown.
+ }
+ final Intent i = new Intent(ACTION_SHOW_START_SAVER_CONFIRMATION);
+ context.sendBroadcast(i);
+
+ return true;
+ }
+
+ private static void setBatterySaverConfirmationAcknowledged(Context context) {
+ Secure.putInt(context.getContentResolver(), Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 1);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
new file mode 100644
index 000000000000..cc69e0ec2831
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
@@ -0,0 +1,367 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settingslib.users;
+
+import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.UserInfo;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+
+import com.android.internal.util.UserIcons;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Helper class for managing users, providing methods for removing, adding and switching users.
+ */
+public final class UserManagerHelper {
+ private static final String TAG = "UserManagerHelper";
+ private final Context mContext;
+ private final UserManager mUserManager;
+ private OnUsersUpdateListener mUpdateListener;
+ private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mUpdateListener.onUsersUpdate();
+ }
+ };
+
+ public UserManagerHelper(Context context) {
+ mContext = context;
+ mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ }
+
+ /**
+ * Registers a listener for updates to all users - removing, adding users or changing user info.
+ *
+ * @param listener Instance of {@link OnUsersUpdateListener}.
+ */
+ public void registerOnUsersUpdateListener(OnUsersUpdateListener listener) {
+ mUpdateListener = listener;
+ registerReceiver();
+ }
+
+ /**
+ * Unregisters listener by unregistering {@code BroadcastReceiver}.
+ */
+ public void unregisterOnUsersUpdateListener() {
+ unregisterReceiver();
+ }
+
+ /**
+ * Gets {@link UserInfo} for the current user.
+ *
+ * @return {@link UserInfo} for the current user.
+ */
+ public UserInfo getCurrentUserInfo() {
+ return mUserManager.getUserInfo(UserHandle.myUserId());
+ }
+
+ /**
+ * Gets all the other users on the system that are not the current user.
+ *
+ * @return List of {@code UserInfo} for each user that is not the current user.
+ */
+ public List<UserInfo> getAllUsersExcludesCurrentUser() {
+ List<UserInfo> others = mUserManager.getUsers(true);
+
+ for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) {
+ UserInfo userInfo = iterator.next();
+ if (userInfo.id == UserHandle.myUserId()) {
+ // Remove current user from the list.
+ iterator.remove();
+ }
+ }
+ return others;
+ }
+
+ // User information accessors
+
+ /**
+ * Checks whether the user is system user (admin).
+ *
+ * @param userInfo User to check against system user.
+ * @return {@code true} if system user, {@code false} otherwise.
+ */
+ public boolean userIsSystemUser(UserInfo userInfo) {
+ return userInfo.id == UserHandle.USER_SYSTEM;
+ }
+
+ /**
+ * Returns whether this user can be removed from the system.
+ *
+ * @param userInfo User to be removed
+ * @return {@code true} if they can be removed, {@code false} otherwise.
+ */
+ public boolean userCanBeRemoved(UserInfo userInfo) {
+ return !userIsSystemUser(userInfo);
+ }
+
+ /**
+ * Checks whether passed in user is the user that's currently logged in.
+ *
+ * @param userInfo User to check.
+ * @return {@code true} if current user, {@code false} otherwise.
+ */
+ public boolean userIsCurrentUser(UserInfo userInfo) {
+ return getCurrentUserInfo().id == userInfo.id;
+ }
+
+ // Current user information accessors
+
+ /**
+ * Checks if the current user is a demo user.
+ */
+ public boolean isDemoUser() {
+ return mUserManager.isDemoUser();
+ }
+
+ /**
+ * Checks if the current user is a guest user.
+ */
+ public boolean isGuestUser() {
+ return mUserManager.isGuestUser();
+ }
+
+ /**
+ * Checks if the current user is the system user (User 0).
+ */
+ public boolean isSystemUser() {
+ return mUserManager.isSystemUser();
+ }
+
+ // Current user restriction accessors
+
+ /**
+ * Return whether the current user has a restriction.
+ *
+ * @param restriction Restriction to check. Should be a UserManager.* restriction.
+ * @return Whether that restriction exists for the current user.
+ */
+ public boolean hasUserRestriction(String restriction) {
+ return mUserManager.hasUserRestriction(restriction);
+ }
+
+ /**
+ * Checks if the current user can add new users.
+ */
+ public boolean canAddUsers() {
+ return !hasUserRestriction(UserManager.DISALLOW_ADD_USER);
+ }
+
+ /**
+ * Checks if the current user can remove users.
+ */
+ public boolean canRemoveUsers() {
+ return !hasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
+ }
+
+ /**
+ * Checks if the current user is allowed to switch to another user.
+ */
+ public boolean canSwitchUsers() {
+ return !hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
+ }
+
+ /**
+ * Checks if the current user can modify accounts. Demo and Guest users cannot modify accounts
+ * even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied.
+ */
+ public boolean canModifyAccounts() {
+ return !hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS) && !isDemoUser()
+ && !isGuestUser();
+ }
+
+ // User actions
+
+ /**
+ * Creates a new user on the system.
+ *
+ * @param userName Name to give to the newly created user.
+ * @return Newly created user.
+ */
+ public UserInfo createNewUser(String userName) {
+ UserInfo user = mUserManager.createUser(userName, 0 /* flags */);
+ if (user == null) {
+ // Couldn't create user, most likely because there are too many, but we haven't
+ // been able to reload the list yet.
+ Log.w(TAG, "can't create user.");
+ return null;
+ }
+ assignDefaultIcon(user);
+ return user;
+ }
+
+ /**
+ * Tries to remove the user that's passed in. System user cannot be removed.
+ * If the user to be removed is current user, it switches to the system user first, and then
+ * removes the user.
+ *
+ * @param userInfo User to be removed
+ * @return {@code true} if user is successfully removed, {@code false} otherwise.
+ */
+ public boolean removeUser(UserInfo userInfo) {
+ if (userInfo.id == UserHandle.USER_SYSTEM) {
+ Log.w(TAG, "User " + userInfo.id + " is system user, could not be removed.");
+ return false;
+ }
+
+ if (userInfo.id == getCurrentUserInfo().id) {
+ switchToUserId(UserHandle.USER_SYSTEM);
+ }
+
+ return mUserManager.removeUser(userInfo.id);
+ }
+
+ /**
+ * Switches (logs in) to another user.
+ *
+ * @param userInfo User to switch to.
+ */
+ public void switchToUser(UserInfo userInfo) {
+ if (userInfo.id == getCurrentUserInfo().id) {
+ return;
+ }
+
+ if (userInfo.isGuest()) {
+ switchToGuest(userInfo.name);
+ return;
+ }
+
+ if (UserManager.isGuestUserEphemeral()) {
+ // If switching from guest, we want to bring up the guest exit dialog instead of
+ // switching
+ UserInfo currUserInfo = getCurrentUserInfo();
+ if (currUserInfo != null && currUserInfo.isGuest()) {
+ return;
+ }
+ }
+
+ switchToUserId(userInfo.id);
+ }
+
+ /**
+ * Creates a guest session and switches into the guest session.
+ *
+ * @param guestName Username for the guest user.
+ */
+ public void switchToGuest(String guestName) {
+ UserInfo guest = mUserManager.createGuest(mContext, guestName);
+ if (guest == null) {
+ // Couldn't create user, most likely because there are too many, but we haven't
+ // been able to reload the list yet.
+ Log.w(TAG, "can't create user.");
+ return;
+ }
+ switchToUserId(guest.id);
+ }
+
+ /**
+ * Gets an icon for the user.
+ *
+ * @param userInfo User for which we want to get the icon.
+ * @return a Bitmap for the icon
+ */
+ public Bitmap getUserIcon(UserInfo userInfo) {
+ Bitmap picture = mUserManager.getUserIcon(userInfo.id);
+
+ if (picture == null) {
+ return assignDefaultIcon(userInfo);
+ }
+
+ return picture;
+ }
+
+ /**
+ * Method for scaling a Bitmap icon to a desirable size.
+ *
+ * @param icon Bitmap to scale.
+ * @param desiredSize Wanted size for the icon.
+ * @return Drawable for the icon, scaled to the new size.
+ */
+ public Drawable scaleUserIcon(Bitmap icon, int desiredSize) {
+ Bitmap scaledIcon = Bitmap.createScaledBitmap(
+ icon, desiredSize, desiredSize, true /* filter */);
+ return new BitmapDrawable(mContext.getResources(), scaledIcon);
+ }
+
+ /**
+ * Sets new Username for the user.
+ *
+ * @param user User whose name should be changed.
+ * @param name New username.
+ */
+ public void setUserName(UserInfo user, String name) {
+ mUserManager.setUserName(user.id, name);
+ }
+
+ private void registerReceiver() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_USER_REMOVED);
+ filter.addAction(Intent.ACTION_USER_ADDED);
+ filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
+ mContext.registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null, null);
+ }
+
+ /**
+ * Assigns a default icon to a user according to the user's id.
+ *
+ * @param userInfo User to assign a default icon to.
+ * @return Bitmap that has been assigned to the user.
+ */
+ private Bitmap assignDefaultIcon(UserInfo userInfo) {
+ Bitmap bitmap = UserIcons.convertToBitmap(
+ UserIcons.getDefaultUserIcon(mContext.getResources(), userInfo.id, false));
+ mUserManager.setUserIcon(userInfo.id, bitmap);
+ return bitmap;
+ }
+
+ private void switchToUserId(int id) {
+ try {
+ final ActivityManager am = (ActivityManager)
+ mContext.getSystemService(Context.ACTIVITY_SERVICE);
+ am.switchUser(id);
+ } catch (Exception e) {
+ Log.e(TAG, "Couldn't switch user.", e);
+ }
+ }
+
+ private void unregisterReceiver() {
+ mContext.unregisterReceiver(mUserChangeReceiver);
+ }
+
+ /**
+ * Interface for listeners that want to register for receiving updates to changes to the users
+ * on the system including removing and adding users, and changing user info.
+ */
+ public interface OnUsersUpdateListener {
+ /**
+ * Method that will get called when users list has been changed.
+ */
+ void onUsersUpdate();
+ }
+}
+
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java
index 68be2b4041b1..81a2d434a960 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java
@@ -27,6 +27,9 @@ import android.icu.util.ULocale;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.TtsSpan;
+
+import com.android.settingslib.R;
+
import java.util.ArrayList;
import java.util.Locale;
@@ -121,8 +124,7 @@ public class StringUtil {
final RelativeUnit unit;
final int value;
if (withSeconds && seconds < 2 * SECONDS_PER_MINUTE) {
- unit = RelativeUnit.SECONDS;
- value = seconds;
+ return context.getResources().getString(R.string.time_unit_just_now);
} else if (seconds < 2 * SECONDS_PER_HOUR) {
unit = RelativeUnit.MINUTES;
value = (seconds + SECONDS_PER_MINUTE / 2)
@@ -141,7 +143,7 @@ public class StringUtil {
final RelativeDateTimeFormatter formatter = RelativeDateTimeFormatter.getInstance(
ULocale.forLocale(locale),
null /* default NumberFormat */,
- RelativeDateTimeFormatter.Style.SHORT,
+ RelativeDateTimeFormatter.Style.LONG,
android.icu.text.DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE);
return formatter.format(value, RelativeDateTimeFormatter.Direction.LAST, unit);
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 085e1123d67e..8f80527036ec 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -176,33 +176,34 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
@Deprecated
public WifiTracker(Context context, WifiListener wifiListener,
boolean includeSaved, boolean includeScans) {
- this(context, new WifiListenerExecutor(wifiListener),
+ this(context, wifiListener,
context.getSystemService(WifiManager.class),
context.getSystemService(ConnectivityManager.class),
context.getSystemService(NetworkScoreManager.class),
newIntentFilter());
}
- // TODO(Sghuman): Clean up includeSaved and includeScans from all constructors and linked
+ // TODO(sghuman): Clean up includeSaved and includeScans from all constructors and linked
// calling apps once IC window is complete
public WifiTracker(Context context, WifiListener wifiListener,
@NonNull Lifecycle lifecycle, boolean includeSaved, boolean includeScans) {
- this(context, new WifiListenerExecutor(wifiListener),
+ this(context, wifiListener,
context.getSystemService(WifiManager.class),
context.getSystemService(ConnectivityManager.class),
context.getSystemService(NetworkScoreManager.class),
newIntentFilter());
+
lifecycle.addObserver(this);
}
@VisibleForTesting
- WifiTracker(Context context, WifiListenerExecutor wifiListenerExecutor,
+ WifiTracker(Context context, WifiListener wifiListener,
WifiManager wifiManager, ConnectivityManager connectivityManager,
NetworkScoreManager networkScoreManager,
IntentFilter filter) {
mContext = context;
mWifiManager = wifiManager;
- mListener = wifiListenerExecutor;
+ mListener = new WifiListenerExecutor(wifiListener);
mConnectivityManager = connectivityManager;
// check if verbose logging developer option has been turned on or off
@@ -853,8 +854,7 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
*
* <p>Also logs all callbacks invocations when verbose logging is enabled.
*/
- @VisibleForTesting
- public static class WifiListenerExecutor implements WifiListener {
+ @VisibleForTesting class WifiListenerExecutor implements WifiListener {
private final WifiListener mDelegatee;
@@ -864,27 +864,29 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
@Override
public void onWifiStateChanged(int state) {
- if (isVerboseLoggingEnabled()) {
- Log.i(TAG,
- String.format("Invoking onWifiStateChanged callback with state %d", state));
- }
- ThreadUtils.postOnMainThread(() -> mDelegatee.onWifiStateChanged(state));
+ runAndLog(() -> mDelegatee.onWifiStateChanged(state),
+ String.format("Invoking onWifiStateChanged callback with state %d", state));
}
@Override
public void onConnectedChanged() {
- if (isVerboseLoggingEnabled()) {
- Log.i(TAG, "Invoking onConnectedChanged callback");
- }
- ThreadUtils.postOnMainThread(() -> mDelegatee.onConnectedChanged());
+ runAndLog(mDelegatee::onConnectedChanged, "Invoking onConnectedChanged callback");
}
@Override
public void onAccessPointsChanged() {
- if (isVerboseLoggingEnabled()) {
- Log.i(TAG, "Invoking onAccessPointsChanged callback");
- }
- ThreadUtils.postOnMainThread(() -> mDelegatee.onAccessPointsChanged());
+ runAndLog(mDelegatee::onAccessPointsChanged, "Invoking onAccessPointsChanged callback");
+ }
+
+ private void runAndLog(Runnable r, String verboseLog) {
+ ThreadUtils.postOnMainThread(() -> {
+ if (mRegistered) {
+ if (isVerboseLoggingEnabled()) {
+ Log.i(TAG, verboseLog);
+ }
+ r.run();
+ }
+ });
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
index fd48eea25e00..61efabc0c0ae 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
@@ -76,7 +76,8 @@ public class WifiUtils {
* ["rssi 5Ghz", "num results on 5GHz" / "rssi 5Ghz", "num results on 5GHz"]
* For instance [-40,5/-30,2]
*/
- private static String getVisibilityStatus(AccessPoint accessPoint) {
+ @VisibleForTesting
+ static String getVisibilityStatus(AccessPoint accessPoint) {
final WifiInfo info = accessPoint.getInfo();
StringBuilder visibility = new StringBuilder();
StringBuilder scans24GHz = new StringBuilder();
@@ -110,6 +111,9 @@ public class WifiUtils {
// TODO: sort list by RSSI or age
long nowMs = SystemClock.elapsedRealtime();
for (ScanResult result : accessPoint.getScanResults()) {
+ if (result == null) {
+ continue;
+ }
if (result.frequency >= AccessPoint.LOWER_FREQ_5GHZ
&& result.frequency <= AccessPoint.HIGHER_FREQ_5GHZ) {
// Strictly speaking: [4915, 5825]
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
new file mode 100644
index 000000000000..325ef3a68aa6
--- /dev/null
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settingslib.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.UserInfo;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.support.test.InstrumentationRegistry;
+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.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class UserManagerHelperTest {
+ @Mock
+ private Context mContext;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private ActivityManager mActivityManager;
+ @Mock
+ private UserManagerHelper.OnUsersUpdateListener mTestListener;
+
+ private UserManagerHelper mHelper;
+ private UserInfo mCurrentUser;
+ private UserInfo mSystemUser;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+ when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn(mActivityManager);
+ when(mContext.getResources())
+ .thenReturn(InstrumentationRegistry.getTargetContext().getResources());
+ mHelper = new UserManagerHelper(mContext);
+
+ mCurrentUser = createUserInfoForId(UserHandle.myUserId());
+ mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM);
+ when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentUser);
+ }
+
+ @Test
+ public void testUserIsSystemUser() {
+ UserInfo testInfo = new UserInfo();
+
+ testInfo.id = UserHandle.USER_SYSTEM;
+ assertThat(mHelper.userIsSystemUser(testInfo)).isTrue();
+
+ testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
+ assertThat(mHelper.userIsSystemUser(testInfo)).isFalse();
+ }
+
+ @Test
+ public void testGetAllUsersExcludesCurrentUser() {
+ int currentUser = UserHandle.myUserId();
+
+ UserInfo otherUser1 = createUserInfoForId(currentUser + 1);
+ UserInfo otherUser2 = createUserInfoForId(currentUser - 1);
+ UserInfo otherUser3 = createUserInfoForId(currentUser + 2);
+
+ List<UserInfo> testUsers = new ArrayList<>();
+ testUsers.add(otherUser1);
+ testUsers.add(otherUser2);
+ testUsers.add(mCurrentUser);
+ testUsers.add(otherUser3);
+
+ when(mUserManager.getUsers(true)).thenReturn(testUsers);
+
+ // Should return 3 users that don't have currentUser id.
+ assertThat(mHelper.getAllUsersExcludesCurrentUser().size()).isEqualTo(3);
+ // Should not contain current user.
+ assertThat(mHelper.getAllUsersExcludesCurrentUser()).doesNotContain(mCurrentUser);
+ // Should contain non-current users.
+ assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser1);
+ assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser2);
+ assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser3);
+ }
+
+ @Test
+ public void testUserCanBeRemoved() {
+ UserInfo testInfo = new UserInfo();
+
+ // System user cannot be removed.
+ testInfo.id = UserHandle.USER_SYSTEM;
+ assertThat(mHelper.userCanBeRemoved(testInfo)).isFalse();
+
+ testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
+ assertThat(mHelper.userCanBeRemoved(testInfo)).isTrue();
+ }
+
+ @Test
+ public void testUserIsCurrentUser() {
+ UserInfo testInfo = new UserInfo();
+
+ // System user cannot be removed.
+ testInfo.id = UserHandle.myUserId();
+ assertThat(mHelper.userIsCurrentUser(testInfo)).isTrue();
+
+ testInfo.id = UserHandle.myUserId() + 2;
+ assertThat(mHelper.userIsCurrentUser(testInfo)).isFalse();
+ }
+
+ @Test
+ public void testCanAddUsers() {
+ when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false);
+ assertThat(mHelper.canAddUsers()).isTrue();
+
+ when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true);
+ assertThat(mHelper.canAddUsers()).isFalse();
+ }
+
+ @Test
+ public void testCanRemoveUsers() {
+ when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(false);
+ assertThat(mHelper.canRemoveUsers()).isTrue();
+
+ when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(true);
+ assertThat(mHelper.canRemoveUsers()).isFalse();
+ }
+
+ @Test
+ public void testCanSwitchUsers() {
+ when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false);
+ assertThat(mHelper.canSwitchUsers()).isTrue();
+
+ when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true);
+ assertThat(mHelper.canSwitchUsers()).isFalse();
+ }
+
+ @Test
+ public void testGuestCannotModifyAccounts() {
+ assertThat(mHelper.canModifyAccounts()).isTrue();
+
+ when(mUserManager.isGuestUser()).thenReturn(true);
+ assertThat(mHelper.canModifyAccounts()).isFalse();
+ }
+
+ @Test
+ public void testDemoUserCannotModifyAccounts() {
+ assertThat(mHelper.canModifyAccounts()).isTrue();
+
+ when(mUserManager.isDemoUser()).thenReturn(true);
+ assertThat(mHelper.canModifyAccounts()).isFalse();
+ }
+
+ @Test
+ public void testUserWithDisallowModifyAccountsRestrictionCannotModifyAccounts() {
+ assertThat(mHelper.canModifyAccounts()).isTrue();
+
+ when(mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS))
+ .thenReturn(true);
+ assertThat(mHelper.canModifyAccounts()).isFalse();
+ }
+
+ @Test
+ public void testCreateNewUser() {
+ // Verify createUser on UserManager gets called.
+ mHelper.createNewUser("Test User");
+ verify(mUserManager).createUser("Test User", 0);
+
+ when(mUserManager.createUser("Test User", 0)).thenReturn(null);
+ assertThat(mHelper.createNewUser("Test User")).isNull();
+
+ UserInfo newUser = new UserInfo();
+ newUser.name = "Test User";
+ when(mUserManager.createUser("Test User", 0)).thenReturn(newUser);
+ assertThat(mHelper.createNewUser("Test User")).isEqualTo(newUser);
+ }
+
+ @Test
+ public void testRemoveUser() {
+ // Cannot remove system user.
+ assertThat(mHelper.removeUser(mSystemUser)).isFalse();
+
+ // Removing current user, calls "switch" to system user.
+ mHelper.removeUser(mCurrentUser);
+ verify(mActivityManager).switchUser(UserHandle.USER_SYSTEM);
+ verify(mUserManager).removeUser(mCurrentUser.id);
+
+ // Removing non-current, non-system user, simply calls removeUser.
+ UserInfo userToRemove = createUserInfoForId(mCurrentUser.id + 2);
+ mHelper.removeUser(userToRemove);
+ verify(mUserManager).removeUser(mCurrentUser.id + 2);
+ }
+
+ @Test
+ public void testSwitchToUser() {
+ // Switching to current user doesn't do anything.
+ mHelper.switchToUser(mCurrentUser);
+ verify(mActivityManager, never()).switchUser(mCurrentUser.id);
+
+ // Switching to Guest calls createGuest.
+ UserInfo guestInfo = new UserInfo(mCurrentUser.id + 1, "Test Guest", UserInfo.FLAG_GUEST);
+ mHelper.switchToUser(guestInfo);
+ verify(mUserManager).createGuest(mContext, "Test Guest");
+
+ // Switching to non-current, non-guest user, simply calls switchUser.
+ UserInfo userToSwitchTo = new UserInfo(mCurrentUser.id + 5, "Test User", 0);
+ mHelper.switchToUser(userToSwitchTo);
+ verify(mActivityManager).switchUser(mCurrentUser.id + 5);
+ }
+
+ @Test
+ public void testSwitchToGuest() {
+ mHelper.switchToGuest("Test Guest");
+ verify(mUserManager).createGuest(mContext, "Test Guest");
+
+ UserInfo guestInfo = new UserInfo(mCurrentUser.id + 2, "Test Guest", UserInfo.FLAG_GUEST);
+ when(mUserManager.createGuest(mContext, "Test Guest")).thenReturn(guestInfo);
+ mHelper.switchToGuest("Test Guest");
+ verify(mActivityManager).switchUser(mCurrentUser.id + 2);
+ }
+
+ @Test
+ public void testGetUserIcon() {
+ mHelper.getUserIcon(mCurrentUser);
+ verify(mUserManager).getUserIcon(mCurrentUser.id);
+ }
+
+ @Test
+ public void testScaleUserIcon() {
+ Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
+ Drawable scaledIcon = mHelper.scaleUserIcon(fakeIcon, 300);
+ assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300);
+ assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300);
+ }
+
+ @Test
+ public void testSetUserName() {
+ UserInfo testInfo = createUserInfoForId(mCurrentUser.id + 3);
+ mHelper.setUserName(testInfo, "New Test Name");
+ verify(mUserManager).setUserName(mCurrentUser.id + 3, "New Test Name");
+ }
+
+ @Test
+ public void testRegisterUserChangeReceiver() {
+ mHelper.registerOnUsersUpdateListener(mTestListener);
+
+ ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+ ArgumentCaptor.forClass(BroadcastReceiver.class);
+ ArgumentCaptor<UserHandle> handleCaptor = ArgumentCaptor.forClass(UserHandle.class);
+ ArgumentCaptor<IntentFilter> filterCaptor = ArgumentCaptor.forClass(IntentFilter.class);
+ ArgumentCaptor<String> permissionCaptor = ArgumentCaptor.forClass(String.class);
+ ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
+
+ verify(mContext).registerReceiverAsUser(
+ receiverCaptor.capture(),
+ handleCaptor.capture(),
+ filterCaptor.capture(),
+ permissionCaptor.capture(),
+ handlerCaptor.capture());
+
+ // Verify we're listening to Intents from ALL users.
+ assertThat(handleCaptor.getValue()).isEqualTo(UserHandle.ALL);
+
+ // Verify the presence of each intent in the filter.
+ // Verify the exact number of filters. Every time a new intent is added, this test should
+ // get updated.
+ assertThat(filterCaptor.getValue().countActions()).isEqualTo(3);
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue();
+
+ // Verify that calling the receiver calls the listener.
+ receiverCaptor.getValue().onReceive(mContext, new Intent());
+ verify(mTestListener).onUsersUpdate();
+
+ assertThat(permissionCaptor.getValue()).isNull();
+ assertThat(handlerCaptor.getValue()).isNull();
+
+
+ // Unregister the receiver.
+ mHelper.unregisterOnUsersUpdateListener();
+ verify(mContext).unregisterReceiver(receiverCaptor.getValue());
+ }
+
+ private UserInfo createUserInfoForId(int id) {
+ UserInfo userInfo = new UserInfo();
+ userInfo.id = id;
+ return userInfo;
+ }
+}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
index 7fb4dc544d28..517db78d5dd1 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
@@ -58,6 +58,8 @@ import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.settingslib.utils.ThreadUtils;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -135,7 +137,7 @@ public class WifiTrackerTest {
@Mock private RssiCurve mockBadgeCurve1;
@Mock private RssiCurve mockBadgeCurve2;
@Mock private WifiManager mockWifiManager;
- @Mock private WifiTracker.WifiListenerExecutor mockWifiListenerExecutor;
+ @Mock private WifiTracker.WifiListener mockWifiListener;
private final List<NetworkKey> mRequestedKeys = new ArrayList<>();
@@ -205,7 +207,7 @@ public class WifiTrackerTest {
mAccessPointsChangedLatch.countDown();
}
return null;
- }).when(mockWifiListenerExecutor).onAccessPointsChanged();
+ }).when(mockWifiListener).onAccessPointsChanged();
// Turn on Scoring UI features
mOriginalScoringUiSettingValue = Settings.Global.getInt(
@@ -271,7 +273,7 @@ public class WifiTrackerTest {
private WifiTracker createMockedWifiTracker() {
final WifiTracker wifiTracker = new WifiTracker(
mContext,
- mockWifiListenerExecutor,
+ mockWifiListener,
mockWifiManager,
mockConnectivityManager,
mockNetworkScoreManager,
@@ -690,7 +692,7 @@ public class WifiTrackerTest {
verify(mockConnectivityManager).getNetworkInfo(any(Network.class));
// mStaleAccessPoints is true
- verify(mockWifiListenerExecutor, never()).onAccessPointsChanged();
+ verify(mockWifiListener, never()).onAccessPointsChanged();
assertThat(tracker.getAccessPoints().size()).isEqualTo(2);
assertThat(tracker.getAccessPoints().get(0).isActive()).isTrue();
}
@@ -719,7 +721,7 @@ public class WifiTrackerTest {
verify(mockConnectivityManager).getNetworkInfo(any(Network.class));
// mStaleAccessPoints is true
- verify(mockWifiListenerExecutor, never()).onAccessPointsChanged();
+ verify(mockWifiListener, never()).onAccessPointsChanged();
assertThat(tracker.getAccessPoints()).hasSize(1);
assertThat(tracker.getAccessPoints().get(0).isActive()).isTrue();
@@ -762,6 +764,41 @@ public class WifiTrackerTest {
}
@Test
+ public void stopTrackingShouldPreventCallbacksFromOngoingWork() throws Exception {
+ WifiTracker tracker = createMockedWifiTracker();
+ startTracking(tracker);
+
+ final CountDownLatch ready = new CountDownLatch(1);
+ final CountDownLatch latch = new CountDownLatch(1);
+ final CountDownLatch lock = new CountDownLatch(1);
+ tracker.mWorkHandler.post(() -> {
+ try {
+ ready.countDown();
+ lock.await();
+
+ tracker.mReceiver.onReceive(
+ mContext, new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION));
+
+ latch.countDown();
+ } catch (InterruptedException e) {
+ fail("Interrupted Exception while awaiting lock release: " + e);
+ }
+ });
+
+ ready.await(); // Make sure we have entered the first message handler
+ tracker.onStop();
+ lock.countDown();
+ assertTrue("Latch timed out", latch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
+
+ // Wait for main thread
+ final CountDownLatch latch2 = new CountDownLatch(1);
+ ThreadUtils.postOnMainThread(latch2::countDown);
+ latch2.await();
+
+ verify(mockWifiListener, never()).onWifiStateChanged(anyInt());
+ }
+
+ @Test
public void stopTrackingShouldSetStaleBitWhichPreventsCallbacksUntilNextScanResult()
throws Exception {
WifiTracker tracker = createMockedWifiTracker();
@@ -778,7 +815,7 @@ public class WifiTrackerTest {
mContext, new Intent(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION));
- verify(mockWifiListenerExecutor, never()).onAccessPointsChanged();
+ verify(mockWifiListener, never()).onAccessPointsChanged();
sendScanResults(tracker); // verifies onAccessPointsChanged is invoked
}
@@ -795,7 +832,7 @@ public class WifiTrackerTest {
tracker.mReceiver.onReceive(
mContext, new Intent(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION));
- verify(mockWifiListenerExecutor, never()).onAccessPointsChanged();
+ verify(mockWifiListener, never()).onAccessPointsChanged();
sendScanResults(tracker); // verifies onAccessPointsChanged is invoked
}
@@ -816,7 +853,7 @@ public class WifiTrackerTest {
@Test
public void onConnectedChangedCallback_shouldNotBeInvokedWhenNoStateChange() throws Exception {
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
- verify(mockWifiListenerExecutor, times(1)).onConnectedChanged();
+ verify(mockWifiListener, times(1)).onConnectedChanged();
NetworkInfo networkInfo = new NetworkInfo(
ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype");
@@ -826,13 +863,13 @@ public class WifiTrackerTest {
intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
tracker.mReceiver.onReceive(mContext, intent);
- verify(mockWifiListenerExecutor, times(1)).onConnectedChanged();
+ verify(mockWifiListener, times(1)).onConnectedChanged();
}
@Test
public void onConnectedChangedCallback_shouldBeInvokedWhenStateChanges() throws Exception {
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
- verify(mockWifiListenerExecutor, times(1)).onConnectedChanged();
+ verify(mockWifiListener, times(1)).onConnectedChanged();
NetworkInfo networkInfo = new NetworkInfo(
ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype");
@@ -844,7 +881,7 @@ public class WifiTrackerTest {
tracker.mReceiver.onReceive(mContext, intent);
assertThat(tracker.isConnected()).isFalse();
- verify(mockWifiListenerExecutor, times(2)).onConnectedChanged();
+ verify(mockWifiListener, times(2)).onConnectedChanged();
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java
new file mode 100644
index 000000000000..2dbabe0b76cc
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java
@@ -0,0 +1,303 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.robolectric.shadow.api.Shadow.extract;
+
+import android.annotation.UserIdInt;
+import android.app.ApplicationPackageManager;
+import android.app.usage.IStorageStatsManager;
+import android.app.usage.StorageStats;
+import android.app.usage.StorageStatsManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.util.IconDrawableFactory;
+
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+import com.android.settingslib.applications.ApplicationsState.Callbacks;
+import com.android.settingslib.applications.ApplicationsState.Session;
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+import com.android.settingslib.testutils.shadow.ShadowUserManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatchers;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowContextImpl;
+import org.robolectric.shadows.ShadowLooper;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+@Config(shadows = {ShadowUserManager.class,
+ ApplicationsStateRoboTest.ShadowIconDrawableFactory.class,
+ ApplicationsStateRoboTest.ShadowPackageManager.class})
+public class ApplicationsStateRoboTest {
+
+ private final static String HOME_PACKAGE_NAME = "com.android.home";
+ private final static String LAUNCHABLE_PACKAGE_NAME = "com.android.launchable";
+
+ /** Class under test */
+ private ApplicationsState mApplicationsState;
+
+ @Mock
+ private Callbacks mCallbacks;
+ @Captor
+ private ArgumentCaptor<ArrayList<AppEntry>> mAppEntriesCaptor;
+ @Mock
+ private StorageStatsManager mStorageStatsManager;
+
+ @Implements(value = IconDrawableFactory.class, inheritImplementationMethods = true)
+ public static class ShadowIconDrawableFactory {
+
+ @Implementation
+ public Drawable getBadgedIcon(ApplicationInfo appInfo) {
+ return new ColorDrawable(0);
+ }
+ }
+
+ @Implements(value = ApplicationPackageManager.class, inheritImplementationMethods = true)
+ public static class ShadowPackageManager extends
+ org.robolectric.shadows.ShadowApplicationPackageManager {
+
+ @Implementation
+ public ComponentName getHomeActivities(List<ResolveInfo> outActivities) {
+ ResolveInfo resolveInfo = new ResolveInfo();
+ resolveInfo.activityInfo = new ActivityInfo();
+ resolveInfo.activityInfo.packageName = HOME_PACKAGE_NAME;
+ resolveInfo.activityInfo.enabled = true;
+ outActivities.add(resolveInfo);
+ return ComponentName.createRelative(resolveInfo.activityInfo.packageName, "foo");
+ }
+
+ public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
+ @PackageManager.ResolveInfoFlags int flags, @UserIdInt int userId) {
+ List<ResolveInfo> resolveInfos = new ArrayList<>();
+ ResolveInfo resolveInfo = new ResolveInfo();
+ resolveInfo.activityInfo = new ActivityInfo();
+ resolveInfo.activityInfo.packageName = LAUNCHABLE_PACKAGE_NAME;
+ resolveInfo.activityInfo.enabled = true;
+ resolveInfo.filter = new IntentFilter();
+ resolveInfo.filter.addCategory(Intent.CATEGORY_LAUNCHER);
+ resolveInfos.add(resolveInfo);
+ return resolveInfos;
+ }
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ // Robolectric does not know about the StorageStatsManager as a system service.
+ // Registering a mock of this service as a replacement.
+ ShadowContextImpl shadowContext = Shadow.extract(
+ RuntimeEnvironment.application.getBaseContext());
+ shadowContext.setSystemService(Context.STORAGE_STATS_SERVICE, mStorageStatsManager);
+ StorageStats storageStats = new StorageStats();
+ storageStats.codeBytes = 10;
+ storageStats.dataBytes = 20;
+ storageStats.cacheBytes = 30;
+ when(mStorageStatsManager.queryStatsForPackage(ArgumentMatchers.any(UUID.class),
+ anyString(), ArgumentMatchers.any(UserHandle.class))).thenReturn(storageStats);
+
+ mApplicationsState = ApplicationsState.getInstance(RuntimeEnvironment.application);
+ mApplicationsState.clearEntries();
+ }
+
+ private ApplicationInfo createApplicationInfo(String packageName) {
+ ApplicationInfo appInfo = new ApplicationInfo();
+ appInfo.sourceDir = "foo";
+ appInfo.flags |= ApplicationInfo.FLAG_INSTALLED;
+ appInfo.storageUuid = UUID.randomUUID();
+ appInfo.packageName = packageName;
+ return appInfo;
+ }
+
+ private AppEntry createAppEntry(ApplicationInfo appInfo, int id) {
+ AppEntry appEntry = new AppEntry(RuntimeEnvironment.application, appInfo, id);
+ appEntry.label = "label";
+ appEntry.mounted = true;
+ return appEntry;
+ }
+
+ private void addApp(String packageName, int id) {
+ ApplicationInfo appInfo = createApplicationInfo(packageName);
+ AppEntry appEntry = createAppEntry(appInfo, id);
+ mApplicationsState.mAppEntries.add(appEntry);
+ mApplicationsState.mEntriesMap.get(0).put(appInfo.packageName, appEntry);
+ }
+
+ private void processAllMessages() {
+ Handler mainHandler = mApplicationsState.mMainHandler;
+ Handler bkgHandler = mApplicationsState.mBackgroundHandler;
+ ShadowLooper shadowBkgLooper = extract(bkgHandler.getLooper());
+ ShadowLooper shadowMainLooper = extract(mainHandler.getLooper());
+ shadowBkgLooper.idle();
+ shadowMainLooper.idle();
+ }
+
+ private AppEntry findAppEntry(List<AppEntry> appEntries, long id) {
+ for (AppEntry appEntry : appEntries) {
+ if (appEntry.id == id) {
+ return appEntry;
+ }
+ }
+ return null;
+ }
+
+ @Test
+ public void testDefaultSessionLoadsAll() {
+ Session session = mApplicationsState.newSession(mCallbacks);
+ session.onResume();
+
+ addApp(HOME_PACKAGE_NAME,1);
+ addApp(LAUNCHABLE_PACKAGE_NAME,2);
+ session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
+ processAllMessages();
+ verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
+
+ List<AppEntry> appEntries = mAppEntriesCaptor.getValue();
+ assertThat(appEntries.size()).isEqualTo(2);
+
+ for (AppEntry appEntry : appEntries) {
+ assertThat(appEntry.size).isGreaterThan(0L);
+ assertThat(appEntry.icon).isNotNull();
+ }
+
+ AppEntry homeEntry = findAppEntry(appEntries, 1);
+ assertThat(homeEntry.isHomeApp).isTrue();
+ assertThat(homeEntry.hasLauncherEntry).isFalse();
+
+ AppEntry launchableEntry = findAppEntry(appEntries, 2);
+ assertThat(launchableEntry.hasLauncherEntry).isTrue();
+ assertThat(launchableEntry.launcherEntryEnabled).isTrue();
+ session.onDestroy();
+ }
+
+ @Test
+ public void testCustomSessionLoadsIconsOnly() {
+ Session session = mApplicationsState.newSession(mCallbacks);
+ session.setSessionFlags(ApplicationsState.FLAG_SESSION_REQUEST_ICONS);
+ session.onResume();
+
+ addApp(LAUNCHABLE_PACKAGE_NAME,1);
+ session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
+ processAllMessages();
+ verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
+
+ List<AppEntry> appEntries = mAppEntriesCaptor.getValue();
+ assertThat(appEntries.size()).isEqualTo(1);
+
+ AppEntry launchableEntry = findAppEntry(appEntries, 1);
+ assertThat(launchableEntry.icon).isNotNull();
+ assertThat(launchableEntry.size).isEqualTo(-1);
+ assertThat(launchableEntry.hasLauncherEntry).isFalse();
+ session.onDestroy();
+ }
+
+ @Test
+ public void testCustomSessionLoadsSizesOnly() {
+ Session session = mApplicationsState.newSession(mCallbacks);
+ session.setSessionFlags(ApplicationsState.FLAG_SESSION_REQUEST_SIZES);
+ session.onResume();
+
+ addApp(LAUNCHABLE_PACKAGE_NAME,1);
+ session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
+ processAllMessages();
+ verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
+
+ List<AppEntry> appEntries = mAppEntriesCaptor.getValue();
+ assertThat(appEntries.size()).isEqualTo(1);
+
+ AppEntry launchableEntry = findAppEntry(appEntries, 1);
+ assertThat(launchableEntry.icon).isNull();
+ assertThat(launchableEntry.hasLauncherEntry).isFalse();
+ assertThat(launchableEntry.size).isGreaterThan(0L);
+ session.onDestroy();
+ }
+
+ @Test
+ public void testCustomSessionLoadsHomeOnly() {
+ Session session = mApplicationsState.newSession(mCallbacks);
+ session.setSessionFlags(ApplicationsState.FLAG_SESSION_REQUEST_HOME_APP);
+ session.onResume();
+
+ addApp(HOME_PACKAGE_NAME,1);
+ session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
+ processAllMessages();
+ verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
+
+ List<AppEntry> appEntries = mAppEntriesCaptor.getValue();
+ assertThat(appEntries.size()).isEqualTo(1);
+
+ AppEntry launchableEntry = findAppEntry(appEntries, 1);
+ assertThat(launchableEntry.icon).isNull();
+ assertThat(launchableEntry.hasLauncherEntry).isFalse();
+ assertThat(launchableEntry.size).isEqualTo(-1);
+ assertThat(launchableEntry.isHomeApp).isTrue();
+ session.onDestroy();
+ }
+
+ @Test
+ public void testCustomSessionLoadsLeanbackOnly() {
+ Session session = mApplicationsState.newSession(mCallbacks);
+ session.setSessionFlags(ApplicationsState.FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER);
+ session.onResume();
+
+ addApp(LAUNCHABLE_PACKAGE_NAME,1);
+ session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
+ processAllMessages();
+ verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
+
+ List<AppEntry> appEntries = mAppEntriesCaptor.getValue();
+ assertThat(appEntries.size()).isEqualTo(1);
+
+ AppEntry launchableEntry = findAppEntry(appEntries, 1);
+ assertThat(launchableEntry.icon).isNull();
+ assertThat(launchableEntry.size).isEqualTo(-1);
+ assertThat(launchableEntry.isHomeApp).isFalse();
+ assertThat(launchableEntry.hasLauncherEntry).isTrue();
+ assertThat(launchableEntry.launcherEntryEnabled).isTrue();
+ session.onDestroy();
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
index d6b20064823a..2f5eead38993 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
@@ -71,6 +71,8 @@ public class CachedBluetoothDeviceManagerTest {
@Mock
private PanProfile mPanProfile;
@Mock
+ private HearingAidProfile mHearingAidProfile;
+ @Mock
private BluetoothDevice mDevice1;
@Mock
private BluetoothDevice mDevice2;
@@ -100,6 +102,7 @@ public class CachedBluetoothDeviceManagerTest {
when(mHfpProfile.isProfileReady()).thenReturn(true);
when(mA2dpProfile.isProfileReady()).thenReturn(true);
when(mPanProfile.isProfileReady()).thenReturn(true);
+ when(mHearingAidProfile.isProfileReady()).thenReturn(true);
mCachedDeviceManager = new CachedBluetoothDeviceManager(mContext, mLocalBluetoothManager);
}
@@ -280,4 +283,63 @@ public class CachedBluetoothDeviceManagerTest {
assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
}
+
+ /**
+ * Test to verify onActiveDeviceChanged() with A2DP and Hearing Aid.
+ */
+ @Test
+ public void testOnActiveDeviceChanged_withA2dpAndHearingAid() {
+ CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice1);
+ assertThat(cachedDevice1).isNotNull();
+ CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice2);
+ assertThat(cachedDevice2).isNotNull();
+
+ when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+
+ // Connect device1 for A2DP and HFP and device2 for Hearing Aid
+ cachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
+ cachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
+ cachedDevice2.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED);
+
+ // Verify that both devices are connected and none is Active
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse();
+
+ // The first device is active for A2DP and HFP
+ mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.A2DP);
+ mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.HEADSET);
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse();
+
+ // The second device is active for Hearing Aid and the first device is not active
+ mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.A2DP);
+ mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEADSET);
+ mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEARING_AID);
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isTrue();
+
+ // No active device for Hearing Aid
+ mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEARING_AID);
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse();
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
index 632b014be2f5..49f58a42d13e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
@@ -56,6 +56,8 @@ public class CachedBluetoothDeviceTest {
@Mock
private PanProfile mPanProfile;
@Mock
+ private HearingAidProfile mHearingAidProfile;
+ @Mock
private BluetoothDevice mDevice;
private CachedBluetoothDevice mCachedDevice;
private Context mContext;
@@ -70,6 +72,7 @@ public class CachedBluetoothDeviceTest {
when(mHfpProfile.isProfileReady()).thenReturn(true);
when(mA2dpProfile.isProfileReady()).thenReturn(true);
when(mPanProfile.isProfileReady()).thenReturn(true);
+ when(mHearingAidProfile.isProfileReady()).thenReturn(true);
mCachedDevice = spy(
new CachedBluetoothDevice(mContext, mAdapter, mProfileManager, mDevice));
doAnswer((invocation) -> mBatteryLevel).when(mCachedDevice).getBatteryLevel();
@@ -204,6 +207,23 @@ public class CachedBluetoothDeviceTest {
}
@Test
+ public void testGetConnectionSummary_testSingleProfileActiveDeviceHearingAid() {
+ // Test without battery level
+ // Set Hearing Aid profile to be connected and test connection state summary
+ mCachedDevice.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED);
+ assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected");
+
+ // Set device as Active for Hearing Aid and test connection state summary
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID);
+ assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active");
+
+ // Set Hearing Aid profile to be disconnected and test connection state summary
+ mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEARING_AID);
+ mCachedDevice.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_DISCONNECTED);
+ assertThat(mCachedDevice.getConnectionSummary()).isNull();
+ }
+
+ @Test
public void testGetConnectionSummary_testMultipleProfilesActiveDevice() {
// Test without battery level
// Set A2DP and HFP profiles to be connected and test connection state summary
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
index a15f5fce558e..ccaf3fcbef17 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
@@ -73,11 +73,22 @@ public class DevelopmentSettingsEnablerTest {
}
@Test
- public void isEnabled_settingsOn_noRestriction_notAdmin_shouldReturnFalse() {
+ public void isEnabled_settingsOn_noRestriction_notAdmin_notDemo_shouldReturnFalse() {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
ShadowUserManager.getShadow().setIsAdminUser(false);
+ ShadowUserManager.getShadow().setIsDemoUser(false);
assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isFalse();
}
+
+ @Test
+ public void isEnabled_settingsOn_noRestriction_notAdmin_isDemo_shouldReturnTrue() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+ ShadowUserManager.getShadow().setIsAdminUser(false);
+ ShadowUserManager.getShadow().setIsDemoUser(true);
+
+ assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isTrue();
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java
new file mode 100644
index 000000000000..b33df3031ce9
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.fuelgauge;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.PowerManager;
+import android.provider.Settings.Secure;
+
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+public class BatterySaverUtilsTest {
+ @Mock
+ Context mMockContext;
+
+ @Mock
+ ContentResolver mMockResolver;
+
+ @Mock
+ PowerManager mMockPowerManager;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ when(mMockContext.getContentResolver()).thenReturn(mMockResolver);
+ when(mMockContext.getSystemService(eq(PowerManager.class))).thenReturn(mMockPowerManager);
+ when(mMockPowerManager.setPowerSaveMode(anyBoolean())).thenReturn(true);
+ }
+
+ @Test
+ public void testSetPowerSaveMode_enable_firstCall_needWarning() throws Exception {
+ Secure.putString(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, "null");
+ Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null");
+
+ assertEquals(false, BatterySaverUtils.setPowerSaveMode(mMockContext, true, true));
+
+ verify(mMockContext, times(1)).sendBroadcast(any(Intent.class));
+ verify(mMockPowerManager, times(0)).setPowerSaveMode(anyBoolean());
+
+ // They shouldn't have changed.
+ assertEquals(-1,
+ Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1));
+ assertEquals(-2,
+ Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2));
+ }
+
+ @Test
+ public void testSetPowerSaveMode_enable_secondCall_needWarning() throws Exception {
+ Secure.putInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 1); // Already acked.
+ Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null");
+
+ assertEquals(true, BatterySaverUtils.setPowerSaveMode(mMockContext, true, true));
+
+ verify(mMockContext, times(0)).sendBroadcast(any(Intent.class));
+ verify(mMockPowerManager, times(1)).setPowerSaveMode(eq(true));
+
+ assertEquals(1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1));
+ assertEquals(1, Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2));
+ }
+
+ @Test
+ public void testSetPowerSaveMode_enable_thridCall_needWarning() throws Exception {
+ Secure.putInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 1); // Already acked.
+ Secure.putInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, 1);
+
+ assertEquals(true, BatterySaverUtils.setPowerSaveMode(mMockContext, true, true));
+
+ verify(mMockContext, times(0)).sendBroadcast(any(Intent.class));
+ verify(mMockPowerManager, times(1)).setPowerSaveMode(eq(true));
+
+ assertEquals(1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1));
+ assertEquals(2, Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2));
+ }
+
+ @Test
+ public void testSetPowerSaveMode_enable_firstCall_noWarning() throws Exception {
+ Secure.putString(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, "null");
+ Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null");
+
+ assertEquals(true, BatterySaverUtils.setPowerSaveMode(mMockContext, true, false));
+
+ verify(mMockContext, times(0)).sendBroadcast(any(Intent.class));
+ verify(mMockPowerManager, times(1)).setPowerSaveMode(eq(true));
+
+ assertEquals(1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1));
+ assertEquals(1, Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2));
+ }
+
+ @Test
+ public void testSetPowerSaveMode_disable_firstCall_noWarning() throws Exception {
+ Secure.putString(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, "null");
+ Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null");
+
+ // When disabling, needFirstTimeWarning doesn't matter.
+ assertEquals(true, BatterySaverUtils.setPowerSaveMode(mMockContext, false, false));
+
+ verify(mMockContext, times(0)).sendBroadcast(any(Intent.class));
+ verify(mMockPowerManager, times(1)).setPowerSaveMode(eq(false));
+
+ assertEquals(-1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1));
+ assertEquals(-2,
+ Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2));
+ }
+
+ @Test
+ public void testSetPowerSaveMode_disable_firstCall_needWarning() throws Exception {
+ Secure.putString(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, "null");
+ Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null");
+
+ // When disabling, needFirstTimeWarning doesn't matter.
+ assertEquals(true, BatterySaverUtils.setPowerSaveMode(mMockContext, false, true));
+
+ verify(mMockContext, times(0)).sendBroadcast(any(Intent.class));
+ verify(mMockPowerManager, times(1)).setPowerSaveMode(eq(false));
+
+ assertEquals(-1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1));
+ assertEquals(-2,
+ Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2));
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java
index a3e1bc8418c7..bbd3a53751a0 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java
@@ -17,6 +17,7 @@
package com.android.settingslib.testutils.shadow;
import android.content.Context;
+import android.content.pm.UserInfo;
import android.os.UserManager;
import org.robolectric.RuntimeEnvironment;
@@ -25,6 +26,9 @@ import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
import org.robolectric.shadow.api.Shadow;
+import java.util.ArrayList;
+import java.util.List;
+
@Implements(value = UserManager.class, inheritImplementationMethods = true)
public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
@@ -49,6 +53,20 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
return (UserManager) context.getSystemService(Context.USER_SERVICE);
}
+ @Implementation
+ public int[] getProfileIdsWithDisabled(int userId) {
+ return new int[] { 0 };
+ }
+
+ @Implementation
+ public List<UserInfo> getProfiles() {
+ UserInfo userInfo = new UserInfo();
+ userInfo.id = 0;
+ List<UserInfo> userInfos = new ArrayList<>();
+ userInfos.add(userInfo);
+ return userInfos;
+ }
+
public static ShadowUserManager getShadow() {
return (ShadowUserManager) Shadow.extract(
RuntimeEnvironment.application.getSystemService(UserManager.class));
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java
index 47dd02290ea1..532c755ef7b9 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java
@@ -114,7 +114,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_WithSeconds_ShowSeconds() {
final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "40 sec. ago";
+ final String expectedTime = "Just now";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -123,7 +123,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_NoSeconds_DoNotShowSeconds() {
final double testMillis = 40 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "1 min. ago";
+ final String expectedTime = "1 minute ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
expectedTime);
@@ -132,7 +132,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_LessThanTwoMinutes_withSeconds() {
final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "119 sec. ago";
+ final String expectedTime = "Just now";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -141,7 +141,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_LessThanTwoMinutes_NoSeconds() {
final double testMillis = 119 * DateUtils.SECOND_IN_MILLIS;
- final String expectedTime = "2 min. ago";
+ final String expectedTime = "2 minutes ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
expectedTime);
@@ -150,7 +150,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_TwoMinutes_withSeconds() {
final double testMillis = 2 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "2 min. ago";
+ final String expectedTime = "2 minutes ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -159,7 +159,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_LessThanTwoHours_withSeconds() {
final double testMillis = 119 * DateUtils.MINUTE_IN_MILLIS;
- final String expectedTime = "119 min. ago";
+ final String expectedTime = "119 minutes ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -168,7 +168,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_TwoHours_withSeconds() {
final double testMillis = 2 * DateUtils.HOUR_IN_MILLIS;
- final String expectedTime = "2 hr. ago";
+ final String expectedTime = "2 hours ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -177,7 +177,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_LessThanTwoDays_withSeconds() {
final double testMillis = 47 * DateUtils.HOUR_IN_MILLIS;
- final String expectedTime = "47 hr. ago";
+ final String expectedTime = "47 hours ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -195,7 +195,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_FormatZero_WithSeconds() {
final double testMillis = 0;
- final String expectedTime = "0 sec. ago";
+ final String expectedTime = "Just now";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, true).toString()).isEqualTo(
expectedTime);
@@ -204,7 +204,7 @@ public class StringUtilTest {
@Test
public void testFormatRelativeTime_FormatZero_NoSeconds() {
final double testMillis = 0;
- final String expectedTime = "0 min. ago";
+ final String expectedTime = "0 minutes ago";
assertThat(StringUtil.formatRelativeTime(mContext, testMillis, false).toString()).isEqualTo(
expectedTime);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java
index ea8ecbad99bd..91d9f91887a8 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiUtilsTest.java
@@ -18,6 +18,7 @@ package com.android.settingslib.wifi;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -31,6 +32,7 @@ import android.os.Bundle;
import android.os.Parcelable;
import android.os.SystemClock;
import android.text.format.DateUtils;
+import android.util.ArraySet;
import com.android.settingslib.R;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
@@ -43,6 +45,7 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
+import java.util.Set;
@RunWith(SettingsLibRobolectricTestRunner.class)
public class WifiUtilsTest {
@@ -56,6 +59,8 @@ public class WifiUtilsTest {
private RssiCurve mockBadgeCurve;
@Mock
private WifiNetworkScoreCache mockWifiNetworkScoreCache;
+ @Mock
+ private AccessPoint mAccessPoint;
@Before
public void setUp() {
@@ -84,6 +89,15 @@ public class WifiUtilsTest {
assertThat(summary.contains(mContext.getString(R.string.speed_label_very_fast))).isTrue();
}
+ @Test
+ public void testGetVisibilityStatus_nullResultDoesNotCrash() {
+ doReturn(null).when(mAccessPoint).getInfo();
+ Set<ScanResult> set = new ArraySet<>();
+ set.add(null);
+ doReturn(set).when(mAccessPoint).getScanResults();
+ WifiUtils.getVisibilityStatus(mAccessPoint);
+ }
+
private static ArrayList<ScanResult> buildScanResultCache() {
ArrayList<ScanResult> scanResults = new ArrayList<>();
for (int i = 0; i < 5; i++) {
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index ecda53a15f48..8b783665b039 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -82,6 +82,10 @@
<string name="def_wireless_charging_started_sound" translatable="false">/system/media/audio/ui/WirelessChargingStarted.ogg</string>
<string name="def_charging_started_sound" translatable="false">/system/media/audio/ui/ChargingStarted.ogg</string>
+ <!-- sound trigger detection service default values -->
+ <integer name="def_max_sound_trigger_detection_service_ops_per_day" translatable="false">200</integer>
+ <integer name="def_sound_trigger_detection_service_op_timeout" translatable="false">15000</integer>
+
<bool name="def_lockscreen_disabled">false</bool>
<bool name="def_device_provisioned">false</bool>
<integer name="def_dock_audio_media_enabled">1</integer>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index f895a9858b36..2047f5873fca 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -578,6 +578,9 @@ class SettingsProtoDumpUtil {
Settings.Global.BLE_SCAN_LOW_LATENCY_INTERVAL_MS,
GlobalSettingsProto.BLE_SCAN_LOW_LATENCY_INTERVAL_MS);
dumpSetting(s, p,
+ Settings.Global.BLE_SCAN_BACKGROUND_MODE,
+ GlobalSettingsProto.BLE_SCAN_BACKGROUND_MODE);
+ dumpSetting(s, p,
Settings.Global.WIFI_SAVED_STATE,
GlobalSettingsProto.WIFI_SAVED_STATE);
dumpSetting(s, p,
@@ -1158,12 +1161,18 @@ class SettingsProtoDumpUtil {
Global.CHAINED_BATTERY_ATTRIBUTION_ENABLED,
GlobalSettingsProto.CHAINED_BATTERY_ATTRIBUTION_ENABLED);
dumpSetting(s, p,
- Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES,
- GlobalSettingsProto.AUTOFILL_COMPAT_ALLOWED_PACKAGES);
+ Settings.Global.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES,
+ GlobalSettingsProto.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES);
dumpSetting(s, p,
Global.HIDDEN_API_BLACKLIST_EXEMPTIONS,
GlobalSettingsProto.HIDDEN_API_BLACKLIST_EXEMPTIONS);
dumpSetting(s, p,
+ Global.SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT,
+ GlobalSettingsProto.SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT);
+ dumpSetting(s, p,
+ Global.MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY,
+ GlobalSettingsProto.MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY);
+ dumpSetting(s, p,
Settings.Global.MULTI_SIM_VOICE_CALL_SUBSCRIPTION,
GlobalSettingsProto.MULTI_SIM_VOICE_CALL_SUBSCRIPTION);
dumpSetting(s, p,
@@ -1922,6 +1931,9 @@ class SettingsProtoDumpUtil {
dumpSetting(s, p,
Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING,
SecureSettingsProto.BLUETOOTH_ON_WHILE_DRIVING);
+ dumpSetting(s, p,
+ Settings.Secure.VOLUME_HUSH_GESTURE,
+ SecureSettingsProto.VOLUME_HUSH_GESTURE);
// Please insert new settings using the same order as in Settings.Secure.
p.end(token);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index cb5763fa1315..7fd06987e64a 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -1798,76 +1798,52 @@ public class SettingsProvider extends ContentProvider {
if (TextUtils.isEmpty(value)) {
return false;
}
-
- final char prefix = value.charAt(0);
- if (prefix != '+' && prefix != '-') {
- if (forceNotify) {
- final int key = makeKey(SETTINGS_TYPE_SECURE, owningUserId);
- mSettingsRegistry.notifyForSettingsChange(key,
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
- }
- return false;
- }
-
- // skip prefix
- value = value.substring(1);
-
- Setting settingValue = getSecureSetting(
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED, owningUserId);
- if (settingValue == null) {
+ Setting oldSetting = getSecureSetting(
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED, owningUserId);
+ if (oldSetting == null) {
return false;
}
-
- String oldProviders = !settingValue.isNull() ? settingValue.getValue() : "";
-
- int index = oldProviders.indexOf(value);
- int end = index + value.length();
-
- // check for commas to avoid matching on partial string
- if (index > 0 && oldProviders.charAt(index - 1) != ',') {
- index = -1;
- }
-
- // check for commas to avoid matching on partial string
- if (end < oldProviders.length() && oldProviders.charAt(end) != ',') {
- index = -1;
- }
-
- String newProviders;
-
- if (prefix == '+' && index < 0) {
- // append the provider to the list if not present
- if (oldProviders.length() == 0) {
- newProviders = value;
- } else {
- newProviders = oldProviders + ',' + value;
+ String oldProviders = oldSetting.getValue();
+ List<String> oldProvidersList = TextUtils.isEmpty(oldProviders)
+ ? new ArrayList<>() : new ArrayList<>(Arrays.asList(oldProviders.split(",")));
+ Set<String> newProvidersSet = new ArraySet<>();
+ newProvidersSet.addAll(oldProvidersList);
+
+ String[] providerUpdates = value.split(",");
+ boolean inputError = false;
+ for (String provider : providerUpdates) {
+ // do not update location_providers_allowed when input is invalid
+ if (TextUtils.isEmpty(provider)) {
+ inputError = true;
+ break;
}
- } else if (prefix == '-' && index >= 0) {
- // remove the provider from the list if present
- // remove leading or trailing comma
- if (index > 0) {
- index--;
- } else if (end < oldProviders.length()) {
- end++;
+ final char prefix = provider.charAt(0);
+ // do not update location_providers_allowed when input is invalid
+ if (prefix != '+' && prefix != '-') {
+ inputError = true;
+ break;
}
-
- newProviders = oldProviders.substring(0, index);
- if (end < oldProviders.length()) {
- newProviders += oldProviders.substring(end);
+ // skip prefix
+ provider = provider.substring(1);
+ if (prefix == '+') {
+ newProvidersSet.add(provider);
+ } else if (prefix == '-') {
+ newProvidersSet.remove(provider);
}
- } else {
+ }
+ String newProviders = TextUtils.join(",", newProvidersSet.toArray());
+ if (inputError == true || newProviders.equals(oldProviders)) {
// nothing changed, so no need to update the database
if (forceNotify) {
- final int key = makeKey(SETTINGS_TYPE_SECURE, owningUserId);
- mSettingsRegistry.notifyForSettingsChange(key,
+ mSettingsRegistry.notifyForSettingsChange(
+ makeKey(SETTINGS_TYPE_SECURE, owningUserId),
Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
}
return false;
}
-
return mSettingsRegistry.insertSettingLocked(SETTINGS_TYPE_SECURE,
- owningUserId, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, newProviders,
- tag, makeDefault, getCallingPackage(), forceNotify, CRITICAL_SECURE_SETTINGS);
+ owningUserId, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, newProviders, tag,
+ makeDefault, getCallingPackage(), forceNotify, CRITICAL_SECURE_SETTINGS);
}
private static void warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk(
@@ -2774,9 +2750,7 @@ public class SettingsProvider extends ContentProvider {
}
private void notifyForSettingsChange(int key, String name) {
- final int userId = isGlobalSettingsKey(key)
- ? UserHandle.USER_ALL : getUserIdFromKey(key);
-
+ final int userId = getUserIdFromKey(key);
Uri uri = getNotificationUriFor(key, name);
mGenerationRegistry.incrementGeneration(key);
@@ -2940,7 +2914,7 @@ public class SettingsProvider extends ContentProvider {
}
private final class UpgradeController {
- private static final int SETTINGS_VERSION = 160;
+ private static final int SETTINGS_VERSION = 162;
private final int mUserId;
@@ -3670,6 +3644,50 @@ public class SettingsProvider extends ContentProvider {
}
currentVersion = 160;
}
+
+ if (currentVersion == 160) {
+ // Version 161: Set the default value for
+ // MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY and
+ // SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT
+ final SettingsState globalSettings = getGlobalSettingsLocked();
+
+ String oldValue = globalSettings.getSettingLocked(
+ Global.MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY).getValue();
+ if (TextUtils.equals(null, oldValue)) {
+ globalSettings.insertSettingLocked(
+ Settings.Global.MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY,
+ Integer.toString(getContext().getResources().getInteger(
+ R.integer.def_max_sound_trigger_detection_service_ops_per_day)),
+ null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+
+ oldValue = globalSettings.getSettingLocked(
+ Global.SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT).getValue();
+ if (TextUtils.equals(null, oldValue)) {
+ globalSettings.insertSettingLocked(
+ Settings.Global.SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT,
+ Integer.toString(getContext().getResources().getInteger(
+ R.integer.def_sound_trigger_detection_service_op_timeout)),
+ null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+ currentVersion = 161;
+ }
+
+ if (currentVersion == 161) {
+ // Version 161: Add a gesture for silencing phones
+ final SettingsState secureSettings = getSecureSettingsLocked(userId);
+ final Setting currentSetting = secureSettings.getSettingLocked(
+ Secure.VOLUME_HUSH_GESTURE);
+ if (currentSetting.isNull()) {
+ secureSettings.insertSettingLocked(
+ Secure.VOLUME_HUSH_GESTURE,
+ Integer.toString(Secure.VOLUME_HUSH_VIBRATE),
+ null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+
+ currentVersion = 162;
+ }
+
// vXXX: Add new settings above this point.
if (currentVersion != newVersion) {
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java
index e2a8fba2f1c7..b6f51bc4d781 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java
@@ -17,8 +17,8 @@
package com.android.providers.settings;
import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.fail;
import android.content.ContentResolver;
@@ -32,9 +32,8 @@ import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;
-import org.junit.Test;
-
import java.util.concurrent.atomic.AtomicBoolean;
+import org.junit.Test;
/**
* Tests for the SettingContentProvider.
@@ -688,4 +687,112 @@ public class SettingsProviderTest extends BaseSettingsProviderTest {
cursor.close();
}
}
+
+ @Test
+ public void testUpdateLocationProvidersAllowedLocked_enableProviders() throws Exception {
+ setSettingViaFrontEndApiAndAssertSuccessfulChange(
+ SETTING_TYPE_SECURE,
+ Settings.Secure.LOCATION_MODE,
+ String.valueOf(Settings.Secure.LOCATION_MODE_OFF),
+ UserHandle.USER_SYSTEM);
+
+ // Enable one provider
+ updateStringViaProviderApiSetting(
+ SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+gps");
+
+ assertEquals(
+ "Wrong location providers",
+ "gps",
+ queryStringViaProviderApi(
+ SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
+
+ // Enable a list of providers, including the one that is already enabled
+ updateStringViaProviderApiSetting(
+ SETTING_TYPE_SECURE,
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "+gps,+network,+network");
+
+ assertEquals(
+ "Wrong location providers",
+ "gps,network",
+ queryStringViaProviderApi(
+ SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
+ }
+
+ @Test
+ public void testUpdateLocationProvidersAllowedLocked_disableProviders() throws Exception {
+ setSettingViaFrontEndApiAndAssertSuccessfulChange(
+ SETTING_TYPE_SECURE,
+ Settings.Secure.LOCATION_MODE,
+ String.valueOf(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY),
+ UserHandle.USER_SYSTEM);
+
+ // Disable providers that were enabled
+ updateStringViaProviderApiSetting(
+ SETTING_TYPE_SECURE,
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "-gps,-network");
+
+ assertEquals(
+ "Wrong location providers",
+ "",
+ queryStringViaProviderApi(
+ SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
+
+ // Disable a provider that was not enabled
+ updateStringViaProviderApiSetting(
+ SETTING_TYPE_SECURE,
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "-test");
+
+ assertEquals(
+ "Wrong location providers",
+ "",
+ queryStringViaProviderApi(
+ SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
+ }
+
+ @Test
+ public void testUpdateLocationProvidersAllowedLocked_enableAndDisable() throws Exception {
+ setSettingViaFrontEndApiAndAssertSuccessfulChange(
+ SETTING_TYPE_SECURE,
+ Settings.Secure.LOCATION_MODE,
+ String.valueOf(Settings.Secure.LOCATION_MODE_OFF),
+ UserHandle.USER_SYSTEM);
+
+ updateStringViaProviderApiSetting(
+ SETTING_TYPE_SECURE,
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "+gps,+network,+test");
+ updateStringViaProviderApiSetting(
+ SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test");
+
+ assertEquals(
+ "Wrong location providers",
+ "gps,network",
+ queryStringViaProviderApi(
+ SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
+ }
+
+ @Test
+ public void testUpdateLocationProvidersAllowedLocked_invalidInput() throws Exception {
+ setSettingViaFrontEndApiAndAssertSuccessfulChange(
+ SETTING_TYPE_SECURE,
+ Settings.Secure.LOCATION_MODE,
+ String.valueOf(Settings.Secure.LOCATION_MODE_OFF),
+ UserHandle.USER_SYSTEM);
+
+ // update providers with a invalid string
+ updateStringViaProviderApiSetting(
+ SETTING_TYPE_SECURE,
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "+gps, invalid-string");
+
+ // Verifies providers list does not change
+ assertEquals(
+ "Wrong location providers",
+ "",
+ queryStringViaProviderApi(
+ SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED));
+ }
}
diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk
index f65efb893e34..68293d964601 100644
--- a/packages/SystemUI/Android.mk
+++ b/packages/SystemUI/Android.mk
@@ -37,6 +37,7 @@ LOCAL_SRC_FILES := \
LOCAL_STATIC_ANDROID_LIBRARIES := \
SystemUIPluginLib \
SystemUISharedLib \
+ android-support-car \
android-support-v4 \
android-support-v7-recyclerview \
android-support-v7-preference \
diff --git a/packages/SystemUI/res/drawable/car_rounded_bg_bottom.xml b/packages/SystemUI/res/drawable/car_rounded_bg_bottom.xml
new file mode 100644
index 000000000000..25b449ab3a8a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/car_rounded_bg_bottom.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="?android:attr/colorBackgroundFloating" />
+ <corners
+ android:bottomLeftRadius="@dimen/car_radius_3"
+ android:topLeftRadius="0dp"
+ android:bottomRightRadius="@dimen/car_radius_3"
+ android:topRightRadius="0dp"
+ />
+</shape>
diff --git a/packages/SystemUI/res/drawable/heads_up_scrim.xml b/packages/SystemUI/res/drawable/heads_up_scrim.xml
deleted file mode 100644
index 59000fcf37d2..000000000000
--- a/packages/SystemUI/res/drawable/heads_up_scrim.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- ~ Copyright (C) 2014 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient
- android:type="linear"
- android:angle="-90"
- android:startColor="#55000000"
- android:endColor="#00000000" />
-</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_ime_switcher_default.xml b/packages/SystemUI/res/drawable/ic_ime_switcher_default.xml
index 3345f61a3cf2..6a7f18b80b9f 100644
--- a/packages/SystemUI/res/drawable/ic_ime_switcher_default.xml
+++ b/packages/SystemUI/res/drawable/ic_ime_switcher_default.xml
@@ -20,6 +20,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
- android:pathData="M20.000000,5.000000L4.000000,5.000000C2.900000,5.000000 2.000000,5.900000 2.000000,7.000000l0.000000,10.000000c0.000000,1.100000 0.900000,2.000000 2.000000,2.000000l16.000000,0.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000L22.000000,7.000000C22.000000,5.900000 21.100000,5.000000 20.000000,5.000000zM11.000000,8.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000L11.000000,8.000000zM11.000000,11.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000L11.000000,11.000000zM8.000000,8.000000l2.000000,0.000000l0.000000,2.000000L8.000000,10.000000L8.000000,8.000000zM8.000000,11.000000l2.000000,0.000000l0.000000,2.000000L8.000000,13.000000L8.000000,11.000000zM7.000000,13.000000L5.000000,13.000000l0.000000,-2.000000l2.000000,0.000000L7.000000,13.000000zM7.000000,10.000000L5.000000,10.000000L5.000000,8.000000l2.000000,0.000000L7.000000,10.000000zM16.000000,17.000000L8.000000,17.000000l0.000000,-2.000000l8.000000,0.000000L16.000000,17.000000zM16.000000,13.000000l-2.000000,0.000000l0.000000,-2.000000l2.000000,0.000000L16.000000,13.000000zM16.000000,10.000000l-2.000000,0.000000L14.000000,8.000000l2.000000,0.000000L16.000000,10.000000zM19.000000,13.000000l-2.000000,0.000000l0.000000,-2.000000l2.000000,0.000000L19.000000,13.000000zM19.000000,10.000000l-2.000000,0.000000L17.000000,8.000000l2.000000,0.000000L19.000000,10.000000z"
+ android:pathData="M21,4H3C1.9,4 1,4.9 1,6v13c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V6C23,4.9 22.1,4 21,4zM21,19H3V6h18V19zM9,8h2v2H9V8zM5,8h2v2H5V8zM8,16h8v1H8V16zM13,8h2v2h-2V8zM9,12h2v2H9V12zM5,12h2v2H5V12zM13,12h2v2h-2V12zM17,8h2v2h-2V8zM17,12h2v2h-2V12z"
android:fillColor="?attr/singleToneColor"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_lock_lockdown.xml b/packages/SystemUI/res/drawable/ic_lock_lockdown.xml
index b517fc89e094..65b981361251 100644
--- a/packages/SystemUI/res/drawable/ic_lock_lockdown.xml
+++ b/packages/SystemUI/res/drawable/ic_lock_lockdown.xml
@@ -20,6 +20,7 @@ Copyright (C) 2018 The Android Open Source Project
android:viewportHeight="24.0">
<path
- android:fillColor="#757575"
+ android:fillColor="#000000"
+ android:alpha="0.87"
android:pathData="M18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.8 -2.2,-5.0 -5.0,-5.0C9.2,1.0 7.0,3.2 7.0,6.0l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0C20.0,8.9 19.1,8.0 18.0,8.0zM12.0,17.0c-1.1,0.0 -2.0,-0.9 -2.0,-2.0s0.9,-2.0 2.0,-2.0c1.1,0.0 2.0,0.9 2.0,2.0S13.1,17.0 12.0,17.0zM15.1,8.0L8.9,8.0L8.9,6.0c0.0,-1.7 1.4,-3.1 3.1,-3.1c1.7,0.0 3.1,1.4 3.1,3.1L15.1,8.0z"/>
</vector>
diff --git a/packages/SystemUI/res/layout/car_volume_dialog.xml b/packages/SystemUI/res/layout/car_volume_dialog.xml
new file mode 100644
index 000000000000..dca50a5e929c
--- /dev/null
+++ b/packages/SystemUI/res/layout/car_volume_dialog.xml
@@ -0,0 +1,68 @@
+<!--
+ 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.
+-->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/car_margin"
+ android:layout_marginEnd="@dimen/car_margin"
+ android:background="@drawable/car_rounded_bg_bottom"
+ android:theme="@style/qs_theme"
+ android:clipChildren="false" >
+ <LinearLayout
+ android:id="@+id/volume_dialog"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal|top"
+ android:orientation="vertical"
+ android:clipChildren="false" >
+
+ <LinearLayout
+ android:id="@+id/main"
+ android:layout_width="match_parent"
+ android:minWidth="@dimen/volume_dialog_panel_width"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:elevation="@dimen/volume_panel_elevation" >
+ <LinearLayout
+ android:id="@+id/car_volume_dialog_rows"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:orientation="vertical" >
+ <!-- volume rows added and removed here! :-) -->
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/car_single_line_list_item_height"
+ android:gravity="center"
+ android:layout_marginEnd="@dimen/car_keyline_1">
+ <ImageButton
+ android:id="@+id/expand"
+ android:layout_gravity="center"
+ android:layout_width="@dimen/car_primary_icon_size"
+ android:layout_height="@dimen/car_primary_icon_size"
+ android:layout_marginEnd="@dimen/car_keyline_1"
+ android:src="@drawable/car_ic_arrow_drop_up"
+ android:tint="@color/car_tint"
+ android:scaleType="fitCenter"
+ />
+ </FrameLayout>
+</FrameLayout> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/car_volume_dialog_row.xml b/packages/SystemUI/res/layout/car_volume_dialog_row.xml
new file mode 100644
index 000000000000..14baf49f819b
--- /dev/null
+++ b/packages/SystemUI/res/layout/car_volume_dialog_row.xml
@@ -0,0 +1,47 @@
+<!--
+ 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.
+-->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:tag="row"
+ android:layout_height="@dimen/car_single_line_list_item_height"
+ android:layout_width="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:theme="@style/qs_theme">
+
+ <LinearLayout
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:gravity="center"
+ android:layout_gravity="center"
+ android:orientation="horizontal" >
+ <com.android.keyguard.AlphaOptimizedImageButton
+ android:id="@+id/volume_row_icon"
+ android:layout_width="@dimen/car_primary_icon_size"
+ android:layout_height="@dimen/car_primary_icon_size"
+ android:layout_marginStart="@dimen/car_keyline_1"
+ android:tint="@color/car_tint"
+ android:scaleType="fitCenter"
+ android:soundEffectsEnabled="false" />
+ <SeekBar
+ android:id="@+id/volume_row_slider"
+ android:clickable="true"
+ android:layout_marginStart="@dimen/car_keyline_3"
+ android:layout_marginEnd="@dimen/car_keyline_3"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/car_single_line_list_item_height"/>
+ </LinearLayout>
+</FrameLayout>
diff --git a/packages/SystemUI/res/layout/heads_up_status_bar_layout.xml b/packages/SystemUI/res/layout/heads_up_status_bar_layout.xml
new file mode 100644
index 000000000000..bacb5c13d407
--- /dev/null
+++ b/packages/SystemUI/res/layout/heads_up_status_bar_layout.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<com.android.systemui.statusbar.HeadsUpStatusBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:visibility="invisible"
+ android:id="@+id/heads_up_status_bar_view"
+ android:alpha="0"
+>
+ <!-- This is a space just used as a layout and it's not actually displaying anything. We're
+ repositioning the statusbar icon to the position where this is laid out when showing this
+ view. -->
+ <Space
+ android:id="@+id/icon_placeholder"
+ android:layout_width="@dimen/status_bar_icon_drawing_size"
+ android:layout_height="@dimen/status_bar_icon_drawing_size"
+ android:layout_gravity="center_vertical"
+ />
+ <TextView
+ android:id="@+id/text"
+ android:textAppearance="@style/TextAppearance.HeadsUpStatusBarText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"
+ android:textAlignment="viewStart"
+ android:paddingStart="6dp"
+ android:layout_weight="1"
+ android:layout_gravity="center_vertical"
+ />
+
+</com.android.systemui.statusbar.HeadsUpStatusBarView>
diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml
index 2da03d2590e7..cc6e3bfbebaa 100644
--- a/packages/SystemUI/res/layout/mobile_signal_group.xml
+++ b/packages/SystemUI/res/layout/mobile_signal_group.xml
@@ -50,6 +50,7 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical"
+ android:paddingEnd="1dp"
android:visibility="gone" />
<Space
android:id="@+id/mobile_roaming_space"
diff --git a/packages/SystemUI/res/layout/notification_icon_area.xml b/packages/SystemUI/res/layout/notification_icon_area.xml
index 6732e6c62e8e..fa696cc1f54c 100644
--- a/packages/SystemUI/res/layout/notification_icon_area.xml
+++ b/packages/SystemUI/res/layout/notification_icon_area.xml
@@ -18,12 +18,14 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/notification_icon_area_inner"
android:layout_width="match_parent"
- android:layout_height="match_parent" >
+ android:layout_height="match_parent"
+ android:clipChildren="false">
<com.android.systemui.statusbar.phone.NotificationIconContainer
android:id="@+id/notificationIcons"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:gravity="center_vertical"
- android:orientation="horizontal"/>
+ android:orientation="horizontal"
+ android:clipChildren="false"/>
</com.android.keyguard.AlphaOptimizedLinearLayout> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/rounded_corners.xml b/packages/SystemUI/res/layout/rounded_corners.xml
index 734c877d7829..26cf7920c35b 100644
--- a/packages/SystemUI/res/layout/rounded_corners.xml
+++ b/packages/SystemUI/res/layout/rounded_corners.xml
@@ -14,7 +14,7 @@
** See the License for the specific language governing permissions and
** limitations under the License.
-->
-<FrameLayout
+<com.android.systemui.RegionInterceptingFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -32,4 +32,4 @@
android:tint="#ff000000"
android:layout_gravity="right|bottom"
android:src="@drawable/rounded" />
-</FrameLayout>
+</com.android.systemui.RegionInterceptingFrameLayout>
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index 8c0b9bab35a0..9d336e25985f 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -3,16 +3,16 @@
**
** Copyright 2006, The Android Open Source Project
**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
**
-** http://www.apache.org/licenses/LICENSE-2.0
+** http://www.apache.org/licenses/LICENSE-2.0
**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
@@ -34,7 +34,7 @@
android:id="@+id/notification_lights_out"
android:layout_width="@dimen/status_bar_icon_size"
android:layout_height="match_parent"
- android:paddingStart="6dip"
+ android:paddingStart="@dimen/status_bar_padding_start"
android:paddingBottom="2dip"
android:src="@drawable/ic_sysbar_lights_out_dot_small"
android:scaleType="center"
@@ -44,7 +44,7 @@
<LinearLayout android:id="@+id/status_bar_contents"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingStart="6dp"
+ android:paddingStart="@dimen/status_bar_padding_start"
android:paddingEnd="8dp"
android:orientation="horizontal"
>
@@ -53,33 +53,41 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout="@layout/operator_name" />
-
- <LinearLayout
+ <FrameLayout
android:layout_height="match_parent"
android:layout_width="0dp"
- android:layout_weight="1"
- >
- <com.android.systemui.statusbar.policy.Clock
- android:id="@+id/clock"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:textAppearance="@style/TextAppearance.StatusBar.Clock"
- android:singleLine="true"
- android:paddingStart="@dimen/status_bar_left_clock_starting_padding"
- android:paddingEnd="@dimen/status_bar_left_clock_end_padding"
- android:gravity="center_vertical|start"
- />
+ android:layout_weight="1">
- <!-- The alpha of this area is controlled from both PhoneStatusBarTransitions and
- PhoneStatusBar (DISABLE_NOTIFICATION_ICONS). -->
- <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
- android:id="@+id/notification_icon_area"
- android:layout_width="0dp"
+ <include layout="@layout/heads_up_status_bar_layout" />
+
+ <LinearLayout
android:layout_height="match_parent"
- android:layout_weight="1"
- android:orientation="horizontal" />
+ android:layout_width="match_parent"
+ android:clipChildren="false"
+ >
+ <com.android.systemui.statusbar.policy.Clock
+ android:id="@+id/clock"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:textAppearance="@style/TextAppearance.StatusBar.Clock"
+ android:singleLine="true"
+ android:paddingStart="@dimen/status_bar_left_clock_starting_padding"
+ android:paddingEnd="@dimen/status_bar_left_clock_end_padding"
+ android:gravity="center_vertical|start"
+ />
+
+ <!-- The alpha of this area is controlled from both PhoneStatusBarTransitions and
+ PhoneStatusBar (DISABLE_NOTIFICATION_ICONS). -->
+ <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
+ android:id="@+id/notification_icon_area"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="horizontal"
+ android:clipChildren="false"/>
- </LinearLayout>
+ </LinearLayout>
+ </FrameLayout>
<!-- Space should cover the notch (if it exists) and let other views lay out around it -->
<android.widget.Space
diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml
index ef442e539c0c..75403b91d299 100644
--- a/packages/SystemUI/res/layout/super_status_bar.xml
+++ b/packages/SystemUI/res/layout/super_status_bar.xml
@@ -51,14 +51,6 @@
sysui:ignoreRightInset="true"
/>
- <com.android.systemui.statusbar.AlphaOptimizedView
- android:id="@+id/heads_up_scrim"
- android:layout_width="match_parent"
- android:layout_height="@dimen/heads_up_scrim_height"
- android:background="@drawable/heads_up_scrim"
- sysui:ignoreRightInset="true"
- android:importantForAccessibility="no"/>
-
<FrameLayout
android:id="@+id/status_bar_container"
android:layout_width="match_parent"
diff --git a/location/java/android/location/IFusedProvider.aidl b/packages/SystemUI/res/values-sw600dp/bools.xml
index e86ad1ac5147..05e38bdb8389 100644
--- a/location/java/android/location/IFusedProvider.aidl
+++ b/packages/SystemUI/res/values-sw600dp/bools.xml
@@ -1,5 +1,6 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
+<?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.
@@ -12,21 +13,9 @@
* WITHOUT 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.location;
-
-import android.hardware.location.IFusedLocationHardware;
-
-/**
- * Interface definition for Location providers that require FLP services.
- * @hide
- */
-oneway interface IFusedProvider {
- /**
- * Provides access to a FusedLocationHardware instance needed for the provider to work.
- *
- * @param instance The FusedLocationHardware available for the provider to use.
- */
- void onFusedLocationHardwareChange(in IFusedLocationHardware instance);
-}
+*/
+-->
+<resources>
+ <!-- Whether to show the user switcher in quick settings when only a single user is present. -->
+ <bool name="qs_show_user_switcher_for_single_user">true</bool>
+</resources>
diff --git a/packages/SystemUI/res/values/bools.xml b/packages/SystemUI/res/values/bools.xml
new file mode 100644
index 000000000000..499e24e6ecbd
--- /dev/null
+++ b/packages/SystemUI/res/values/bools.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+-->
+<resources>
+ <!-- Whether to show the user switcher in quick settings when only a single user is present. -->
+ <bool name="qs_show_user_switcher_for_single_user">false</bool>
+</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 5b038b1b42ff..906ca4a536ca 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -79,9 +79,6 @@
<!-- The color of the material notification background when dark -->
<color name="notification_material_background_dark_color">#ff333333</color>
- <!-- The color of the material notification background when low priority -->
- <color name="notification_material_background_low_priority_color">#fff5f5f5</color>
-
<!-- The color of the dividing line between grouped notifications. -->
<color name="notification_divider_color">#FF616161</color>
@@ -91,9 +88,6 @@
<!-- The color of the ripples on the untinted notifications -->
<color name="notification_ripple_untinted_color">#28000000</color>
- <!-- The color of the ripples on the low priority notifications -->
- <color name="notification_ripple_color_low_priority">#30000000</color>
-
<!-- The color of the ripples on the tinted notifications -->
<color name="notification_ripple_tinted_color">#30ffffff</color>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index cb3c282f703b..4513f145ead9 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -110,6 +110,12 @@
<!-- Side padding on the lockscreen on the side of notifications -->
<dimen name="notification_side_paddings">4dp</dimen>
+ <!-- padding between the heads up and the statusbar -->
+ <dimen name="heads_up_status_bar_padding">8dp</dimen>
+
+ <!-- heads up elevation that is added if the view is pinned -->
+ <dimen name="heads_up_pinned_elevation">16dp</dimen>
+
<!-- Height of a messaging notifications with actions at least. Not that this is an upper bound
and the notification won't use this much, but is measured with wrap_content -->
<dimen name="notification_messaging_actions_min_height">196dp</dimen>
@@ -451,7 +457,6 @@
<dimen name="keyguard_clock_notifications_margin">30dp</dimen>
<!-- Minimum margin between clock and status bar -->
<dimen name="keyguard_clock_top_margin">36dp</dimen>
- <dimen name="heads_up_scrim_height">250dp</dimen>
<item name="scrim_behind_alpha" format="float" type="dimen">0.62</item>
@@ -663,7 +668,7 @@
<dimen name="signal_cluster_margin_start">2.5dp</dimen>
<!-- Padding between signal cluster and battery icon -->
- <dimen name="signal_cluster_battery_padding">7dp</dimen>
+ <dimen name="signal_cluster_battery_padding">6dp</dimen>
<!-- Padding for signal cluster and battery icon when there are not icons in signal cluster -->
<dimen name="no_signal_cluster_battery_padding">3dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index e0e666c22ee8..a4b76080ed48 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -669,7 +669,7 @@
<string name="ethernet_label">Ethernet</string>
<!-- QuickSettings: Onboarding text that introduces users to long press on an option in order to view the option's menu in Settings [CHAR LIMIT=NONE] -->
- <string name="quick_settings_header_onboarding_text">Press &amp; hold on the icons for more options</string>
+ <string name="quick_settings_header_onboarding_text">Touch &amp; hold icons for more options</string>
<!-- QuickSettings: Do not disturb [CHAR LIMIT=NONE] -->
<string name="quick_settings_dnd_label">Do not disturb</string>
<!-- QuickSettings: Do not disturb - Priority only [CHAR LIMIT=NONE] -->
@@ -1353,8 +1353,6 @@
<string name="volume_dialog_title">%s volume controls</string>
- <string name="volume_dialog_ringer_guidance_vibrate">Calls and notifications will vibrate</string>
- <string name="volume_dialog_ringer_guidance_silent">Calls and notifications will be muted</string>
<string name="volume_dialog_ringer_guidance_ring">Calls and notifications will ring</string>
<string name="output_title">Media output</string>
@@ -1845,11 +1843,14 @@
<string name="right_icon">Right icon</string>
<!-- Label for area where tiles can be dragged out of [CHAR LIMIT=60] -->
- <string name="drag_to_add_tiles">Drag to add tiles</string>
+ <string name="drag_to_add_tiles">Hold and drag to add tiles</string>
<!-- Label for area where tiles can be dragged in to [CHAR LIMIT=60] -->
<string name="drag_to_remove_tiles">Drag here to remove</string>
+ <!-- Label to indicate to users that additional tiles cannot be removed. [CHAR LIMIT=60] -->
+ <string name="drag_to_remove_disabled">You need at least 6 tiles</string>
+
<!-- Button to edit the tile ordering of quick settings [CHAR LIMIT=60] -->
<string name="qs_edit">Edit</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 1470dfa4d05d..20d883435aef 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -490,6 +490,10 @@
<item name="android:paddingEnd">8dp</item>
</style>
+ <style name="TextAppearance.HeadsUpStatusBarText"
+ parent="@*android:style/TextAppearance.Material.Notification.Info">
+ </style>
+
<style name="edit_theme" parent="qs_base">
<item name="android:colorBackground">?android:attr/colorSecondary</item>
</style>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 9d5fb526fa73..d24675c67188 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -1726,6 +1726,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
callback.onPhoneStateChanged(mPhoneState);
callback.onRefreshCarrierInfo();
callback.onClockVisibilityChanged();
+ callback.onKeyguardVisibilityChangedRaw(mKeyguardIsVisible);
for (Entry<Integer, SimData> data : mSimDatas.entrySet()) {
final SimData state = data.getValue();
callback.onSimStateChanged(state.subId, state.slotId, state.simState);
diff --git a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
index 948178802003..3bdb247b64c2 100644
--- a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
@@ -175,9 +175,6 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
mRotatedBackground = true;
mBackground.setRotatedBackground(true);
LinearLayout linearLayout = (LinearLayout) mChild;
- if (to == ROTATION_SEASCAPE) {
- swapOrder(linearLayout);
- }
if (mSwapOrientation) {
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
}
@@ -188,9 +185,6 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
mRotatedBackground = false;
mBackground.setRotatedBackground(false);
LinearLayout linearLayout = (LinearLayout) mChild;
- if (from == ROTATION_SEASCAPE) {
- swapOrder(linearLayout);
- }
if (mSwapOrientation) {
linearLayout.setOrientation(LinearLayout.VERTICAL);
}
@@ -199,15 +193,6 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
}
}
- private void swapOrder(LinearLayout linearLayout) {
- ArrayList<View> children = new ArrayList<>();
- for (int i = 0; i < linearLayout.getChildCount(); i++) {
- children.add(0, linearLayout.getChildAt(0));
- linearLayout.removeViewAt(0);
- }
- children.forEach(v -> linearLayout.addView(v));
- }
-
private void rotateRight() {
rotateRight(this);
rotateRight(mChild);
diff --git a/packages/SystemUI/src/com/android/systemui/RegionInterceptingFrameLayout.java b/packages/SystemUI/src/com/android/systemui/RegionInterceptingFrameLayout.java
new file mode 100644
index 000000000000..646f69eede94
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/RegionInterceptingFrameLayout.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui;
+
+import android.content.Context;
+import android.graphics.Region;
+import android.graphics.Region.Op;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.InternalInsetsInfo;
+import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
+import android.widget.FrameLayout;
+
+/**
+ * Frame layout that will intercept the touches of children if they want to
+ */
+public class RegionInterceptingFrameLayout extends FrameLayout {
+ public RegionInterceptingFrameLayout(Context context) {
+ super(context);
+ }
+
+ public RegionInterceptingFrameLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public RegionInterceptingFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public RegionInterceptingFrameLayout(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsListener);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ getViewTreeObserver().removeOnComputeInternalInsetsListener(mInsetsListener);
+ }
+
+ private final OnComputeInternalInsetsListener mInsetsListener = internalInsetsInfo -> {
+ internalInsetsInfo.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
+ internalInsetsInfo.touchableRegion.setEmpty();
+ for (int i = 0; i < getChildCount(); i++) {
+ View child = getChildAt(i);
+ if (!(child instanceof RegionInterceptableView)) {
+ continue;
+ }
+ RegionInterceptableView riv = (RegionInterceptableView) child;
+ if (!riv.shouldInterceptTouch()) {
+ continue;
+ }
+ Region unionRegion = riv.getInterceptRegion();
+ if (unionRegion == null) {
+ continue;
+ }
+
+ internalInsetsInfo.touchableRegion.op(riv.getInterceptRegion(), Op.UNION);
+ }
+ };
+
+ public interface RegionInterceptableView {
+ default public boolean shouldInterceptTouch() {
+ return false;
+ }
+
+ public Region getInterceptRegion();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 9a20c81c4919..a0fa69e61f20 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -49,6 +49,7 @@ import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
+import com.android.systemui.RegionInterceptingFrameLayout.RegionInterceptableView;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
import com.android.systemui.plugins.qs.QS;
@@ -232,8 +233,7 @@ public class ScreenDecorations extends SystemUI implements Tunable {
ViewGroup.LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
- WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
| WindowManager.LayoutParams.FLAG_SLIPPERY
@@ -317,7 +317,8 @@ public class ScreenDecorations extends SystemUI implements Tunable {
}
}
- public static class DisplayCutoutView extends View implements DisplayManager.DisplayListener {
+ public static class DisplayCutoutView extends View implements DisplayManager.DisplayListener,
+ RegionInterceptableView {
private final DisplayInfo mInfo = new DisplayInfo();
private final Paint mPaint = new Paint();
@@ -468,5 +469,19 @@ public class ScreenDecorations extends SystemUI implements Tunable {
}
}
}
+
+ @Override
+ public boolean shouldInterceptTouch() {
+ return mInfo.displayCutout != null && getVisibility() == VISIBLE;
+ }
+
+ @Override
+ public Region getInterceptRegion() {
+ if (mInfo.displayCutout == null) {
+ return null;
+ }
+
+ return mInfo.displayCutout.getBounds();
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 91edfda06261..391843ce55ba 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -100,10 +100,10 @@ public class SystemUIFactory {
}
public ScrimController createScrimController(LightBarController lightBarController,
- ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim,
- LockscreenWallpaper lockscreenWallpaper, Consumer<Integer> scrimVisibleListener,
- DozeParameters dozeParameters, AlarmManager alarmManager) {
- return new ScrimController(lightBarController, scrimBehind, scrimInFront, headsUpScrim,
+ ScrimView scrimBehind, ScrimView scrimInFront, LockscreenWallpaper lockscreenWallpaper,
+ Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
+ AlarmManager alarmManager) {
+ return new ScrimController(lightBarController, scrimBehind, scrimInFront,
scrimVisibleListener, dozeParameters, alarmManager);
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index 092f3d241d6c..5bf62f638235 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -22,8 +22,10 @@ import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Handler;
+import android.os.PowerManager;
import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SystemUIApplication;
@@ -46,7 +48,7 @@ public class DozeFactory {
DozeHost host = getHost(dozeService);
AmbientDisplayConfiguration config = new AmbientDisplayConfiguration(context);
- DozeParameters params = new DozeParameters(context);
+ DozeParameters params = DozeParameters.getInstance(context);
Handler handler = new Handler();
WakeLock wakeLock = new DelayedWakeLock(handler,
WakeLock.createPartial(context, "Doze"));
@@ -64,9 +66,9 @@ public class DozeFactory {
createDozeTriggers(context, sensorManager, host, alarmManager, config, params,
handler, wakeLock, machine),
createDozeUi(context, host, wakeLock, machine, handler, alarmManager, params),
- new DozeScreenState(wrappedService, handler, params),
+ new DozeScreenState(wrappedService, handler, params, wakeLock),
createDozeScreenBrightness(context, wrappedService, sensorManager, host, handler),
- new DozeWallpaperState(context)
+ new DozeWallpaperState(context, params)
});
return machine;
@@ -92,7 +94,8 @@ public class DozeFactory {
private DozeMachine.Part createDozeUi(Context context, DozeHost host, WakeLock wakeLock,
DozeMachine machine, Handler handler, AlarmManager alarmManager,
DozeParameters params) {
- return new DozeUi(context, alarmManager, machine, wakeLock, host, handler, params);
+ return new DozeUi(context, alarmManager, machine, wakeLock, host, handler, params,
+ KeyguardUpdateMonitor.getInstance(context));
}
public static DozeHost getHost(DozeService service) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
index 6ff8e3db25e5..152b9fc3db4d 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
@@ -92,17 +92,17 @@ public class DozeMachine {
switch (this) {
case UNINITIALIZED:
case INITIALIZED:
- case DOZE:
+ case DOZE_REQUEST_PULSE:
+ return parameters.shouldControlScreenOff() ? Display.STATE_ON
+ : Display.STATE_OFF;
case DOZE_AOD_PAUSED:
+ case DOZE:
return Display.STATE_OFF;
case DOZE_PULSING:
return Display.STATE_ON;
case DOZE_AOD:
case DOZE_AOD_PAUSING:
return Display.STATE_DOZE_SUSPEND;
- case DOZE_REQUEST_PULSE:
- return parameters.getDisplayNeedsBlanking() ? Display.STATE_OFF
- : Display.STATE_ON;
default:
return Display.STATE_UNKNOWN;
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java
index 7d145644e737..f72bff5d651e 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java
@@ -21,6 +21,7 @@ import android.util.Log;
import android.view.Display;
import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.util.wakelock.WakeLock;
/**
* Controls the screen when dozing.
@@ -30,18 +31,27 @@ public class DozeScreenState implements DozeMachine.Part {
private static final boolean DEBUG = DozeService.DEBUG;
private static final String TAG = "DozeScreenState";
+ /**
+ * Delay entering low power mode when animating to make sure that we'll have
+ * time to move all elements into their final positions while still at 60 fps.
+ */
+ private static final int ENTER_DOZE_DELAY = 3000;
+
private final DozeMachine.Service mDozeService;
private final Handler mHandler;
private final Runnable mApplyPendingScreenState = this::applyPendingScreenState;
private final DozeParameters mParameters;
private int mPendingScreenState = Display.STATE_UNKNOWN;
+ private boolean mWakeLockHeld;
+ private WakeLock mWakeLock;
public DozeScreenState(DozeMachine.Service service, Handler handler,
- DozeParameters parameters) {
+ DozeParameters parameters, WakeLock wakeLock) {
mDozeService = service;
mHandler = handler;
mParameters = parameters;
+ mWakeLock = wakeLock;
}
@Override
@@ -69,12 +79,33 @@ public class DozeScreenState implements DozeMachine.Part {
// that the screen turns on again before the navigation bar is hidden. To work around
// that, wait for a traversal to happen before applying the initial screen state.
mPendingScreenState = screenState;
+
+ // Delay screen state transitions even longer while animations are running.
+ boolean shouldDelayTransition = newState == DozeMachine.State.DOZE_AOD
+ && mParameters.shouldControlScreenOff();
+
+ if (!mWakeLockHeld && shouldDelayTransition) {
+ mWakeLockHeld = true;
+ mWakeLock.acquire();
+ }
+
if (!messagePending) {
- mHandler.post(mApplyPendingScreenState);
+ if (DEBUG) {
+ Log.d(TAG, "Display state changed to " + screenState + " delayed by "
+ + (shouldDelayTransition ? ENTER_DOZE_DELAY : 1));
+ }
+
+ if (shouldDelayTransition) {
+ mHandler.postDelayed(mApplyPendingScreenState, ENTER_DOZE_DELAY);
+ } else {
+ mHandler.post(mApplyPendingScreenState);
+ }
+ } else if (DEBUG) {
+ Log.d(TAG, "Pending display state change to " + screenState);
}
- return;
+ } else {
+ applyScreenState(screenState);
}
- applyScreenState(screenState);
}
private void applyPendingScreenState() {
@@ -87,6 +118,10 @@ public class DozeScreenState implements DozeMachine.Part {
if (DEBUG) Log.d(TAG, "setDozeScreenState(" + screenState + ")");
mDozeService.setDozeScreenState(screenState);
mPendingScreenState = Display.STATE_UNKNOWN;
+ if (mWakeLockHeld) {
+ mWakeLockHeld = false;
+ mWakeLock.release();
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
index 75f1b501b3f4..778e63092150 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
@@ -25,6 +25,9 @@ import android.os.SystemClock;
import android.text.format.Formatter;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.wakelock.WakeLock;
@@ -44,22 +47,46 @@ public class DozeUi implements DozeMachine.Part {
private final WakeLock mWakeLock;
private final DozeMachine mMachine;
private final AlarmTimeout mTimeTicker;
- private final boolean mCanAnimateWakeup;
+ private final boolean mCanAnimateTransition;
+ private final DozeParameters mDozeParameters;
+
+ private boolean mKeyguardShowing;
+ private final KeyguardUpdateMonitorCallback mKeyguardVisibilityCallback =
+ new KeyguardUpdateMonitorCallback() {
+
+ @Override
+ public void onKeyguardVisibilityChanged(boolean showing) {
+ mKeyguardShowing = showing;
+ updateAnimateScreenOff();
+ }
+ };
private long mLastTimeTickElapsed = 0;
public DozeUi(Context context, AlarmManager alarmManager, DozeMachine machine,
WakeLock wakeLock, DozeHost host, Handler handler,
- DozeParameters params) {
+ DozeParameters params, KeyguardUpdateMonitor keyguardUpdateMonitor) {
mContext = context;
mMachine = machine;
mWakeLock = wakeLock;
mHost = host;
mHandler = handler;
- mCanAnimateWakeup = !params.getDisplayNeedsBlanking();
-
+ mCanAnimateTransition = !params.getDisplayNeedsBlanking();
+ mDozeParameters = params;
mTimeTicker = new AlarmTimeout(alarmManager, this::onTimeTick, "doze_time_tick", handler);
- mHost.setAnimateScreenOff(params.getCanControlScreenOffAnimation());
+ keyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback);
+ }
+
+ /**
+ * Decide if we're taking over the screen-off animation
+ * when the device was configured to skip doze after screen off.
+ */
+ private void updateAnimateScreenOff() {
+ if (mCanAnimateTransition) {
+ final boolean controlScreenOff = mDozeParameters.getAlwaysOn() && mKeyguardShowing;
+ mDozeParameters.setControlScreenOffAnimation(controlScreenOff);
+ mHost.setAnimateScreenOff(controlScreenOff);
+ }
}
private void pulseWhileDozing(int reason) {
@@ -118,7 +145,7 @@ public class DozeUi implements DozeMachine.Part {
// Keep current state.
break;
default:
- mHost.setAnimateWakeup(mCanAnimateWakeup);
+ mHost.setAnimateWakeup(mCanAnimateTransition && mDozeParameters.getAlwaysOn());
break;
}
}
@@ -170,4 +197,9 @@ public class DozeUi implements DozeMachine.Part {
scheduleTimeTick();
}
+
+ @VisibleForTesting
+ KeyguardUpdateMonitorCallback getKeyguardCallback() {
+ return mKeyguardVisibilityCallback;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java
index 5156272b1ade..9d110fb74d86 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java
@@ -26,7 +26,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.statusbar.phone.DozeParameters;
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import java.io.PrintWriter;
@@ -43,10 +42,10 @@ public class DozeWallpaperState implements DozeMachine.Part {
private boolean mIsAmbientMode;
private final DozeParameters mDozeParameters;
- public DozeWallpaperState(Context context) {
+ public DozeWallpaperState(Context context, DozeParameters dozeParameters) {
this(IWallpaperManager.Stub.asInterface(
ServiceManager.getService(Context.WALLPAPER_SERVICE)),
- new DozeParameters(context), KeyguardUpdateMonitor.getInstance(context));
+ dozeParameters, KeyguardUpdateMonitor.getInstance(context));
}
@VisibleForTesting
@@ -80,7 +79,7 @@ public class DozeWallpaperState implements DozeMachine.Part {
final boolean animated;
if (isAmbientMode) {
- animated = mDozeParameters.getCanControlScreenOffAnimation() && !mKeyguardVisible;
+ animated = mDozeParameters.shouldControlScreenOff();
} else {
animated = !mDozeParameters.getDisplayNeedsBlanking();
}
@@ -88,8 +87,10 @@ public class DozeWallpaperState implements DozeMachine.Part {
if (isAmbientMode != mIsAmbientMode) {
mIsAmbientMode = isAmbientMode;
try {
- Log.i(TAG, "AoD wallpaper state changed to: " + mIsAmbientMode
- + ", animated: " + animated);
+ if (DEBUG) {
+ Log.i(TAG, "AOD wallpaper state changed to: " + mIsAmbientMode
+ + ", animated: " + animated);
+ }
mWallpaperManagerService.setInAmbientMode(mIsAmbientMode, animated);
} catch (RemoteException e) {
// Cannot notify wallpaper manager service, but it's fine, let's just skip it.
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java b/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java
index 951c0ea6a26b..59c7f236caf7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java
@@ -41,21 +41,33 @@ public class WakefulnessLifecycle extends Lifecycle<WakefulnessLifecycle.Observe
}
public void dispatchStartedWakingUp() {
+ if (getWakefulness() == WAKEFULNESS_WAKING) {
+ return;
+ }
setWakefulness(WAKEFULNESS_WAKING);
dispatch(Observer::onStartedWakingUp);
}
public void dispatchFinishedWakingUp() {
+ if (getWakefulness() == WAKEFULNESS_AWAKE) {
+ return;
+ }
setWakefulness(WAKEFULNESS_AWAKE);
dispatch(Observer::onFinishedWakingUp);
}
public void dispatchStartedGoingToSleep() {
+ if (getWakefulness() == WAKEFULNESS_GOING_TO_SLEEP) {
+ return;
+ }
setWakefulness(WAKEFULNESS_GOING_TO_SLEEP);
dispatch(Observer::onStartedGoingToSleep);
}
public void dispatchFinishedGoingToSleep() {
+ if (getWakefulness() == WAKEFULNESS_ASLEEP) {
+ return;
+ }
setWakefulness(WAKEFULNESS_ASLEEP);
dispatch(Observer::onFinishedGoingToSleep);
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index 9a3a825b138c..b89e15da6729 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -27,7 +27,6 @@ import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioAttributes;
-import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
@@ -37,6 +36,7 @@ import android.util.Slog;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.settingslib.Utils;
+import com.android.settingslib.fuelgauge.BatterySaverUtils;
import com.android.settingslib.utils.PowerUtil;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
@@ -72,6 +72,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
"PNW.clickedThermalShutdownWarning";
private static final String ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING =
"PNW.dismissedThermalShutdownWarning";
+ private static final String ACTION_SHOW_START_SAVER_CONFIRMATION =
+ BatterySaverUtils.ACTION_SHOW_START_SAVER_CONFIRMATION;
private static final AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
@@ -404,7 +406,7 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
d.setTitle(R.string.battery_saver_confirmation_title);
d.setMessage(com.android.internal.R.string.battery_saver_description);
d.setNegativeButton(android.R.string.cancel, null);
- d.setPositiveButton(R.string.battery_saver_confirmation_ok, mStartSaverMode);
+ d.setPositiveButton(R.string.battery_saver_confirmation_ok, mStartSaverModeNoConfirmation);
d.setShowForAllUsers(true);
d.setOnDismissListener(new OnDismissListener() {
@Override
@@ -416,8 +418,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
mSaverConfirmation = d;
}
- private void setSaverMode(boolean mode) {
- mPowerMan.setPowerSaveMode(mode);
+ private void setSaverMode(boolean mode, boolean needFirstTimeWarning) {
+ BatterySaverUtils.setPowerSaveMode(mContext, mode, needFirstTimeWarning);
}
private final class Receiver extends BroadcastReceiver {
@@ -431,8 +433,9 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
filter.addAction(ACTION_DISMISSED_TEMP_WARNING);
filter.addAction(ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING);
filter.addAction(ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING);
+ filter.addAction(ACTION_SHOW_START_SAVER_CONFIRMATION);
mContext.registerReceiverAsUser(this, UserHandle.ALL, filter,
- android.Manifest.permission.STATUS_BAR_SERVICE, mHandler);
+ android.Manifest.permission.DEVICE_POWER, mHandler);
}
@Override
@@ -443,6 +446,9 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
dismissLowBatteryNotification();
mContext.startActivityAsUser(mOpenBatterySettings, UserHandle.CURRENT);
} else if (action.equals(ACTION_START_SAVER)) {
+ setSaverMode(true, true);
+ dismissLowBatteryNotification();
+ } else if (action.equals(ACTION_SHOW_START_SAVER_CONFIRMATION)) {
dismissLowBatteryNotification();
showStartSaverConfirmation();
} else if (action.equals(ACTION_DISMISSED_WARNING)) {
@@ -461,15 +467,6 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
}
}
- private final OnClickListener mStartSaverMode = new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- AsyncTask.execute(new Runnable() {
- @Override
- public void run() {
- setSaverMode(true);
- }
- });
- }
- };
+ private final OnClickListener mStartSaverModeNoConfirmation =
+ (dialog, which) -> setSaverMode(true, false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index ac86c8ae097d..f08219a8f742 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -137,24 +137,9 @@ public class PowerUI extends SystemUI {
void updateBatteryWarningLevels() {
int critLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel);
-
- final ContentResolver resolver = mContext.getContentResolver();
- final int defWarnLevel = mContext.getResources().getInteger(
+ int warnLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryWarningLevel);
- final int lowPowerModeTriggerLevel = Settings.Global.getInt(resolver,
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, defWarnLevel);
-
- // Note LOW_POWER_MODE_TRIGGER_LEVEL can take any value between 0 and 100, but
- // for the UI purposes, let's cap it at 15% -- i.e. even if the trigger level is higher
- // like 50%, let's not show the "low battery" notification until it hits
- // config_lowBatteryWarningLevel, which is 15% by default.
- // LOW_POWER_MODE_TRIGGER_LEVEL is still used in other places as-is. For example, if it's
- // 50, then battery saver kicks in when the battery level hits 50%.
- int warnLevel = Math.min(defWarnLevel, lowPowerModeTriggerLevel);
-
- if (warnLevel == 0) {
- warnLevel = defWarnLevel;
- }
+
if (warnLevel < critLevel) {
warnLevel = critLevel;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index ea3a60b93246..892395222d1f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -42,16 +42,14 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
};
- private final ArrayList<TileRecord> mTiles = new ArrayList<TileRecord>();
- private final ArrayList<TilePage> mPages = new ArrayList<TilePage>();
+ private final ArrayList<TileRecord> mTiles = new ArrayList<>();
+ private final ArrayList<TilePage> mPages = new ArrayList<>();
private PageIndicator mPageIndicator;
private int mNumPages;
private PageListener mPageListener;
- private int mPosition;
- private boolean mOffPage;
private boolean mListening;
private Scroller mScroller;
@@ -85,16 +83,12 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
public void setListening(boolean listening) {
if (mListening == listening) return;
mListening = listening;
- if (mListening) {
- setPageListening(mPosition, true);
- if (mOffPage) {
- setPageListening(mPosition + 1, true);
- }
- } else {
- // Make sure no pages are listening.
- for (int i = 0; i < mPages.size(); i++) {
- mPages.get(i).setListening(false);
- }
+ updateListening();
+ }
+
+ private void updateListening() {
+ for (TilePage tilePage : mPages) {
+ tilePage.setListening(tilePage.getParent() == null ? false : mListening);
}
}
@@ -137,43 +131,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
super.computeScroll();
}
- /**
- * Sets individual pages to listening or not. If offPage it will set
- * the next page after position to listening as well since we are in between
- * pages.
- */
- private void setCurrentPage(int position, boolean offPage) {
- if (mPosition == position && mOffPage == offPage) return;
- if (mListening) {
- if (mPosition != position) {
- // Clear out the last pages from listening.
- setPageListening(mPosition, false);
- if (mOffPage) {
- setPageListening(mPosition + 1, false);
- }
- // Set the new pages to listening
- setPageListening(position, true);
- if (offPage) {
- setPageListening(position + 1, true);
- }
- } else if (mOffPage != offPage) {
- // Whether we are showing position + 1 has changed.
- setPageListening(mPosition + 1, offPage);
- }
- }
- // Save the current state.
- mPosition = position;
- mOffPage = offPage;
- }
-
- private void setPageListening(int position, boolean listening) {
- if (position >= mPages.size()) return;
- if (isLayoutRtl()) {
- position = mPages.size() - 1 - position;
- }
- mPages.get(position).setListening(listening);
- }
-
@Override
public boolean hasOverlappingRendering() {
return false;
@@ -362,7 +319,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
if (mPageIndicator == null) return;
- setCurrentPage(position, positionOffset != 0);
mPageIndicator.setLocation(position + positionOffset);
if (mPageListener != null) {
mPageListener.onPageChanged(positionOffsetPixels == 0 &&
@@ -407,11 +363,14 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
}
private final PagerAdapter mAdapter = new PagerAdapter() {
+ @Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (DEBUG) Log.d(TAG, "Destantiating " + position);
container.removeView((View) object);
+ updateListening();
}
+ @Override
public Object instantiateItem(ViewGroup container, int position) {
if (DEBUG) Log.d(TAG, "Instantiating " + position);
if (isLayoutRtl()) {
@@ -419,6 +378,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
}
ViewGroup view = mPages.get(position);
container.addView(view);
+ updateListening();
return view;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 7da109de6951..bfbfbf6fe813 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -140,7 +140,6 @@ public class QSContainerImpl extends FrameLayout {
setMargins(mQSFooter);
setMargins(mQSPanel);
setMargins(mHeader);
- setMargins(mQSCustomizer);
}
private void setMargins(View view) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index dbf17455bc9e..0fa659748f5d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -20,6 +20,7 @@ import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.UserInfo;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.graphics.PorterDuff.Mode;
@@ -49,7 +50,6 @@ import com.android.systemui.R.dimen;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.qs.TouchAnimator.Builder;
-import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.MultiUserSwitch;
import com.android.systemui.statusbar.phone.SettingsButton;
@@ -257,17 +257,31 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
mSettingsContainer.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(
TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE);
-
final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
-
-
- mMultiUserSwitch.setVisibility(mExpanded
- && UserManager.get(mContext).isUserSwitcherEnabled()
- ? View.VISIBLE : View.INVISIBLE);
-
+ mMultiUserSwitch.setVisibility(showUserSwitcher(isDemo) ? View.VISIBLE : View.INVISIBLE);
mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
}
+ private boolean showUserSwitcher(boolean isDemo) {
+ if (!mExpanded || isDemo || !UserManager.supportsMultipleUsers()) {
+ return false;
+ }
+ UserManager userManager = UserManager.get(mContext);
+ if (userManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)) {
+ return false;
+ }
+ int switchableUserCount = 0;
+ for (UserInfo user : userManager.getUsers(true)) {
+ if (user.supportsSwitchToByUser()) {
+ ++switchableUserCount;
+ if (switchableUserCount > 1) {
+ return true;
+ }
+ }
+ }
+ return getResources().getBoolean(R.bool.qs_show_user_switcher_for_single_user);
+ }
+
private void updateListeners() {
if (mListening) {
mUserInfoController.addCallback(this);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
index 9759b6984d67..eb95866aa909 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
@@ -15,42 +15,33 @@
package com.android.systemui.qs.customize;
import android.content.Context;
-import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
-import com.android.systemui.R;
+
import com.android.systemui.plugins.qs.QSIconView;
+import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.qs.tileimpl.QSTileView;
-import java.util.Objects;
public class CustomizeTileView extends QSTileView {
+ private boolean mShowAppLabel;
- private TextView mAppLabel;
- private int mLabelMinLines;
public CustomizeTileView(Context context, QSIconView icon) {
super(context, icon);
}
- @Override
- protected void createLabel() {
- super.createLabel();
- mLabelMinLines = mLabel.getMinLines();
- mAppLabel = findViewById(R.id.app_label);
- mAppLabel.setAlpha(.6f);
- }
-
public void setShowAppLabel(boolean showAppLabel) {
- mAppLabel.setVisibility(showAppLabel ? View.VISIBLE : View.GONE);
+ mShowAppLabel = showAppLabel;
+ mSecondLine.setVisibility(showAppLabel ? View.VISIBLE : View.GONE);
mLabel.setSingleLine(showAppLabel);
}
- public void setAppLabel(CharSequence label) {
- if (!Objects.equals(label, mAppLabel.getText())) {
- mAppLabel.setText(label);
- }
+ @Override
+ protected void handleStateChanged(QSTile.State state) {
+ super.handleStateChanged(state);
+ mSecondLine.setVisibility(mShowAppLabel ? View.VISIBLE : View.GONE);
}
public TextView getAppLabel() {
- return mAppLabel;
+ return mSecondLine;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index bdc5e7d75b48..441d29bffe3a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -42,19 +42,19 @@ import android.widget.TextView;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.R;
-import com.android.systemui.qs.tileimpl.QSIconViewImpl;
+import com.android.systemui.qs.QSTileHost;
import com.android.systemui.qs.customize.TileAdapter.Holder;
import com.android.systemui.qs.customize.TileQueryHelper.TileInfo;
import com.android.systemui.qs.customize.TileQueryHelper.TileStateListener;
import com.android.systemui.qs.external.CustomTile;
-import com.android.systemui.qs.QSTileHost;
+import com.android.systemui.qs.tileimpl.QSIconViewImpl;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import java.util.ArrayList;
import java.util.List;
public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileStateListener {
-
+ private static final int MIN_NUM_TILES = 6;
private static final long DRAG_LENGTH = 100;
private static final float DRAG_SCALE = 1.2f;
public static final long MOVE_DURATION = 150;
@@ -219,9 +219,15 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
return;
}
if (holder.getItemViewType() == TYPE_EDIT) {
- ((TextView) holder.itemView.findViewById(android.R.id.title)).setText(
- mCurrentDrag != null ? R.string.drag_to_remove_tiles
- : R.string.drag_to_add_tiles);
+ final int titleResId;
+ if (mCurrentDrag == null) {
+ titleResId = R.string.drag_to_add_tiles;
+ } else if (!canRemoveTiles() && mCurrentDrag.getAdapterPosition() < mEditIndex) {
+ titleResId = R.string.drag_to_remove_disabled;
+ } else {
+ titleResId = R.string.drag_to_remove_tiles;
+ }
+ ((TextView) holder.itemView.findViewById(android.R.id.title)).setText(titleResId);
return;
}
if (holder.getItemViewType() == TYPE_ACCESSIBLE_DROP) {
@@ -268,7 +274,6 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
R.string.accessibility_qs_edit_tile_label, position + 1, info.state.label);
}
holder.mTileView.onStateChanged(info.state);
- holder.mTileView.setAppLabel(info.appLabel);
holder.mTileView.setShowAppLabel(position > mEditIndex && !info.isSystem);
if (mAccessibilityManager.isTouchExplorationEnabled()) {
@@ -286,7 +291,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
if (mAccessibilityMoving) {
selectPosition(position, v);
} else {
- if (position < mEditIndex) {
+ if (position < mEditIndex && canRemoveTiles()) {
showAccessibilityDialog(position, v);
} else {
startAccessibleDrag(position);
@@ -297,6 +302,10 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
}
}
}
+
+ private boolean canRemoveTiles() {
+ return mCurrentSpecs.size() > MIN_NUM_TILES;
+ }
private void selectPosition(int position, View v) {
// Remove the placeholder.
@@ -507,7 +516,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
break;
}
}
- };
+ }
private final ItemTouchHelper.Callback mCallbacks = new ItemTouchHelper.Callback() {
@@ -551,6 +560,9 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
@Override
public boolean canDropOver(RecyclerView recyclerView, ViewHolder current,
ViewHolder target) {
+ if (!canRemoveTiles() && current.getAdapterPosition() < mEditIndex) {
+ return target.getAdapterPosition() < mEditIndex;
+ }
return target.getAdapterPosition() <= mEditIndex + 1;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
index 2ac592ffe5bd..8bf40962c911 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
@@ -27,6 +27,7 @@ import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
import android.service.quicksettings.TileService;
+import android.text.TextUtils;
import android.widget.Button;
import com.android.systemui.Dependency;
@@ -169,7 +170,8 @@ public class TileQueryHelper {
info.state.expandedAccessibilityClassName =
Button.class.getName();
info.spec = spec;
- info.appLabel = appLabel;
+ info.state.secondaryLabel = (isSystem || TextUtils.equals(state.label, appLabel))
+ ? null : appLabel;
info.isSystem = isSystem;
mTiles.add(info);
mSpecs.add(spec);
@@ -186,7 +188,6 @@ public class TileQueryHelper {
public static class TileInfo {
public String spec;
- public CharSequence appLabel;
public QSTile.State state;
public boolean isSystem;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 40b8d78073cf..834feb7781ea 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -85,6 +85,7 @@ public abstract class QSTileImpl<TState extends State> implements QSTile {
private String mTileSpec;
private EnforcedAdmin mEnforcedAdmin;
private boolean mShowingDetail;
+ private int mIsFullQs;
public abstract TState newTileState();
@@ -110,18 +111,7 @@ public abstract class QSTileImpl<TState extends State> implements QSTile {
* listening client it will go into the listening state.
*/
public void setListening(Object listener, boolean listening) {
- if (listening) {
- if (mListeners.add(listener) && mListeners.size() == 1) {
- if (DEBUG) Log.d(TAG, "setListening " + true);
- mHandler.obtainMessage(H.SET_LISTENING, 1, 0).sendToTarget();
- refreshState(); // Ensure we get at least one refresh after listening.
- }
- } else {
- if (mListeners.remove(listener) && mListeners.size() == 0) {
- if (DEBUG) Log.d(TAG, "setListening " + false);
- mHandler.obtainMessage(H.SET_LISTENING, 0, 0).sendToTarget();
- }
- }
+ mHandler.obtainMessage(H.SET_LISTENING, listening ? 1 : 0, 0, listener).sendToTarget();
}
protected long getStaleTimeout() {
@@ -205,19 +195,10 @@ public abstract class QSTileImpl<TState extends State> implements QSTile {
logMaker.addTaggedData(FIELD_QS_VALUE, ((BooleanState) mState).value ? 1 : 0);
}
return logMaker.setSubtype(getMetricsCategory())
- .addTaggedData(FIELD_CONTEXT, isFullQs())
+ .addTaggedData(FIELD_CONTEXT, mIsFullQs)
.addTaggedData(FIELD_QS_POSITION, mHost.indexOf(mTileSpec));
}
- private int isFullQs() {
- for (Object listener : mListeners) {
- if (TilePage.class.equals(listener.getClass())) {
- return 1;
- }
- }
- return 0;
- }
-
public void showDetail(boolean show) {
mHandler.obtainMessage(H.SHOW_DETAIL, show ? 1 : 0, 0).sendToTarget();
}
@@ -352,6 +333,32 @@ public abstract class QSTileImpl<TState extends State> implements QSTile {
handleRefreshState(null);
}
+ private void handleSetListeningInternal(Object listener, boolean listening) {
+ if (listening) {
+ if (mListeners.add(listener) && mListeners.size() == 1) {
+ if (DEBUG) Log.d(TAG, "handleSetListening true");
+ handleSetListening(listening);
+ refreshState(); // Ensure we get at least one refresh after listening.
+ }
+ } else {
+ if (mListeners.remove(listener) && mListeners.size() == 0) {
+ if (DEBUG) Log.d(TAG, "handleSetListening false");
+ handleSetListening(listening);
+ }
+ }
+ updateIsFullQs();
+ }
+
+ private void updateIsFullQs() {
+ for (Object listener : mListeners) {
+ if (TilePage.class.equals(listener.getClass())) {
+ mIsFullQs = 1;
+ return;
+ }
+ }
+ mIsFullQs = 0;
+ }
+
protected abstract void handleSetListening(boolean listening);
protected void handleDestroy() {
@@ -464,8 +471,8 @@ public abstract class QSTileImpl<TState extends State> implements QSTile {
name = "handleClearState";
handleClearState();
} else if (msg.what == SET_LISTENING) {
- name = "handleSetListening";
- handleSetListening(msg.arg1 != 0);
+ name = "handleSetListeningInternal";
+ handleSetListeningInternal(msg.obj, msg.arg1 != 0);
} else if (msg.what == STALE) {
name = "handleStale";
handleStale();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
index 45c20a043ac9..47747851eb1b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
@@ -40,7 +40,7 @@ public class QSTileView extends QSTileBaseView {
private static final boolean DUAL_TARGET_ALLOWED = false;
private View mDivider;
protected TextView mLabel;
- private TextView mSecondLine;
+ protected TextView mSecondLine;
private ImageView mPadLock;
private int mState;
private ViewGroup mLabelContainer;
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 7db2a505b861..068fd3f5c5f9 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -16,6 +16,8 @@
package com.android.systemui.screenshot;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
import static com.android.systemui.screenshot.GlobalScreenshot.SHARING_INTENT;
import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_SCREENSHOT;
@@ -26,11 +28,11 @@ import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.ActivityManager;
import android.app.ActivityOptions;
-import android.app.admin.DevicePolicyManager;
import android.app.Notification;
import android.app.Notification.BigPictureStyle;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -58,7 +60,6 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
-import android.util.Log;
import android.util.Slog;
import android.view.Display;
import android.view.LayoutInflater;
@@ -517,6 +518,7 @@ class GlobalScreenshot {
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
PixelFormat.TRANSLUCENT);
mWindowLayoutParams.setTitle("ScreenshotAnimation");
+ mWindowLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java
index cb9453b8846e..b7a5d31a324b 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java
@@ -28,6 +28,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
@@ -55,6 +56,7 @@ public class DividerWindowManager {
mLp.token = new Binder();
mLp.setTitle(WINDOW_TITLE);
mLp.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION;
+ mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 0876507465a1..8b6b5fe5d542 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -26,6 +26,7 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.RectF;
import android.util.AttributeSet;
+import android.util.MathUtils;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewAnimationUtils;
@@ -98,7 +99,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
private static final Interpolator ACTIVATE_INVERSE_ALPHA_INTERPOLATOR
= new PathInterpolator(0, 0, 0.5f, 1);
private final int mTintedRippleColor;
- private final int mLowPriorityRippleColor;
protected final int mNormalRippleColor;
private final AccessibilityManager mAccessibilityManager;
private final DoubleTapHelper mDoubleTapHelper;
@@ -133,7 +133,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
private float mAppearAnimationFraction = -1.0f;
private float mAppearAnimationTranslation;
private final int mNormalColor;
- private final int mLowPriorityColor;
private boolean mIsBelowSpeedBump;
private FalsingManager mFalsingManager;
@@ -178,6 +177,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
private boolean mNeedsDimming;
private int mDimmedAlpha;
private boolean mBlockNextTouch;
+ private boolean mIsHeadsUpAnimation;
+ private int mHeadsUpAddStartLocation;
+ private float mHeadsUpLocation;
+ private boolean mIsAppearing;
public ActivatableNotificationView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -186,12 +189,8 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
setClipChildren(false);
setClipToPadding(false);
mNormalColor = context.getColor(R.color.notification_material_background_color);
- mLowPriorityColor = context.getColor(
- R.color.notification_material_background_low_priority_color);
mTintedRippleColor = context.getColor(
R.color.notification_ripple_tinted_color);
- mLowPriorityRippleColor = context.getColor(
- R.color.notification_ripple_color_low_priority);
mNormalRippleColor = context.getColor(
R.color.notification_ripple_untinted_color);
mFalsingManager = FalsingManager.getInstance(context);
@@ -204,6 +203,18 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
makeInactive(true /* animate */);
}
}, super::performClick, this::handleSlideBack, mFalsingManager::onNotificationDoubleTap);
+ initDimens();
+ }
+
+ private void initDimens() {
+ mHeadsUpAddStartLocation = getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_content_margin_start);
+ }
+
+ @Override
+ public void onDensityOrFontScaleChanged() {
+ super.onDensityOrFontScaleChanged();
+ initDimens();
}
@Override
@@ -745,27 +756,34 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
}
@Override
- public void performRemoveAnimation(long duration, float translationDirection,
- Runnable onFinishedRunnable) {
+ public void performRemoveAnimation(long duration, long delay,
+ float translationDirection, boolean isHeadsUpAnimation, float endLocation,
+ Runnable onFinishedRunnable, AnimatorListenerAdapter animationListener) {
enableAppearDrawing(true);
+ mIsHeadsUpAnimation = isHeadsUpAnimation;
+ mHeadsUpLocation = endLocation;
if (mDrawingAppearAnimation) {
startAppearAnimation(false /* isAppearing */, translationDirection,
- 0, duration, onFinishedRunnable);
+ delay, duration, onFinishedRunnable, animationListener);
} else if (onFinishedRunnable != null) {
onFinishedRunnable.run();
}
}
@Override
- public void performAddAnimation(long delay, long duration) {
+ public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear) {
enableAppearDrawing(true);
+ mIsHeadsUpAnimation = isHeadsUpAppear;
+ mHeadsUpLocation = mHeadsUpAddStartLocation;
if (mDrawingAppearAnimation) {
- startAppearAnimation(true /* isAppearing */, -1.0f, delay, duration, null);
+ startAppearAnimation(true /* isAppearing */, isHeadsUpAppear ? 0.0f : -1.0f, delay,
+ duration, null, null);
}
}
private void startAppearAnimation(boolean isAppearing, float translationDirection, long delay,
- long duration, final Runnable onFinishedRunnable) {
+ long duration, final Runnable onFinishedRunnable,
+ AnimatorListenerAdapter animationListener) {
cancelAppearAnimation();
mAnimationTranslationY = translationDirection * getActualHeight();
if (mAppearAnimationFraction == -1.0f) {
@@ -778,6 +796,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
mAppearAnimationTranslation = 0;
}
}
+ mIsAppearing = isAppearing;
float targetValue;
if (isAppearing) {
@@ -803,6 +822,9 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
invalidate();
}
});
+ if (animationListener != null) {
+ mAppearAnimator.addListener(animationListener);
+ }
if (delay > 0) {
// we need to apply the initial state already to avoid drawn frames in the wrong state
updateAppearAnimationAlpha();
@@ -862,9 +884,21 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
/ (HORIZONTAL_ANIMATION_START - HORIZONTAL_ANIMATION_END);
widthFraction = Math.min(1.0f, Math.max(0.0f, widthFraction));
widthFraction = mCurrentAppearInterpolator.getInterpolation(widthFraction);
- float left = (getWidth() * (0.5f - HORIZONTAL_COLLAPSED_REST_PARTIAL / 2.0f) *
- widthFraction);
- float right = getWidth() - left;
+ float startWidthFraction = HORIZONTAL_COLLAPSED_REST_PARTIAL;
+ if (mIsHeadsUpAnimation && !mIsAppearing) {
+ startWidthFraction = 0;
+ }
+ float width = MathUtils.lerp(startWidthFraction, 1.0f, 1.0f - widthFraction)
+ * getWidth();
+ float left;
+ float right;
+ if (mIsHeadsUpAnimation) {
+ left = MathUtils.lerp(mHeadsUpLocation, 0, 1.0f - widthFraction);
+ right = left + width;
+ } else {
+ left = getWidth() * 0.5f - width / 2.0f;
+ right = getWidth() - left;
+ }
// handle top animation
float heightFraction = (inverseFraction - (1.0f - VERTICAL_ANIMATION_START)) /
@@ -957,8 +991,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
}
if (withTint && mBgTint != NO_COLOR) {
return mBgTint;
- } else if (mIsBelowSpeedBump) {
- return mLowPriorityColor;
} else {
return mNormalColor;
}
@@ -967,8 +999,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
protected int getRippleColor() {
if (mBgTint != 0) {
return mTintedRippleColor;
- } else if (mIsBelowSpeedBump) {
- return mLowPriorityRippleColor;
} else {
return mNormalRippleColor;
}
@@ -1046,6 +1076,14 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
return calculateBgColor(false /* withTint */, false /* withOverride */);
}
+ public boolean isPinned() {
+ return false;
+ }
+
+ public boolean isHeadsUpAnimatingAway() {
+ return false;
+ }
+
public interface OnActivatedListener {
void onActivated(ActivatableNotificationView view);
void onActivationReset(ActivatableNotificationView view);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java
index e8f0925dcc71..4728a1d17b39 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java
@@ -28,11 +28,17 @@ public class CrossFadeHelper {
public static final long ANIMATION_DURATION_LENGTH = 210;
public static void fadeOut(final View view, final Runnable endRunnable) {
+ fadeOut(view, ANIMATION_DURATION_LENGTH, 0, endRunnable);
+ }
+
+ public static void fadeOut(final View view, long duration, int delay,
+ final Runnable endRunnable) {
view.animate().cancel();
view.animate()
.alpha(0f)
- .setDuration(ANIMATION_DURATION_LENGTH)
+ .setDuration(duration)
.setInterpolator(Interpolators.ALPHA_OUT)
+ .setStartDelay(delay)
.withEndAction(new Runnable() {
@Override
public void run() {
@@ -93,6 +99,10 @@ public class CrossFadeHelper {
}
public static void fadeIn(final View view) {
+ fadeIn(view, ANIMATION_DURATION_LENGTH, 0);
+ }
+
+ public static void fadeIn(final View view, long duration, int delay) {
view.animate().cancel();
if (view.getVisibility() == View.INVISIBLE) {
view.setAlpha(0.0f);
@@ -100,7 +110,8 @@ public class CrossFadeHelper {
}
view.animate()
.alpha(1f)
- .setDuration(ANIMATION_DURATION_LENGTH)
+ .setDuration(duration)
+ .setStartDelay(delay)
.setInterpolator(Interpolators.ALPHA_IN)
.withEndAction(null);
if (view.hasOverlappingRendering()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index e5c5dcdb0f58..6b9567dd9d8a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -88,6 +88,7 @@ import com.android.systemui.statusbar.stack.StackScrollState;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BooleanSupplier;
+import java.util.function.Consumer;
public class ExpandableNotificationRow extends ActivatableNotificationView
implements PluginListener<NotificationMenuRowPlugin> {
@@ -139,6 +140,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private boolean mSensitiveHiddenInGeneral;
private boolean mShowingPublicInitialized;
private boolean mHideSensitiveForIntrinsicHeight;
+ private float mHeaderVisibleAmount = 1.0f;
/**
* Is this notification expanded by the system. The expansion state can be overridden by the
@@ -156,8 +158,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private NotificationContentView mPublicLayout;
private NotificationContentView mPrivateLayout;
private NotificationContentView[] mLayouts;
- private int mMaxExpandHeight;
- private int mHeadsUpHeight;
private int mNotificationColor;
private ExpansionLogger mLogger;
private String mLoggingKey;
@@ -180,6 +180,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private boolean mExpandAnimationRunning;
private AboveShelfChangedListener mAboveShelfChangedListener;
private HeadsUpManager mHeadsUpManager;
+ private Consumer<Boolean> mHeadsUpAnimatingAwayListener;
private View mHelperButton;
private boolean mChildIsExpanding;
@@ -534,6 +535,30 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
addChildNotification(row, -1);
}
+ /**
+ * Set the how much the header should be visible. A value of 0 will make the header fully gone
+ * and a value of 1 will make the notification look just like normal.
+ * This is being used for heads up notifications, when they are pinned to the top of the screen
+ * and the header content is extracted to the statusbar.
+ *
+ * @param headerVisibleAmount the amount the header should be visible.
+ */
+ public void setHeaderVisibleAmount(float headerVisibleAmount) {
+ if (mHeaderVisibleAmount != headerVisibleAmount) {
+ mHeaderVisibleAmount = headerVisibleAmount;
+ mPrivateLayout.setHeaderVisibleAmount(headerVisibleAmount);
+ if (mChildrenContainer != null) {
+ mChildrenContainer.setHeaderVisibleAmount(headerVisibleAmount);
+ }
+ notifyHeightChanged(false /* needsAnimation */);
+ }
+ }
+
+ @Override
+ public float getHeaderVisibleAmount() {
+ return mHeaderVisibleAmount;
+ }
+
@Override
public void setHeadsUpIsVisible() {
super.setHeadsUpIsVisible();
@@ -722,6 +747,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
}
+ @Override
public boolean isPinned() {
return mIsPinned;
}
@@ -741,11 +767,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
return mChildrenContainer.getIntrinsicHeight();
}
if(mExpandedWhenPinned) {
- return Math.max(getMaxExpandHeight(), mHeadsUpHeight);
+ return Math.max(getMaxExpandHeight(), getHeadsUpHeight());
} else if (atLeastMinHeight) {
- return Math.max(getCollapsedHeight(), mHeadsUpHeight);
+ return Math.max(getCollapsedHeight(), getHeadsUpHeight());
} else {
- return mHeadsUpHeight;
+ return getHeadsUpHeight();
}
}
@@ -1034,11 +1060,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
}
- public void setDismissed(boolean dismissed, boolean fromAccessibility) {
- mDismissed = dismissed;
+ public void setDismissed(boolean fromAccessibility) {
+ mDismissed = true;
mGroupParentWhenDismissed = mNotificationParent;
mRefocusOnDismiss = fromAccessibility;
mChildAfterViewWhenDismissed = null;
+ mEntry.icon.setDismissed();
if (isChildInGroup()) {
List<ExpandableNotificationRow> notificationChildren =
mNotificationParent.getNotificationChildren();
@@ -1090,17 +1117,26 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
public void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) {
boolean wasAboveShelf = isAboveShelf();
+ boolean changed = headsUpAnimatingAway != mHeadsupDisappearRunning;
mHeadsupDisappearRunning = headsUpAnimatingAway;
mPrivateLayout.setHeadsUpAnimatingAway(headsUpAnimatingAway);
+ if (changed && mHeadsUpAnimatingAwayListener != null) {
+ mHeadsUpAnimatingAwayListener.accept(headsUpAnimatingAway);
+ }
if (isAboveShelf() != wasAboveShelf) {
mAboveShelfChangedListener.onAboveShelfStateChanged(!wasAboveShelf);
}
}
+ public void setHeadsUpAnimatingAwayListener(Consumer<Boolean> listener) {
+ mHeadsUpAnimatingAwayListener = listener;
+ }
+
/**
* @return if the view was just heads upped and is now animating away. During such a time the
* layout needs to be kept consistent
*/
+ @Override
public boolean isHeadsUpAnimatingAway() {
return mHeadsupDisappearRunning;
}
@@ -1121,7 +1157,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
groupSummary.performDismiss(fromAccessibility);
}
}
- setDismissed(true, fromAccessibility);
+ setDismissed(fromAccessibility);
if (isClearable()) {
if (mOnDismissRunnable != null) {
mOnDismissRunnable.run();
@@ -1921,9 +1957,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
if (isPinned() || mHeadsupDisappearRunning) {
return getPinnedHeadsUpHeight(true /* atLeastMinHeight */);
} else if (isExpanded()) {
- return Math.max(getMaxExpandHeight(), mHeadsUpHeight);
+ return Math.max(getMaxExpandHeight(), getHeadsUpHeight());
} else {
- return Math.max(getCollapsedHeight(), mHeadsUpHeight);
+ return Math.max(getCollapsedHeight(), getHeadsUpHeight());
}
} else if (isExpanded()) {
return getMaxExpandHeight();
@@ -1997,8 +2033,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ int intrinsicBefore = getIntrinsicHeight();
super.onLayout(changed, left, top, right, bottom);
- updateMaxHeights();
+ if (intrinsicBefore != getIntrinsicHeight()) {
+ notifyHeightChanged(true /* needsAnimation */);
+ }
if (mMenuRow.getMenuView() != null) {
mMenuRow.onHeightUpdate();
}
@@ -2022,15 +2061,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
}
- public void updateMaxHeights() {
- int intrinsicBefore = getIntrinsicHeight();
- mMaxExpandHeight = mPrivateLayout.getExpandHeight();
- mHeadsUpHeight = mPrivateLayout.getHeadsUpHeight();
- if (intrinsicBefore != getIntrinsicHeight()) {
- notifyHeightChanged(true /* needsAnimation */);
- }
- }
-
@Override
public void notifyHeightChanged(boolean needsAnimation) {
super.notifyHeightChanged(needsAnimation);
@@ -2173,7 +2203,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
public int getMaxExpandHeight() {
- return mMaxExpandHeight;
+ return mPrivateLayout.getExpandHeight();
+ }
+
+
+ private int getHeadsUpHeight() {
+ return mPrivateLayout.getHeadsUpHeight();
}
public boolean areGutsExposed() {
@@ -2273,7 +2308,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
} else if (mIsSummaryWithChildren && !isGroupExpanded() && !shouldShowPublic()) {
return mChildrenContainer.getMinHeight();
} else if (!ignoreTemporaryStates && isHeadsUpAllowed() && mIsHeadsUp) {
- return mHeadsUpHeight;
+ return getHeadsUpHeight();
}
NotificationContentView showingLayout = getShowingLayout();
return showingLayout.getMinHeight();
@@ -2319,10 +2354,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
}
- public boolean isMaxExpandHeightInitialized() {
- return mMaxExpandHeight != 0;
- }
-
public NotificationContentView getShowingLayout() {
return shouldShowPublic() ? mPublicLayout : mPrivateLayout;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
index 8bc22016efae..67268c00a4ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
@@ -276,12 +276,18 @@ public abstract class ExpandableOutlineView extends ExpandableView {
setClipToOutline(mAlwaysRoundBothCorners);
}
- public void setTopRoundness(float topRoundness, boolean animate) {
+ /**
+ * Set the topRoundness of this view.
+ * @return Whether the roundness was changed.
+ */
+ public boolean setTopRoundness(float topRoundness, boolean animate) {
if (mTopRoundness != topRoundness) {
mTopRoundness = topRoundness;
PropertyAnimator.setProperty(this, TOP_ROUNDNESS, topRoundness,
ROUNDNESS_PROPERTIES, animate);
+ return true;
}
+ return false;
}
protected void applyRoundness() {
@@ -305,12 +311,18 @@ public abstract class ExpandableOutlineView extends ExpandableView {
return mCurrentBottomRoundness * mOutlineRadius;
}
- public void setBottomRoundness(float bottomRoundness, boolean animate) {
+ /**
+ * Set the bottom roundness of this view.
+ * @return Whether the roundness was changed.
+ */
+ public boolean setBottomRoundness(float bottomRoundness, boolean animate) {
if (mBottomRoundness != bottomRoundness) {
mBottomRoundness = bottomRoundness;
PropertyAnimator.setProperty(this, BOTTOM_ROUNDNESS, bottomRoundness,
ROUNDNESS_PROPERTIES, animate);
+ return true;
}
+ return false;
}
protected void setBackgroundTop(int backgroundTop) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
index 204adc813f50..df6a9778142f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar;
+import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Rect;
@@ -296,19 +297,24 @@ public abstract class ExpandableView extends FrameLayout {
/**
* Perform a remove animation on this view.
- *
* @param duration The duration of the remove animation.
+ * @param delay The delay of the animation
* @param translationDirection The direction value from [-1 ... 1] indicating in which the
- * animation should be performed. A value of -1 means that The
- * remove animation should be performed upwards,
- * such that the child appears to be going away to the top. 1
- * Should mean the opposite.
+ * animation should be performed. A value of -1 means that The
+ * remove animation should be performed upwards,
+ * such that the child appears to be going away to the top. 1
+ * Should mean the opposite.
+ * @param isHeadsUpAnimation Is this a headsUp animation.
+ * @param endLocation The location where the horizonal heads up disappear animation should end.
* @param onFinishedRunnable A runnable which should be run when the animation is finished.
+ * @param animationListener An animation listener to add to the animation.
*/
- public abstract void performRemoveAnimation(long duration, float translationDirection,
- Runnable onFinishedRunnable);
+ public abstract void performRemoveAnimation(long duration,
+ long delay, float translationDirection, boolean isHeadsUpAnimation, float endLocation,
+ Runnable onFinishedRunnable,
+ AnimatorListenerAdapter animationListener);
- public abstract void performAddAnimation(long delay, long duration);
+ public abstract void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear);
/**
* Set the notification appearance to be below the speed bump.
@@ -390,6 +396,10 @@ public abstract class ExpandableView extends FrameLayout {
}
}
+ public float getHeaderVisibleAmount() {
+ return 1.0f;
+ }
+
protected boolean shouldClipToActualHeight() {
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
new file mode 100644
index 000000000000..5e03fbfc1222
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.keyguard.AlphaOptimizedLinearLayout;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.DarkIconDispatcher;
+
+/**
+ * The view in the statusBar that contains part of the heads-up information
+ */
+public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {
+ private int mAbsoluteStartPadding;
+ private int mEndMargin;
+ private View mIconPlaceholder;
+ private TextView mTextView;
+ private NotificationData.Entry mShowingEntry;
+ private Rect mLayoutedIconRect = new Rect();
+ private int[] mTmpPosition = new int[2];
+ private boolean mFirstLayout = true;
+ private boolean mPublicMode;
+ private int mMaxWidth;
+ private View mRootView;
+ private int mLeftInset;
+ private Rect mIconDrawingRect = new Rect();
+ private Runnable mOnDrawingRectChangedListener;
+
+ public HeadsUpStatusBarView(Context context) {
+ this(context, null);
+ }
+
+ public HeadsUpStatusBarView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public HeadsUpStatusBarView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public HeadsUpStatusBarView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ Resources res = getResources();
+ mAbsoluteStartPadding = res.getDimensionPixelSize(R.dimen.notification_side_paddings)
+ + res.getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_content_margin_start);
+ mEndMargin = res.getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_content_margin_end);
+ setPaddingRelative(mAbsoluteStartPadding, 0, mEndMargin, 0);
+ updateMaxWidth();
+ }
+
+ private void updateMaxWidth() {
+ int maxWidth = getResources().getDimensionPixelSize(R.dimen.qs_panel_width);
+ if (maxWidth != mMaxWidth) {
+ // maxWidth doesn't work with fill_parent, let's manually make it at most as big as the
+ // notification panel
+ mMaxWidth = maxWidth;
+ requestLayout();
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (mMaxWidth > 0) {
+ int newSize = Math.min(MeasureSpec.getSize(widthMeasureSpec), mMaxWidth);
+ widthMeasureSpec = MeasureSpec.makeMeasureSpec(newSize,
+ MeasureSpec.getMode(widthMeasureSpec));
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ updateMaxWidth();
+ }
+
+ @VisibleForTesting
+ public HeadsUpStatusBarView(Context context, View iconPlaceholder, TextView textView) {
+ this(context);
+ mIconPlaceholder = iconPlaceholder;
+ mTextView = textView;
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mIconPlaceholder = findViewById(R.id.icon_placeholder);
+ mTextView = findViewById(R.id.text);
+ }
+
+ public void setEntry(NotificationData.Entry entry) {
+ if (entry != null) {
+ mShowingEntry = entry;
+ CharSequence text = entry.headsUpStatusBarText;
+ if (mPublicMode) {
+ text = entry.headsUpStatusBarTextPublic;
+ }
+ mTextView.setText(text);
+ } else {
+ mShowingEntry = null;
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed, l, t, r, b);
+ mIconPlaceholder.getLocationOnScreen(mTmpPosition);
+ int left = (int) (mTmpPosition[0] - getTranslationX());
+ int top = mTmpPosition[1];
+ int right = left + mIconPlaceholder.getWidth();
+ int bottom = top + mIconPlaceholder.getHeight();
+ mLayoutedIconRect.set(left, top, right, bottom);
+ updateDrawingRect();
+ int targetPadding = mAbsoluteStartPadding + mLeftInset;
+ if (left != targetPadding) {
+ int newPadding = targetPadding - left + getPaddingStart();
+ setPaddingRelative(newPadding, 0, mEndMargin, 0);
+ }
+ if (mFirstLayout) {
+ // we need to do the padding calculation in the first frame, so the layout specified
+ // our visibility to be INVISIBLE in the beginning. let's correct that and set it
+ // to GONE.
+ setVisibility(GONE);
+ mFirstLayout = false;
+ }
+ }
+
+ @Override
+ public void setTranslationX(float translationX) {
+ super.setTranslationX(translationX);
+ updateDrawingRect();
+ }
+
+ private void updateDrawingRect() {
+ float oldLeft = mIconDrawingRect.left;
+ mIconDrawingRect.set(mLayoutedIconRect);
+ mIconDrawingRect.offset((int) getTranslationX(), 0);
+ if (oldLeft != mIconDrawingRect.left && mOnDrawingRectChangedListener != null) {
+ mOnDrawingRectChangedListener.run();
+ }
+ }
+
+ @Override
+ protected boolean fitSystemWindows(Rect insets) {
+ mLeftInset = insets.left;
+ return super.fitSystemWindows(insets);
+ }
+
+ public NotificationData.Entry getShowingEntry() {
+ return mShowingEntry;
+ }
+
+ public Rect getIconDrawingRect() {
+ return mIconDrawingRect;
+ }
+
+ public void onDarkChanged(Rect area, float darkIntensity, int tint) {
+ mTextView.setTextColor(DarkIconDispatcher.getTint(area, this, tint));
+ }
+
+ public void setPublicMode(boolean publicMode) {
+ mPublicMode = publicMode;
+ }
+
+ public void setOnDrawingRectChangedListener(Runnable onDrawingRectChangedListener) {
+ mOnDrawingRectChangedListener = onDrawingRectChangedListener;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index 73c87953cf45..f64b1bc2abe8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -602,14 +602,15 @@ public class NotificationContentView extends FrameLayout {
&& (mIsHeadsUp || mHeadsUpAnimatingAway)
&& !mContainingNotification.isOnKeyguard();
if (transitioningBetweenHunAndExpanded || pinned) {
- return Math.min(mHeadsUpChild.getHeight(), mExpandedChild.getHeight());
+ return Math.min(getViewHeight(VISIBLE_TYPE_HEADSUP),
+ getViewHeight(VISIBLE_TYPE_EXPANDED));
}
}
// Size change of the expanded version
if ((mVisibleType == VISIBLE_TYPE_EXPANDED) && mContentHeightAtAnimationStart >= 0
&& mExpandedChild != null) {
- return Math.min(mContentHeightAtAnimationStart, mExpandedChild.getHeight());
+ return Math.min(mContentHeightAtAnimationStart, getViewHeight(VISIBLE_TYPE_EXPANDED));
}
int hint;
@@ -619,16 +620,17 @@ public class NotificationContentView extends FrameLayout {
VISIBLE_TYPE_AMBIENT_SINGLELINE)) {
hint = mAmbientSingleLineChild.getHeight();
} else if (mHeadsUpChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_HEADSUP)) {
- hint = mHeadsUpChild.getHeight();
+ hint = getViewHeight(VISIBLE_TYPE_HEADSUP);
} else if (mExpandedChild != null) {
- hint = mExpandedChild.getHeight();
+ hint = getViewHeight(VISIBLE_TYPE_EXPANDED);
} else {
- hint = mContractedChild.getHeight() + mContext.getResources().getDimensionPixelSize(
- com.android.internal.R.dimen.notification_action_list_height);
+ hint = getViewHeight(VISIBLE_TYPE_CONTRACTED)
+ + mContext.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_action_list_height);
}
if (mExpandedChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_EXPANDED)) {
- hint = Math.min(hint, mExpandedChild.getHeight());
+ hint = Math.min(hint, getViewHeight(VISIBLE_TYPE_EXPANDED));
}
return hint;
}
@@ -694,8 +696,8 @@ public class NotificationContentView extends FrameLayout {
}
private float calculateTransformationAmount() {
- int startHeight = getViewForVisibleType(mTransformationStartVisibleType).getHeight();
- int endHeight = getViewForVisibleType(mVisibleType).getHeight();
+ int startHeight = getViewHeight(mTransformationStartVisibleType);
+ int endHeight = getViewHeight(mVisibleType);
int progress = Math.abs(mContentHeight - startHeight);
int totalDistance = Math.abs(endHeight - startHeight);
if (totalDistance == 0) {
@@ -717,11 +719,23 @@ public class NotificationContentView extends FrameLayout {
if (mContainingNotification.isShowingAmbient()) {
return getShowingAmbientView().getHeight();
} else if (mExpandedChild != null) {
- return mExpandedChild.getHeight() + getExtraRemoteInputHeight(mExpandedRemoteInput);
+ return getViewHeight(VISIBLE_TYPE_EXPANDED)
+ + getExtraRemoteInputHeight(mExpandedRemoteInput);
} else if (mIsHeadsUp && mHeadsUpChild != null && !mContainingNotification.isOnKeyguard()) {
- return mHeadsUpChild.getHeight() + getExtraRemoteInputHeight(mHeadsUpRemoteInput);
+ return getViewHeight(VISIBLE_TYPE_HEADSUP)
+ + getExtraRemoteInputHeight(mHeadsUpRemoteInput);
}
- return mContractedChild.getHeight();
+ return getViewHeight(VISIBLE_TYPE_CONTRACTED);
+ }
+
+ private int getViewHeight(int visibleType) {
+ View view = getViewForVisibleType(visibleType);
+ int height = view.getHeight();
+ NotificationViewWrapper viewWrapper = getWrapperForView(view);
+ if (viewWrapper != null) {
+ height += viewWrapper.getHeaderTranslation();
+ }
+ return height;
}
public int getMinHeight() {
@@ -732,7 +746,7 @@ public class NotificationContentView extends FrameLayout {
if (mContainingNotification.isShowingAmbient()) {
return getShowingAmbientView().getHeight();
} else if (likeGroupExpanded || !mIsChildInGroup || isGroupExpanded()) {
- return mContractedChild.getHeight();
+ return getViewHeight(VISIBLE_TYPE_CONTRACTED);
} else {
return mSingleLineView.getHeight();
}
@@ -1046,7 +1060,7 @@ public class NotificationContentView extends FrameLayout {
private int getVisualTypeForHeight(float viewHeight) {
boolean noExpandedChild = mExpandedChild == null;
- if (!noExpandedChild && viewHeight == mExpandedChild.getHeight()) {
+ if (!noExpandedChild && viewHeight == getViewHeight(VISIBLE_TYPE_EXPANDED)) {
return VISIBLE_TYPE_EXPANDED;
}
if (!mUserExpanding && mIsChildInGroup && !isGroupExpanded()) {
@@ -1055,13 +1069,13 @@ public class NotificationContentView extends FrameLayout {
if ((mIsHeadsUp || mHeadsUpAnimatingAway) && mHeadsUpChild != null
&& !mContainingNotification.isOnKeyguard()) {
- if (viewHeight <= mHeadsUpChild.getHeight() || noExpandedChild) {
+ if (viewHeight <= getViewHeight(VISIBLE_TYPE_HEADSUP) || noExpandedChild) {
return VISIBLE_TYPE_HEADSUP;
} else {
return VISIBLE_TYPE_EXPANDED;
}
} else {
- if (noExpandedChild || (viewHeight <= mContractedChild.getHeight()
+ if (noExpandedChild || (viewHeight <= getViewHeight(VISIBLE_TYPE_CONTRACTED)
&& (!mIsChildInGroup || isGroupExpanded()
|| !mContainingNotification.isExpanded(true /* allowOnKeyguard */)))) {
return VISIBLE_TYPE_CONTRACTED;
@@ -1616,19 +1630,19 @@ public class NotificationContentView extends FrameLayout {
}
public int getExpandHeight() {
- View expandedChild = mExpandedChild;
- if (expandedChild == null) {
- expandedChild = mContractedChild;
+ int viewType = VISIBLE_TYPE_EXPANDED;
+ if (mExpandedChild == null) {
+ viewType = VISIBLE_TYPE_CONTRACTED;
}
- return expandedChild.getHeight() + getExtraRemoteInputHeight(mExpandedRemoteInput);
+ return getViewHeight(viewType) + getExtraRemoteInputHeight(mExpandedRemoteInput);
}
public int getHeadsUpHeight() {
- View headsUpChild = mHeadsUpChild;
- if (headsUpChild == null) {
- headsUpChild = mContractedChild;
+ int viewType = VISIBLE_TYPE_HEADSUP;
+ if (mHeadsUpChild == null) {
+ viewType = VISIBLE_TYPE_CONTRACTED;
}
- return headsUpChild.getHeight()+ getExtraRemoteInputHeight(mHeadsUpRemoteInput);
+ return getViewHeight(viewType) + getExtraRemoteInputHeight(mHeadsUpRemoteInput);
}
public void setRemoteInputVisible(boolean remoteInputVisible) {
@@ -1641,4 +1655,16 @@ public class NotificationContentView extends FrameLayout {
clipChildren = clipChildren && !mRemoteInputVisible;
super.setClipChildren(clipChildren);
}
+
+ public void setHeaderVisibleAmount(float headerVisibleAmount) {
+ if (mContractedWrapper != null) {
+ mContractedWrapper.setHeaderVisibleAmount(headerVisibleAmount);
+ }
+ if (mHeadsUpWrapper != null) {
+ mHeadsUpWrapper.setHeaderVisibleAmount(headerVisibleAmount);
+ }
+ if (mExpandedWrapper != null) {
+ mExpandedWrapper.setHeaderVisibleAmount(headerVisibleAmount);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 22a186ff1706..775faee7fbc3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -107,6 +107,8 @@ public class NotificationData {
public CharSequence remoteInputTextWhenReset;
public long lastRemoteInputSent = NOT_LAUNCHED_YET;
public ArraySet<Integer> mActiveAppOps = new ArraySet<>(3);
+ public CharSequence headsUpStatusBarText;
+ public CharSequence headsUpStatusBarTextPublic;
public Entry(StatusBarNotification n) {
this.key = n.getKey();
@@ -529,6 +531,14 @@ public class NotificationData {
return null;
}
+ public boolean shouldHide(String key) {
+ if (mRankingMap != null) {
+ getRanking(key, mTmpRanking);
+ return mTmpRanking.isSuspended();
+ }
+ return false;
+ }
+
private void updateRankingAndSort(RankingMap ranking) {
if (ranking != null) {
mRankingMap = ranking;
@@ -618,6 +628,10 @@ public class NotificationData {
return true;
}
+ if (shouldHide(sbn.getKey())) {
+ return true;
+ }
+
if (!StatusBar.ENABLE_CHILD_NOTIFICATIONS
&& mGroupManager.isChildInGroupWithSummary(sbn)) {
return true;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
index 48828ab9d032..7a7cc99eb44d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
@@ -332,6 +332,7 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
row.setOnExpandClickListener(mPresenter);
row.setInflationCallback(this);
row.setLongPressListener(getNotificationLongClicker());
+ mListContainer.bindRow(row);
mRemoteInputManager.bindRow(row);
// Get the app name.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
index 112707552e6e..886d6f17fedb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
@@ -75,7 +75,7 @@ public class NotificationHeaderUtil {
if (shouldApply) {
// lets gray it out
int grey = view.getContext().getColor(
- com.android.internal.R.color.notification_icon_default_color);
+ com.android.internal.R.color.notification_default_color_light);
imageView.getDrawable().setColorFilter(grey, PorterDuff.Mode.SRC_ATOP);
} else {
// lets reset it
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListContainer.java
index 0c19ec091ca6..af9a3a3775bf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListContainer.java
@@ -188,4 +188,11 @@ public interface NotificationListContainer {
default void applyExpandAnimationParams(ExpandAnimationParameters params) {}
default void setExpandingNotification(ExpandableNotificationRow row) {}
+
+ /**
+ * Bind a newly created row.
+ *
+ * @param row The notification to bind.
+ */
+ default void bindRow(ExpandableNotificationRow row) {}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index 4f09133303de..41c755991403 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -177,6 +177,9 @@ public class NotificationShelf extends ActivatableNotificationView implements
mShelfState.yTranslation = Math.max(Math.min(viewEnd, maxShelfEnd) - mShelfState.height,
getFullyClosedTranslation());
mShelfState.zTranslation = ambientState.getBaseZHeight();
+ if (mAmbientState.isDark() && !mAmbientState.hasPulsingNotifications()) {
+ mShelfState.yTranslation = mAmbientState.getDarkTopPadding();
+ }
float openedAmount = (mShelfState.yTranslation - getFullyClosedTranslation())
/ (getIntrinsicHeight() * 2);
openedAmount = Math.min(1.0f, openedAmount);
@@ -252,7 +255,8 @@ public class NotificationShelf extends ActivatableNotificationView implements
}
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
float notificationClipEnd;
- boolean aboveShelf = ViewState.getFinalTranslationZ(row) > baseZHeight;
+ boolean aboveShelf = ViewState.getFinalTranslationZ(row) > baseZHeight
+ || row.isPinned();
boolean isLastChild = child == lastChild;
float rowTranslationY = row.getTranslationY();
if ((isLastChild && !child.isInShelf()) || aboveShelf || backgroundForceHidden) {
@@ -343,7 +347,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
float maxTop = row.getTranslationY();
StatusBarIconView icon = row.getEntry().expandedIcon;
float shelfIconPosition = getTranslationY() + icon.getTop() + icon.getTranslationY();
- if (shelfIconPosition < maxTop) {
+ if (shelfIconPosition < maxTop && !mAmbientState.isDark()) {
int top = (int) (maxTop - shelfIconPosition);
Rect clipRect = new Rect(0, top, icon.getWidth(), Math.max(top, icon.getHeight()));
icon.setClipBounds(clipRect);
@@ -354,7 +358,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
private void updateContinuousClipping(final ExpandableNotificationRow row) {
StatusBarIconView icon = row.getEntry().expandedIcon;
- boolean needsContinuousClipping = ViewState.isAnimatingY(icon);
+ boolean needsContinuousClipping = ViewState.isAnimatingY(icon) && !mAmbientState.isDark();
boolean isContinuousClipping = icon.getTag(TAG_CONTINUOUS_CLIPPING) != null;
if (needsContinuousClipping && !isContinuousClipping) {
ViewTreeObserver.OnPreDrawListener predrawListener =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java
index 0a7ee517a24a..badc40d5f01a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StackScrollerDecorView.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar;
+import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
@@ -112,14 +113,16 @@ public abstract class StackScrollerDecorView extends ExpandableView {
}
@Override
- public void performRemoveAnimation(long duration, float translationDirection,
- Runnable onFinishedRunnable) {
+ public void performRemoveAnimation(long duration, long delay,
+ float translationDirection, boolean isHeadsUpAnimation, float endLocation,
+ Runnable onFinishedRunnable,
+ AnimatorListenerAdapter animationListener) {
// TODO: Use duration
performVisibilityAnimation(false);
}
@Override
- public void performAddAnimation(long delay, long duration) {
+ public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear) {
// TODO: use delay and duration
performVisibilityAnimation(true);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 6cfd42fa00eb..603902a4507d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -27,7 +27,6 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
-import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.Rect;
@@ -43,7 +42,6 @@ import android.util.FloatProperty;
import android.util.Log;
import android.util.Property;
import android.util.TypedValue;
-import android.view.View;
import android.view.ViewDebug;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.Interpolator;
@@ -144,6 +142,8 @@ public class StatusBarIconView extends AnimatedImageView {
private ColorMatrixColorFilter mMatrixColorFilter;
private boolean mIsInShelf;
private Runnable mLayoutRunnable;
+ private boolean mDismissed;
+ private Runnable mOnDismissListener;
public StatusBarIconView(Context context, String slot, StatusBarNotification sbn) {
this(context, slot, sbn, false);
@@ -165,7 +165,7 @@ public class StatusBarIconView extends AnimatedImageView {
mDensity = context.getResources().getDisplayMetrics().densityDpi;
if (mNotification != null) {
setDecorColor(getContext().getColor(
- com.android.internal.R.color.notification_icon_default_color));
+ com.android.internal.R.color.notification_default_color_light));
}
reloadDimens();
}
@@ -668,6 +668,19 @@ public class StatusBarIconView extends AnimatedImageView {
}
public void setVisibleState(int visibleState, boolean animate, Runnable endRunnable) {
+ setVisibleState(visibleState, animate, endRunnable, 0);
+ }
+
+ /**
+ * Set the visibleState of this view.
+ *
+ * @param visibleState The new state.
+ * @param animate Should we animate?
+ * @param endRunnable The runnable to run at the end.
+ * @param duration The duration of an animation or 0 if the default should be taken.
+ */
+ public void setVisibleState(int visibleState, boolean animate, Runnable endRunnable,
+ long duration) {
boolean runnableAdded = false;
if (visibleState != mVisibleState) {
mVisibleState = visibleState;
@@ -689,7 +702,8 @@ public class StatusBarIconView extends AnimatedImageView {
mIconAppearAnimator = ObjectAnimator.ofFloat(this, ICON_APPEAR_AMOUNT,
currentAmount, targetAmount);
mIconAppearAnimator.setInterpolator(interpolator);
- mIconAppearAnimator.setDuration(ANIMATION_DURATION_FAST);
+ mIconAppearAnimator.setDuration(duration == 0 ? ANIMATION_DURATION_FAST
+ : duration);
mIconAppearAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -711,8 +725,9 @@ public class StatusBarIconView extends AnimatedImageView {
if (targetAmount != currentAmount) {
mDotAnimator = ObjectAnimator.ofFloat(this, DOT_APPEAR_AMOUNT,
currentAmount, targetAmount);
- mDotAnimator.setInterpolator(interpolator);
- mDotAnimator.setDuration(ANIMATION_DURATION_FAST);
+ mDotAnimator.setInterpolator(interpolator);;
+ mDotAnimator.setDuration(duration == 0 ? ANIMATION_DURATION_FAST
+ : duration);
final boolean runRunnable = !runnableAdded;
mDotAnimator.addListener(new AnimatorListenerAdapter() {
@Override
@@ -837,6 +852,21 @@ public class StatusBarIconView extends AnimatedImageView {
mLayoutRunnable = runnable;
}
+ public void setDismissed() {
+ mDismissed = true;
+ if (mOnDismissListener != null) {
+ mOnDismissListener.run();
+ }
+ }
+
+ public boolean isDismissed() {
+ return mDismissed;
+ }
+
+ public void setOnDismissListener(Runnable onDismissListener) {
+ mOnDismissListener = onDismissListener;
+ }
+
public interface OnVisibilityChangedListener {
void onVisibilityChanged(int newVisibility);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
index 80854ec42c43..2b7949b1de54 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
@@ -76,7 +76,6 @@ public class MediaNotificationProcessor {
* notification.
*/
private final Context mPackageContext;
- private boolean mIsLowPriority;
public MediaNotificationProcessor(Context context, Context packageContext) {
this(context, packageContext, new ImageGradientColorizer());
@@ -146,10 +145,7 @@ public class MediaNotificationProcessor {
int foregroundColor = selectForegroundColor(backgroundColor, palette);
builder.setColorPalette(backgroundColor, foregroundColor);
} else {
- int id = mIsLowPriority
- ? R.color.notification_material_background_low_priority_color
- : R.color.notification_material_background_color;
- backgroundColor = mContext.getColor(id);
+ backgroundColor = mContext.getColor(R.color.notification_material_background_color);
}
Bitmap colorized = mColorizer.colorize(drawable, backgroundColor,
mContext.getResources().getConfiguration().getLayoutDirection() ==
@@ -307,8 +303,4 @@ public class MediaNotificationProcessor {
private boolean isWhite(float[] hslColor) {
return hslColor[2] >= WHITE_MIN_LIGHTNESS;
}
-
- public void setIsLowPriority(boolean isLowPriority) {
- mIsLowPriority = isLowPriority;
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java
index dfcd5e60719a..78df77fe6499 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java
@@ -52,6 +52,7 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
protected final ViewInvertHelper mInvertHelper;
protected final ViewTransformationHelper mTransformationHelper;
+ private final int mTranslationForHeader;
protected int mColor;
private ImageView mIcon;
@@ -63,6 +64,7 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
private boolean mIsLowPriority;
private boolean mTransformLowPriorityTitle;
private boolean mShowExpandButtonAtEnd;
+ protected float mHeaderTranslation;
protected NotificationHeaderViewWrapper(Context ctx, View view, ExpandableNotificationRow row) {
super(ctx, view, row);
@@ -99,6 +101,10 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
resolveHeaderViews();
updateInvertHelper();
addAppOpsOnClickListener(row);
+ mTranslationForHeader = ctx.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_content_margin)
+ - ctx.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_content_margin_top);
}
@Override
@@ -116,9 +122,9 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
mHeaderText = mView.findViewById(com.android.internal.R.id.header_text);
mExpandButton = mView.findViewById(com.android.internal.R.id.expand_button);
mWorkProfileImage = mView.findViewById(com.android.internal.R.id.profile_badge);
- mColor = resolveColor(mExpandButton);
mNotificationHeader = mView.findViewById(com.android.internal.R.id.notification_header);
mNotificationHeader.setShowExpandButtonAtEnd(mShowExpandButtonAtEnd);
+ mColor = mNotificationHeader.getOriginalIconColor();
getDozer().setColor(mColor);
}
@@ -126,16 +132,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
mNotificationHeader.setAppOpsOnClickListener(row.getAppOpsOnClickListener());
}
- private int resolveColor(ImageView icon) {
- if (icon != null && icon.getDrawable() != null) {
- ColorFilter filter = icon.getDrawable().getColorFilter();
- if (filter instanceof PorterDuffColorFilter) {
- return ((PorterDuffColorFilter) filter).getColor();
- }
- }
- return 0;
- }
-
@Override
public void onContentUpdated(ExpandableNotificationRow row) {
super.onContentUpdated(row);
@@ -243,6 +239,19 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
}
@Override
+ public void setHeaderVisibleAmount(float headerVisibleAmount) {
+ super.setHeaderVisibleAmount(headerVisibleAmount);
+ mNotificationHeader.setAlpha(headerVisibleAmount);
+ mHeaderTranslation = (1.0f - headerVisibleAmount) * mTranslationForHeader;
+ mView.setTranslationY(mHeaderTranslation);
+ }
+
+ @Override
+ public int getHeaderTranslation() {
+ return (int) mHeaderTranslation;
+ }
+
+ @Override
public NotificationHeaderView getNotificationHeader() {
return mNotificationHeader;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
index f9671182ab8c..0143d0105979 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
@@ -179,6 +179,9 @@ public class NotificationInflater {
: builder.makeAmbientNotification();
}
result.packageContext = packageContext;
+ result.headsUpStatusBarText = builder.getHeadsUpStatusBarText(false /* showingPublic */);
+ result.headsUpStatusBarTextPublic = builder.getHeadsUpStatusBarText(
+ true /* showingPublic */);
return result;
}
@@ -456,6 +459,8 @@ public class NotificationInflater {
}
entry.cachedAmbientContentView = result.newAmbientView;
}
+ entry.headsUpStatusBarText = result.headsUpStatusBarText;
+ entry.headsUpStatusBarTextPublic = result.headsUpStatusBarTextPublic;
if (endListener != null) {
endListener.onAsyncInflationFinished(row.getEntry());
}
@@ -579,15 +584,9 @@ public class NotificationInflater {
mSbn.getNotification());
Context packageContext = mSbn.getPackageContext(mContext);
Notification notification = mSbn.getNotification();
- if (mIsLowPriority) {
- int backgroundColor = mContext.getColor(
- R.color.notification_material_background_low_priority_color);
- recoveredBuilder.setBackgroundColorHint(backgroundColor);
- }
if (notification.isMediaNotification()) {
MediaNotificationProcessor processor = new MediaNotificationProcessor(mContext,
packageContext);
- processor.setIsLowPriority(mIsLowPriority);
processor.processNotification(notification, recoveredBuilder);
}
return createRemoteViews(mReInflateFlags,
@@ -665,6 +664,8 @@ public class NotificationInflater {
private View inflatedExpandedView;
private View inflatedAmbientView;
private View inflatedPublicView;
+ private CharSequence headsUpStatusBarText;
+ private CharSequence headsUpStatusBarTextPublic;
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java
index d463eae6e43f..28beb21dba4b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java
@@ -278,7 +278,10 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp
if (mActionsContainer != null) {
// We should never push the actions higher than they are in the headsup view.
int constrainedContentHeight = Math.max(mContentHeight, mMinHeightHint);
- mActionsContainer.setTranslationY(constrainedContentHeight - mView.getHeight());
+
+ // We also need to compensate for any header translation, since we're always at the end.
+ mActionsContainer.setTranslationY(constrainedContentHeight - mView.getHeight()
+ - getHeaderTranslation());
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java
index 17eb4c110031..873f088f8431 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java
@@ -133,6 +133,10 @@ public abstract class NotificationViewWrapper implements TransformableView {
return null;
}
+ public int getHeaderTranslation() {
+ return 0;
+ }
+
@Override
public TransformState getCurrentState(int fadingView) {
return null;
@@ -198,4 +202,7 @@ public abstract class NotificationViewWrapper implements TransformableView {
public boolean shouldClipToRounding(boolean topRounded, boolean bottomRounded) {
return false;
}
+
+ public void setHeaderVisibleAmount(float headerVisibleAmount) {
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index fb3adf45df31..07b79a209b82 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.phone;
import android.content.Context;
+import android.os.PowerManager;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
@@ -24,6 +25,7 @@ import android.text.TextUtils;
import android.util.MathUtils;
import android.util.SparseBooleanArray;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.systemui.Dependency;
import com.android.systemui.R;
@@ -36,19 +38,35 @@ public class DozeParameters implements TunerService.Tunable {
private static final int MAX_DURATION = 60 * 1000;
public static final String DOZE_SENSORS_WAKE_UP_FULLY = "doze_sensors_wake_up_fully";
+ private static IntInOutMatcher sPickupSubtypePerformsProxMatcher;
+ private static DozeParameters sInstance;
+
private final Context mContext;
private final AmbientDisplayConfiguration mAmbientDisplayConfiguration;
+ private final PowerManager mPowerManager;
- private static IntInOutMatcher sPickupSubtypePerformsProxMatcher;
private final AlwaysOnDisplayPolicy mAlwaysOnPolicy;
private boolean mDozeAlwaysOn;
+ private boolean mControlScreenOffAnimation;
+
+ public static DozeParameters getInstance(Context context) {
+ if (sInstance == null) {
+ sInstance = new DozeParameters(context);
+ }
+ return sInstance;
+ }
- public DozeParameters(Context context) {
+ @VisibleForTesting
+ protected DozeParameters(Context context) {
mContext = context;
mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
mAlwaysOnPolicy = new AlwaysOnDisplayPolicy(context);
+ mControlScreenOffAnimation = !getDisplayNeedsBlanking();
+ mPowerManager = mContext.getSystemService(PowerManager.class);
+ mPowerManager.setDozeAfterScreenOff(!mControlScreenOffAnimation);
+
Dependency.get(TunerService.class).addTunable(this, Settings.Secure.DOZE_ALWAYS_ON,
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
}
@@ -165,15 +183,21 @@ public class DozeParameters implements TunerService.Tunable {
com.android.internal.R.bool.config_displayBlanksAfterDoze);
}
- /**
- * Whether we can implement our own screen off animation or if we need
- * to rely on DisplayPowerManager to dim the display.
- *
- * @return {@code true} if SystemUI can control the screen off animation.
- */
- public boolean getCanControlScreenOffAnimation() {
- return !mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_dozeAfterScreenOff);
+ public boolean shouldControlScreenOff() {
+ return mControlScreenOffAnimation;
+ }
+
+ public void setControlScreenOffAnimation(boolean controlScreenOffAnimation) {
+ if (mControlScreenOffAnimation == controlScreenOffAnimation) {
+ return;
+ }
+ mControlScreenOffAnimation = controlScreenOffAnimation;
+ getPowerManager().setDozeAfterScreenOff(!controlScreenOffAnimation);
+ }
+
+ @VisibleForTesting
+ protected PowerManager getPowerManager() {
+ return mPowerManager;
}
private boolean getBoolean(String propName, int resId) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
index 1011383b72e1..afd64f373c58 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -78,9 +78,10 @@ public class DozeScrimController {
}
};
- public DozeScrimController(ScrimController scrimController, Context context) {
+ public DozeScrimController(ScrimController scrimController, Context context,
+ DozeParameters dozeParameters) {
mScrimController = scrimController;
- mDozeParameters = new DozeParameters(context);
+ mDozeParameters = dozeParameters;
}
public void setDozing(boolean dozing) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
new file mode 100644
index 000000000000..9ec56095b393
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.graphics.Rect;
+import android.view.View;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.CrossFadeHelper;
+import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.HeadsUpStatusBarView;
+import com.android.systemui.statusbar.NotificationData;
+import com.android.systemui.statusbar.policy.DarkIconDispatcher;
+import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
+import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
+
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+/**
+ * Controls the appearance of heads up notifications in the icon area and the header itself.
+ */
+class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
+ DarkIconDispatcher.DarkReceiver {
+ public static final int CONTENT_FADE_DURATION = 110;
+ public static final int CONTENT_FADE_DELAY = 100;
+ private final NotificationIconAreaController mNotificationIconAreaController;
+ private final HeadsUpManagerPhone mHeadsUpManager;
+ private final NotificationStackScrollLayout mStackScroller;
+ private final HeadsUpStatusBarView mHeadsUpStatusBarView;
+ private final View mClockView;
+ private final DarkIconDispatcher mDarkIconDispatcher;
+ private final NotificationPanelView mPanelView;
+ private final Consumer<ExpandableNotificationRow>
+ mSetTrackingHeadsUp = this::setTrackingHeadsUp;
+ private final Runnable mUpdatePanelTranslation = this::updatePanelTranslation;
+ private final BiConsumer<Float, Float> mSetExpandedHeight = this::setExpandedHeight;
+ private float mExpandedHeight;
+ private boolean mIsExpanded;
+ private float mExpandFraction;
+ private ExpandableNotificationRow mTrackedChild;
+ private boolean mShown;
+ private final View.OnLayoutChangeListener mStackScrollLayoutChangeListener =
+ (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom)
+ -> updatePanelTranslation();
+
+ public HeadsUpAppearanceController(
+ NotificationIconAreaController notificationIconAreaController,
+ HeadsUpManagerPhone headsUpManager,
+ View statusbarView) {
+ this(notificationIconAreaController, headsUpManager,
+ statusbarView.findViewById(R.id.heads_up_status_bar_view),
+ statusbarView.findViewById(R.id.notification_stack_scroller),
+ statusbarView.findViewById(R.id.notification_panel),
+ statusbarView.findViewById(R.id.clock));
+ }
+
+ @VisibleForTesting
+ public HeadsUpAppearanceController(
+ NotificationIconAreaController notificationIconAreaController,
+ HeadsUpManagerPhone headsUpManager,
+ HeadsUpStatusBarView headsUpStatusBarView,
+ NotificationStackScrollLayout stackScroller,
+ NotificationPanelView panelView,
+ View clockView) {
+ mNotificationIconAreaController = notificationIconAreaController;
+ mHeadsUpManager = headsUpManager;
+ mHeadsUpManager.addListener(this);
+ mHeadsUpStatusBarView = headsUpStatusBarView;
+ headsUpStatusBarView.setOnDrawingRectChangedListener(
+ () -> updateIsolatedIconLocation(true /* requireUpdate */));
+ mStackScroller = stackScroller;
+ mPanelView = panelView;
+ panelView.addTrackingHeadsUpListener(mSetTrackingHeadsUp);
+ panelView.addVerticalTranslationListener(mUpdatePanelTranslation);
+ panelView.setHeadsUpAppearanceController(this);
+ mStackScroller.addOnExpandedHeightListener(mSetExpandedHeight);
+ mStackScroller.addOnLayoutChangeListener(mStackScrollLayoutChangeListener);
+ mClockView = clockView;
+ mDarkIconDispatcher = Dependency.get(DarkIconDispatcher.class);
+ mDarkIconDispatcher.addDarkReceiver(this);
+ }
+
+
+ public void destroy() {
+ mHeadsUpManager.removeListener(this);
+ mHeadsUpStatusBarView.setOnDrawingRectChangedListener(null);
+ mPanelView.removeTrackingHeadsUpListener(mSetTrackingHeadsUp);
+ mPanelView.removeVerticalTranslationListener(mUpdatePanelTranslation);
+ mPanelView.setHeadsUpAppearanceController(null);
+ mStackScroller.removeOnExpandedHeightListener(mSetExpandedHeight);
+ mStackScroller.removeOnLayoutChangeListener(mStackScrollLayoutChangeListener);
+ mDarkIconDispatcher.removeDarkReceiver(this);
+ }
+
+ private void updateIsolatedIconLocation(boolean requireStateUpdate) {
+ mNotificationIconAreaController.setIsolatedIconLocation(
+ mHeadsUpStatusBarView.getIconDrawingRect(), requireStateUpdate);
+ }
+
+ @Override
+ public void onHeadsUpPinned(ExpandableNotificationRow headsUp) {
+ updateTopEntry();
+ updateHeader(headsUp.getEntry());
+ }
+
+ public void updatePanelTranslation() {
+ float newTranslation = mStackScroller.getLeft() + mStackScroller.getTranslationX();
+ mHeadsUpStatusBarView.setTranslationX(newTranslation);
+ }
+
+ private void updateTopEntry() {
+ NotificationData.Entry newEntry = null;
+ if (!mIsExpanded && mHeadsUpManager.hasPinnedHeadsUp()) {
+ newEntry = mHeadsUpManager.getTopEntry();
+ }
+ NotificationData.Entry previousEntry = mHeadsUpStatusBarView.getShowingEntry();
+ mHeadsUpStatusBarView.setEntry(newEntry);
+ if (newEntry != previousEntry) {
+ boolean animateIsolation = false;
+ if (newEntry == null) {
+ // no heads up anymore, lets start the disappear animation
+
+ setShown(false);
+ animateIsolation = !mIsExpanded;
+ } else if (previousEntry == null) {
+ // We now have a headsUp and didn't have one before. Let's start the disappear
+ // animation
+ setShown(true);
+ animateIsolation = !mIsExpanded;
+ }
+ updateIsolatedIconLocation(false /* requireUpdate */);
+ mNotificationIconAreaController.showIconIsolated(newEntry == null ? null
+ : newEntry.icon, animateIsolation);
+ }
+ }
+
+ private void setShown(boolean isShown) {
+ if (mShown != isShown) {
+ mShown = isShown;
+ if (isShown) {
+ mHeadsUpStatusBarView.setVisibility(View.VISIBLE);
+ CrossFadeHelper.fadeIn(mHeadsUpStatusBarView, CONTENT_FADE_DURATION /* duration */,
+ CONTENT_FADE_DELAY /* delay */);
+ CrossFadeHelper.fadeOut(mClockView, CONTENT_FADE_DURATION/* duration */,
+ 0 /* delay */, () -> mClockView.setVisibility(View.INVISIBLE));
+ } else {
+ CrossFadeHelper.fadeIn(mClockView, CONTENT_FADE_DURATION /* duration */,
+ CONTENT_FADE_DELAY /* delay */);
+ CrossFadeHelper.fadeOut(mHeadsUpStatusBarView, CONTENT_FADE_DURATION/* duration */,
+ 0 /* delay */, () -> mHeadsUpStatusBarView.setVisibility(View.GONE));
+
+ }
+ }
+ }
+
+ @VisibleForTesting
+ public boolean isShown() {
+ return mShown;
+ }
+
+ /**
+ * Should the headsup status bar view be visible right now? This may be different from isShown,
+ * since the headsUp manager might not have notified us yet of the state change.
+ *
+ * @return if the heads up status bar view should be shown
+ */
+ public boolean shouldBeVisible() {
+ return !mIsExpanded && mHeadsUpManager.hasPinnedHeadsUp();
+ }
+
+ @Override
+ public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) {
+ updateTopEntry();
+ updateHeader(headsUp.getEntry());
+ }
+
+ public void setExpandedHeight(float expandedHeight, float appearFraction) {
+ boolean changedHeight = expandedHeight != mExpandedHeight;
+ mExpandedHeight = expandedHeight;
+ mExpandFraction = appearFraction;
+ boolean isExpanded = expandedHeight > 0;
+ if (changedHeight) {
+ updateHeadsUpHeaders();
+ }
+ if (isExpanded != mIsExpanded) {
+ mIsExpanded = isExpanded;
+ updateTopEntry();
+ }
+ }
+
+ /**
+ * Set a headsUp to be tracked, meaning that it is currently being pulled down after being
+ * in a pinned state on the top. The expand animation is different in that case and we need
+ * to update the header constantly afterwards.
+ *
+ * @param trackedChild the tracked headsUp or null if it's not tracking anymore.
+ */
+ public void setTrackingHeadsUp(ExpandableNotificationRow trackedChild) {
+ ExpandableNotificationRow previousTracked = mTrackedChild;
+ mTrackedChild = trackedChild;
+ if (previousTracked != null) {
+ updateHeader(previousTracked.getEntry());
+ }
+ }
+
+ private void updateHeadsUpHeaders() {
+ mHeadsUpManager.getAllEntries().forEach(entry -> {
+ updateHeader(entry);
+ });
+ }
+
+ private void updateHeader(NotificationData.Entry entry) {
+ ExpandableNotificationRow row = entry.row;
+ float headerVisibleAmount = 1.0f;
+ if (row.isPinned() || row == mTrackedChild) {
+ headerVisibleAmount = mExpandFraction;
+ }
+ row.setHeaderVisibleAmount(headerVisibleAmount);
+ }
+
+ @Override
+ public void onDarkChanged(Rect area, float darkIntensity, int tint) {
+ mHeadsUpStatusBarView.onDarkChanged(area, darkIntensity, tint);
+ }
+
+ public void setPublicMode(boolean publicMode) {
+ mHeadsUpStatusBarView.setPublicMode(publicMode);
+ updateTopEntry();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index d2cdc27d982c..fa0a774c249e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -29,6 +29,7 @@ import android.view.ViewTreeObserver;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dumpable;
+import com.android.systemui.R;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.StatusBarState;
@@ -52,12 +53,13 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
private static final boolean DEBUG = false;
private final View mStatusBarWindowView;
- private int mStatusBarHeight;
private final NotificationGroupManager mGroupManager;
private final StatusBar mBar;
private final VisualStabilityManager mVisualStabilityManager;
-
private boolean mReleaseOnExpandFinish;
+
+ private int mStatusBarHeight;
+ private int mHeadsUpInset;
private boolean mTrackingHeadsUp;
private HashSet<String> mSwipedOutKeys = new HashSet<>();
private HashSet<NotificationData.Entry> mEntriesToRemoveAfterExpand = new HashSet<>();
@@ -101,9 +103,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
mBar = bar;
mVisualStabilityManager = visualStabilityManager;
- Resources resources = mContext.getResources();
- mStatusBarHeight = resources.getDimensionPixelSize(
- com.android.internal.R.dimen.status_bar_height);
+ initResources();
addListener(new OnHeadsUpChangedListener() {
@Override
@@ -114,6 +114,20 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
});
}
+ private void initResources() {
+ Resources resources = mContext.getResources();
+ mStatusBarHeight = resources.getDimensionPixelSize(
+ com.android.internal.R.dimen.status_bar_height);
+ mHeadsUpInset = mStatusBarHeight + resources.getDimensionPixelSize(
+ R.dimen.heads_up_status_bar_padding);
+ }
+
+ @Override
+ public void onDensityOrFontScaleChanged() {
+ super.onDensityOrFontScaleChanged();
+ initResources();
+ }
+
///////////////////////////////////////////////////////////////////////////////////////////////
// Public methods:
@@ -283,10 +297,10 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
topEntry.getLocationOnScreen(mTmpTwoArray);
int minX = mTmpTwoArray[0];
int maxX = mTmpTwoArray[0] + topEntry.getWidth();
- int maxY = topEntry.getIntrinsicHeight();
+ int height = topEntry.getIntrinsicHeight();
info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
- info.touchableRegion.set(minX, 0, maxX, maxY);
+ info.touchableRegion.set(minX, 0, maxX, mHeadsUpInset + height);
} else if (mHeadsUpGoingAway || mWaitingOnCollapseWhenGoingAway) {
info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
info.touchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java
index 2bfdefe39017..903b81339869 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java
@@ -23,7 +23,6 @@ import android.view.ViewConfiguration;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.ExpandableView;
-import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
/**
@@ -102,10 +101,11 @@ public class HeadsUpTouchHelper implements Gefingerpoken {
mCollapseSnoozes = h < 0;
mInitialTouchX = x;
mInitialTouchY = y;
- int expandedHeight = mPickedChild.getActualHeight();
- mPanel.setPanelScrimMinFraction((float) expandedHeight
+ int startHeight = (int) (mPickedChild.getActualHeight()
+ + mPickedChild.getTranslationY());
+ mPanel.setPanelScrimMinFraction((float) startHeight
/ mPanel.getMaxPanelHeight());
- mPanel.startExpandMotion(x, y, true /* startTracking */, expandedHeight);
+ mPanel.startExpandMotion(x, y, true /* startTracking */, startHeight);
mPanel.startExpandingFromPeek();
// This call needs to be after the expansion start otherwise we will get a
// flicker of one frame as it's not expanded yet.
@@ -135,7 +135,7 @@ public class HeadsUpTouchHelper implements Gefingerpoken {
private void setTrackingHeadsUp(boolean tracking) {
mTrackingHeadsUp = tracking;
mHeadsUpManager.setTrackingHeadsUp(tracking);
- mPanel.setTrackingHeadsUp(tracking);
+ mPanel.setTrackedHeadsUp(tracking ? mPickedChild : null);
}
public void notifyFling(boolean collapse) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 2a1813fecd12..d609ae7b7374 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -60,10 +60,6 @@ public class KeyguardBouncer {
private final FalsingManager mFalsingManager;
private final DismissCallbackRegistry mDismissCallbackRegistry;
private final Handler mHandler;
- protected KeyguardHostView mKeyguardView;
- protected ViewGroup mRoot;
- private boolean mShowingSoon;
- private int mBouncerPromptReason;
private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback =
new KeyguardUpdateMonitorCallback() {
@Override
@@ -72,7 +68,14 @@ public class KeyguardBouncer {
}
};
private final Runnable mRemoveViewRunnable = this::removeView;
+
private int mStatusBarHeight;
+ private float mExpansion;
+ protected KeyguardHostView mKeyguardView;
+ protected ViewGroup mRoot;
+ private boolean mShowingSoon;
+ private int mBouncerPromptReason;
+ private boolean mIsAnimatingAway;
public KeyguardBouncer(Context context, ViewMediatorCallback callback,
LockPatternUtils lockPatternUtils, ViewGroup container,
@@ -252,6 +255,7 @@ public class KeyguardBouncer {
mKeyguardView.cancelDismissAction();
mKeyguardView.cleanUp();
}
+ mIsAnimatingAway = false;
if (mRoot != null) {
mRoot.setVisibility(View.INVISIBLE);
if (destroyView) {
@@ -267,6 +271,7 @@ public class KeyguardBouncer {
* See {@link StatusBarKeyguardViewManager#startPreHideAnimation}.
*/
public void startPreHideAnimation(Runnable runnable) {
+ mIsAnimatingAway = true;
if (mKeyguardView != null) {
mKeyguardView.startDisappearAnimation(runnable);
} else if (runnable != null) {
@@ -290,7 +295,16 @@ public class KeyguardBouncer {
}
public boolean isShowing() {
- return mShowingSoon || (mRoot != null && mRoot.getVisibility() == View.VISIBLE);
+ return (mShowingSoon || (mRoot != null && mRoot.getVisibility() == View.VISIBLE))
+ && mExpansion == 0;
+ }
+
+ /**
+ * @return {@code true} when bouncer's pre-hide animation already started but isn't completely
+ * hidden yet, {@code false} otherwise.
+ */
+ public boolean isAnimatingAway() {
+ return mIsAnimatingAway;
}
public void prepare() {
@@ -308,7 +322,8 @@ public class KeyguardBouncer {
* @see StatusBarKeyguardViewManager#onPanelExpansionChanged
*/
public void setExpansion(float fraction) {
- if (mKeyguardView != null) {
+ mExpansion = fraction;
+ if (mKeyguardView != null && !mIsAnimatingAway) {
float alpha = MathUtils.map(ALPHA_EXPANSION_THRESHOLD, 1, 1, 0, fraction);
mKeyguardView.setAlpha(MathUtils.constrain(alpha, 0f, 1f));
mKeyguardView.setTranslationY(fraction * mKeyguardView.getHeight());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index b493d7a0e7ed..a39800d156c9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -464,7 +464,10 @@ public class NavigationBarFragment extends Fragment implements Callbacks {
private void onRotationSuggestionsDisabled() {
// Immediately hide the rotate button and clear any planned removal
setRotateSuggestionButtonState(false, true);
- getView().removeCallbacks(mRemoveRotationProposal);
+
+ // This method can be called before view setup is done, ensure getView isn't null
+ final View v = getView();
+ if (v != null) v.removeCallbacks(mRemoveRotationProposal);
}
private void showAndLogRotationSuggestion() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index fcbd37c50f73..8fb0620d8064 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -679,11 +679,12 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
public void updateStates() {
updateSlippery();
+ reloadNavIcons();
updateNavButtonIcons();
}
private void updateSlippery() {
- setSlippery(mOverviewProxyService.getProxy() != null && mPanelView.isFullyExpanded());
+ setSlippery(!isQuickStepSwipeUpEnabled() || mPanelView.isFullyExpanded());
}
private void setSlippery(boolean slippery) {
@@ -818,8 +819,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
public void onOverviewProxyConnectionChanged(boolean isConnected) {
updateStates();
setUpSwipeUpOnboarding(isQuickStepSwipeUpEnabled());
- reloadNavIcons();
- updateNavButtonIcons();
}
@Override
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 e1aed7a04c35..9063dea584b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -12,9 +12,11 @@ import android.widget.FrameLayout;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.NotificationColorUtil;
+import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
+import com.android.systemui.statusbar.NotificationEntryManager;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.notification.NotificationUtils;
@@ -31,6 +33,8 @@ import java.util.function.Function;
*/
public class NotificationIconAreaController implements DarkReceiver {
private final NotificationColorUtil mNotificationColorUtil;
+ private final NotificationEntryManager mEntryManager;
+ private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons;
private int mIconSize;
private int mIconHPadding;
@@ -48,6 +52,7 @@ public class NotificationIconAreaController implements DarkReceiver {
mStatusBar = statusBar;
mNotificationColorUtil = NotificationColorUtil.getInstance(context);
mContext = context;
+ mEntryManager = Dependency.get(NotificationEntryManager.class);
initializeNotificationAreaViews(context);
}
@@ -129,8 +134,8 @@ public class NotificationIconAreaController implements DarkReceiver {
}
protected boolean shouldShowNotificationIcon(NotificationData.Entry entry,
- NotificationData notificationData, boolean showAmbient) {
- if (notificationData.isAmbient(entry.key) && !showAmbient) {
+ boolean showAmbient, boolean hideDismissed) {
+ if (mEntryManager.getNotificationData().isAmbient(entry.key) && !showAmbient) {
return false;
}
if (!StatusBar.isTopLevelChild(entry)) {
@@ -139,9 +144,13 @@ public class NotificationIconAreaController implements DarkReceiver {
if (entry.row.getVisibility() == View.GONE) {
return false;
}
+ if (entry.row.isDismissed() && hideDismissed) {
+ return false;
+ }
// showAmbient == show in shade but not shelf
- if (!showAmbient && notificationData.shouldSuppressStatusBar(entry.key)) {
+ if (!showAmbient && mEntryManager.getNotificationData().shouldSuppressStatusBar(
+ entry.key)) {
return false;
}
@@ -151,28 +160,30 @@ public class NotificationIconAreaController implements DarkReceiver {
/**
* Updates the notifications with the given list of notifications to display.
*/
- public void updateNotificationIcons(NotificationData notificationData) {
+ public void updateNotificationIcons() {
- updateIconsForLayout(notificationData, entry -> entry.icon, mNotificationIcons,
- false /* showAmbient */);
- updateIconsForLayout(notificationData, entry -> entry.expandedIcon, mShelfIcons,
- NotificationShelf.SHOW_AMBIENT_ICONS);
+ updateStatusBarIcons();
+ updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons,
+ NotificationShelf.SHOW_AMBIENT_ICONS, false /* hideDismissed */);
applyNotificationIconsTint();
}
+ private void updateStatusBarIcons() {
+ updateIconsForLayout(entry -> entry.icon, mNotificationIcons,
+ false /* showAmbient */, true /* hideDismissed */);
+ }
+
/**
* 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.
- *
- * @param notificationData the notification data to look up which notifications are relevant
* @param function A function to look up an icon view based on an entry
* @param hostLayout which layout should be updated
* @param showAmbient should ambient notification icons be shown
+ * @param hideDismissed should dismissed icons be hidden
*/
- private void updateIconsForLayout(NotificationData notificationData,
- Function<NotificationData.Entry, StatusBarIconView> function,
- NotificationIconContainer hostLayout, boolean showAmbient) {
+ private void updateIconsForLayout(Function<NotificationData.Entry, StatusBarIconView> function,
+ NotificationIconContainer hostLayout, boolean showAmbient, boolean hideDismissed) {
ArrayList<StatusBarIconView> toShow = new ArrayList<>(
mNotificationScrollLayout.getChildCount());
@@ -181,7 +192,7 @@ public class NotificationIconAreaController implements DarkReceiver {
View view = mNotificationScrollLayout.getChildAt(i);
if (view instanceof ExpandableNotificationRow) {
NotificationData.Entry ent = ((ExpandableNotificationRow) view).getEntry();
- if (shouldShowNotificationIcon(ent, notificationData, showAmbient)) {
+ if (shouldShowNotificationIcon(ent, showAmbient, hideDismissed)) {
toShow.add(function.apply(ent));
}
}
@@ -243,10 +254,13 @@ public class NotificationIconAreaController implements DarkReceiver {
final FrameLayout.LayoutParams params = generateIconLayoutParams();
for (int i = 0; i < toShow.size(); i++) {
- View v = toShow.get(i);
+ StatusBarIconView v = toShow.get(i);
// The view might still be transiently added if it was just removed and added again
hostLayout.removeTransientView(v);
if (v.getParent() == null) {
+ if (hideDismissed) {
+ v.setOnDismissListener(mUpdateStatusBarIcons);
+ }
hostLayout.addView(v, i, params);
}
}
@@ -296,4 +310,12 @@ public class NotificationIconAreaController implements DarkReceiver {
mNotificationIcons.setDark(dark, false, 0);
mShelfIcons.setDark(dark, false, 0);
}
+
+ public void showIconIsolated(StatusBarIconView icon, boolean animated) {
+ mNotificationIcons.showIconIsolated(icon, animated);
+ }
+
+ public void setIsolatedIconLocation(Rect iconDrawingRect, boolean requireStateUpdate) {
+ mNotificationIcons.setIsolatedIconLocation(iconDrawingRect, requireStateUpdate);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index b29ac9067556..55174349cc53 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -16,17 +16,17 @@
package com.android.systemui.statusbar.phone;
+import static com.android.systemui.statusbar.phone.HeadsUpAppearanceController.CONTENT_FADE_DURATION;
+import static com.android.systemui.statusbar.phone.HeadsUpAppearanceController.CONTENT_FADE_DELAY;
+
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
+import android.graphics.Rect;
import android.graphics.drawable.Icon;
-import android.os.AsyncTask;
-import android.os.VibrationEffect;
-import android.os.Vibrator;
import android.support.v4.util.ArrayMap;
-import android.support.v4.util.ArraySet;
import android.util.AttributeSet;
import android.view.View;
@@ -100,6 +100,33 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
}
}.setDuration(200).setDelay(50);
+ /**
+ * The animation property used for all icons that were not isolated, when the isolation ends.
+ * This just fades the alpha and doesn't affect the movement and has a delay.
+ */
+ private static final AnimationProperties UNISOLATION_PROPERTY_OTHERS
+ = new AnimationProperties() {
+ private AnimationFilter mAnimationFilter = new AnimationFilter().animateAlpha();
+
+ @Override
+ public AnimationFilter getAnimationFilter() {
+ return mAnimationFilter;
+ }
+ }.setDuration(CONTENT_FADE_DURATION);
+
+ /**
+ * The animation property used for the icon when its isolation ends.
+ * This animates the translation back to the right position.
+ */
+ private static final AnimationProperties UNISOLATION_PROPERTY = new AnimationProperties() {
+ private AnimationFilter mAnimationFilter = new AnimationFilter().animateX();
+
+ @Override
+ public AnimationFilter getAnimationFilter() {
+ return mAnimationFilter;
+ }
+ }.setDuration(CONTENT_FADE_DURATION);
+
public static final int MAX_VISIBLE_ICONS_WHEN_DARK = 5;
public static final int MAX_STATIC_ICONS = 4;
private static final int MAX_DOTS = 3;
@@ -127,6 +154,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
private float mVisualOverflowStart;
// Keep track of overflow in range [0, 3]
private int mNumDots;
+ private StatusBarIconView mIsolatedIcon;
+ private Rect mIsolatedIconLocation;
+ private int[] mAbsolutePosition = new int[2];
+ private View mIsolatedIconForAnimation;
public NotificationIconContainer(Context context, AttributeSet attrs) {
@@ -196,13 +227,18 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
mIconSize = child.getWidth();
}
}
+ getLocationOnScreen(mAbsolutePosition);
if (mIsStaticLayout) {
- resetViewStates();
- calculateIconTranslations();
- applyIconStates();
+ updateState();
}
}
+ private void updateState() {
+ resetViewStates();
+ calculateIconTranslations();
+ applyIconStates();
+ }
+
public void applyIconStates() {
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
@@ -214,6 +250,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
mAddAnimationStartIndex = -1;
mCannedAnimationStartIndex = -1;
mDisallowNextAnimation = false;
+ mIsolatedIconForAnimation = null;
}
@Override
@@ -281,8 +318,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
mIconStates.remove(child);
if (!isReplacingIcon) {
addTransientView(icon, 0);
+ boolean isIsolatedIcon = child == mIsolatedIcon;
icon.setVisibleState(StatusBarIconView.STATE_HIDDEN, true /* animate */,
- () -> removeTransientView(icon));
+ () -> removeTransientView(icon),
+ isIsolatedIcon ? CONTENT_FADE_DURATION : 0);
}
}
}
@@ -306,7 +345,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
View view = getChildAt(i);
ViewState iconState = mIconStates.get(view);
iconState.initFrom(view);
- iconState.alpha = 1.0f;
+ iconState.alpha = mIsolatedIcon == null || view == mIsolatedIcon ? 1.0f : 0.0f;
iconState.hidden = false;
}
}
@@ -402,6 +441,16 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
iconState.xTranslation = getWidth() - iconState.xTranslation - view.getWidth();
}
}
+ if (mIsolatedIcon != null) {
+ IconState iconState = mIconStates.get(mIsolatedIcon);
+ if (iconState != null) {
+ // Most of the time the icon isn't yet added when this is called but only happening
+ // later
+ iconState.xTranslation = mIsolatedIconLocation.left - mAbsolutePosition[0]
+ - (1 - mIsolatedIcon.getIconScale()) * mIsolatedIcon.getWidth() / 2.0f;
+ iconState.visibleState = StatusBarIconView.STATE_ICON;
+ }
+ }
}
private float getLayoutEnd() {
@@ -573,6 +622,21 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
mReplacingIcons = replacingIcons;
}
+ public void showIconIsolated(StatusBarIconView icon, boolean animated) {
+ if (animated) {
+ mIsolatedIconForAnimation = icon != null ? icon : mIsolatedIcon;
+ }
+ mIsolatedIcon = icon;
+ updateState();
+ }
+
+ public void setIsolatedIconLocation(Rect isolatedIconLocation, boolean requireUpdate) {
+ mIsolatedIconLocation = isolatedIconLocation;
+ if (requireUpdate) {
+ updateState();
+ }
+ }
+
public class IconState extends ViewState {
public static final int NO_VALUE = NotificationIconContainer.NO_VALUE;
public float iconAppearAmount = 1.0f;
@@ -646,6 +710,18 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
animationProperties.setDuration(CANNED_ANIMATION_DURATION);
animate = true;
}
+ if (mIsolatedIconForAnimation != null) {
+ if (view == mIsolatedIconForAnimation) {
+ animationProperties = UNISOLATION_PROPERTY;
+ animationProperties.setDelay(
+ mIsolatedIcon != null ? CONTENT_FADE_DELAY : 0);
+ } else {
+ animationProperties = UNISOLATION_PROPERTY_OTHERS;
+ animationProperties.setDelay(
+ mIsolatedIcon == null ? CONTENT_FADE_DELAY : 0);
+ }
+ animate = true;
+ }
}
icon.setVisibleState(visibleState, animationsAllowed);
icon.setIconColor(iconColor, needsCannedAnimation && animationsAllowed);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 2711d7ac7a89..64e205d0545b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -74,7 +74,9 @@ import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.StackStateAnimator;
+import java.util.ArrayList;
import java.util.List;
+import java.util.function.Consumer;
public class NotificationPanelView extends PanelView implements
ExpandableView.OnHeightChangedListener,
@@ -243,6 +245,10 @@ public class NotificationPanelView extends PanelView implements
private float mExpandOffset;
private boolean mHideIconsDuringNotificationLaunch = true;
private int mStackScrollerMeasuringPass;
+ private ArrayList<Consumer<ExpandableNotificationRow>> mTrackingHeadsUpListeners
+ = new ArrayList<>();
+ private ArrayList<Runnable> mVerticalTranslationListener = new ArrayList<>();
+ private HeadsUpAppearanceController mHeadsUpAppearanceController;
public NotificationPanelView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -269,6 +275,7 @@ public class NotificationPanelView extends PanelView implements
mNotificationStackScroller.setOnHeightChangedListener(this);
mNotificationStackScroller.setOverscrollTopChangedListener(this);
mNotificationStackScroller.setOnEmptySpaceClickListener(this);
+ addTrackingHeadsUpListener(mNotificationStackScroller::setTrackingHeadsUp);
mKeyguardBottomArea = findViewById(R.id.keyguard_bottom_area);
mQsNavbarScrim = findViewById(R.id.qs_navbar_scrim);
mLastOrientation = getResources().getConfiguration().orientation;
@@ -1139,6 +1146,14 @@ public class NotificationPanelView extends PanelView implements
@Override
public void run() {
mKeyguardStatusViewAnimating = false;
+ mKeyguardStatusView.setVisibility(View.INVISIBLE);
+ }
+ };
+
+ private final Runnable mAnimateKeyguardStatusViewGoneEndRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardStatusViewAnimating = false;
mKeyguardStatusView.setVisibility(View.GONE);
}
};
@@ -1227,16 +1242,17 @@ public class NotificationPanelView extends PanelView implements
private void setKeyguardStatusViewVisibility(int statusBarState, boolean keyguardFadingAway,
boolean goingToFullShade) {
+ mKeyguardStatusView.animate().cancel();
+ mKeyguardStatusViewAnimating = false;
if ((!keyguardFadingAway && mStatusBarState == StatusBarState.KEYGUARD
&& statusBarState != StatusBarState.KEYGUARD) || goingToFullShade) {
- mKeyguardStatusView.animate().cancel();
mKeyguardStatusViewAnimating = true;
mKeyguardStatusView.animate()
.alpha(0f)
.setStartDelay(0)
.setDuration(160)
.setInterpolator(Interpolators.ALPHA_OUT)
- .withEndAction(mAnimateKeyguardStatusViewInvisibleEndRunnable);
+ .withEndAction(mAnimateKeyguardStatusViewGoneEndRunnable);
if (keyguardFadingAway) {
mKeyguardStatusView.animate()
.setStartDelay(mStatusBar.getKeyguardFadingAwayDelay())
@@ -1245,7 +1261,6 @@ public class NotificationPanelView extends PanelView implements
}
} else if (mStatusBarState == StatusBarState.SHADE_LOCKED
&& statusBarState == StatusBarState.KEYGUARD) {
- mKeyguardStatusView.animate().cancel();
mKeyguardStatusView.setVisibility(View.VISIBLE);
mKeyguardStatusViewAnimating = true;
mKeyguardStatusView.setAlpha(0f);
@@ -1256,13 +1271,21 @@ public class NotificationPanelView extends PanelView implements
.setInterpolator(Interpolators.ALPHA_IN)
.withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable);
} else if (statusBarState == StatusBarState.KEYGUARD) {
- mKeyguardStatusView.animate().cancel();
- mKeyguardStatusViewAnimating = false;
- mKeyguardStatusView.setVisibility(View.VISIBLE);
- mKeyguardStatusView.setAlpha(1f);
+ if (keyguardFadingAway) {
+ mKeyguardStatusViewAnimating = true;
+ mKeyguardStatusView.animate()
+ .alpha(0)
+ .translationYBy(-getHeight() * 0.05f)
+ .setInterpolator(Interpolators.FAST_OUT_LINEAR_IN)
+ .setDuration(125)
+ .setStartDelay(0)
+ .withEndAction(mAnimateKeyguardStatusViewInvisibleEndRunnable)
+ .start();
+ } else {
+ mKeyguardStatusView.setVisibility(View.VISIBLE);
+ mKeyguardStatusView.setAlpha(1f);
+ }
} else {
- mKeyguardStatusView.animate().cancel();
- mKeyguardStatusViewAnimating = false;
mKeyguardStatusView.setVisibility(View.GONE);
mKeyguardStatusView.setAlpha(1f);
}
@@ -1780,11 +1803,19 @@ public class NotificationPanelView extends PanelView implements
mQsExpandImmediate = false;
mTwoFingerQsExpandPossible = false;
mIsExpansionFromHeadsUp = false;
- mNotificationStackScroller.setTrackingHeadsUp(false);
+ notifyListenersTrackingHeadsUp(null);
mExpandingFromHeadsUp = false;
setPanelScrimMinFraction(0.0f);
}
+ private void notifyListenersTrackingHeadsUp(ExpandableNotificationRow pickedChild) {
+ for (int i = 0; i < mTrackingHeadsUpListeners.size(); i++) {
+ Consumer<ExpandableNotificationRow> listener
+ = mTrackingHeadsUpListeners.get(i);
+ listener.accept(pickedChild);
+ }
+ }
+
private void setListening(boolean listening) {
mKeyguardStatusBar.setListening(listening);
if (mQs == null) return;
@@ -2197,14 +2228,6 @@ public class NotificationPanelView extends PanelView implements
return (1 - t) * start + t * end;
}
- public void setDozing(boolean dozing, boolean animate) {
- if (dozing == mDozing) return;
- mDozing = dozing;
- if (mStatusBarState == StatusBarState.KEYGUARD) {
- updateDozingVisibilities(animate);
- }
- }
-
private void updateDozingVisibilities(boolean animate) {
if (mDozing) {
mKeyguardStatusBar.setVisibility(View.INVISIBLE);
@@ -2337,6 +2360,14 @@ public class NotificationPanelView extends PanelView implements
@Override
public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) {
+
+ // When we're unpinning the notification via active edge they remain heads-upped,
+ // we need to make sure that an animation happens in this case, otherwise the notification
+ // will stick to the top without any interaction.
+ if (isFullyCollapsed() && headsUp.isHeadsUp()) {
+ mNotificationStackScroller.generateHeadsUpAnimation(headsUp, false);
+ headsUp.setHeadsUpIsVisible();
+ }
}
@Override
@@ -2351,9 +2382,9 @@ public class NotificationPanelView extends PanelView implements
this);
}
- public void setTrackingHeadsUp(boolean tracking) {
- if (tracking) {
- mNotificationStackScroller.setTrackingHeadsUp(true);
+ public void setTrackedHeadsUp(ExpandableNotificationRow pickedChild) {
+ if (pickedChild != null) {
+ notifyListenersTrackingHeadsUp(pickedChild);
mExpandingFromHeadsUp = true;
}
// otherwise we update the state when the expansion is finished
@@ -2400,6 +2431,10 @@ public class NotificationPanelView extends PanelView implements
protected void setVerticalPanelTranslation(float translation) {
mNotificationStackScroller.setTranslationX(translation);
mQsFrame.setTranslationX(translation);
+ int size = mVerticalTranslationListener.size();
+ for (int i = 0; i < size; i++) {
+ mVerticalTranslationListener.get(i).run();
+ }
}
protected void updateExpandedHeight(float expandedHeight) {
@@ -2555,6 +2590,10 @@ public class NotificationPanelView extends PanelView implements
if (mLaunchingNotification) {
return mHideIconsDuringNotificationLaunch;
}
+ if (mHeadsUpAppearanceController != null
+ && mHeadsUpAppearanceController.shouldBeVisible()) {
+ return false;
+ }
return !isFullWidth() || !mShowIconsWhenExpanded;
}
@@ -2600,11 +2639,16 @@ public class NotificationPanelView extends PanelView implements
}
}
- public void setDark(boolean dark, boolean animate) {
- float darkAmount = dark ? 1 : 0;
- if (mDarkAmount == darkAmount) {
- return;
+ public void setDozing(boolean dozing, boolean animate) {
+ if (dozing == mDozing) return;
+ mDozing = dozing;
+
+ if (mStatusBarState == StatusBarState.KEYGUARD
+ || mStatusBarState == StatusBarState.SHADE_LOCKED) {
+ updateDozingVisibilities(animate);
}
+
+ final float darkAmount = dozing ? 1 : 0;
if (mDarkAnimator != null && mDarkAnimator.isRunning()) {
if (animate && mDarkAmountTarget == darkAmount) {
return;
@@ -2696,4 +2740,34 @@ public class NotificationPanelView extends PanelView implements
}
}
}
+
+ public void addTrackingHeadsUpListener(Consumer<ExpandableNotificationRow> listener) {
+ mTrackingHeadsUpListeners.add(listener);
+ }
+
+ public void removeTrackingHeadsUpListener(Consumer<ExpandableNotificationRow> listener) {
+ mTrackingHeadsUpListeners.remove(listener);
+ }
+
+ public void addVerticalTranslationListener(Runnable verticalTranslationListener) {
+ mVerticalTranslationListener.add(verticalTranslationListener);
+ }
+
+ public void removeVerticalTranslationListener(Runnable verticalTranslationListener) {
+ mVerticalTranslationListener.remove(verticalTranslationListener);
+ }
+
+ public void setHeadsUpAppearanceController(
+ HeadsUpAppearanceController headsUpAppearanceController) {
+ mHeadsUpAppearanceController = headsUpAppearanceController;
+ }
+
+ /**
+ * Starts the animation before we dismiss Keyguard, i.e. an disappearing animation on the
+ * security view of the bouncer.
+ */
+ public void onBouncerPreHideAnimation() {
+ setKeyguardStatusViewVisibility(mStatusBarState, true /* keyguardFadingAway */,
+ false /* goingToFullShade */);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
index b448967f6ac7..c4d7e72c0d82 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
@@ -28,6 +28,7 @@ public abstract class PanelBar extends FrameLayout {
public static final String TAG = PanelBar.class.getSimpleName();
private static final boolean SPEW = false;
private boolean mBouncerShowing;
+ private boolean mExpanded;
public static final void LOG(String fmt, Object... args) {
if (!DEBUG) return;
@@ -71,10 +72,15 @@ public abstract class PanelBar extends FrameLayout {
: IMPORTANT_FOR_ACCESSIBILITY_AUTO;
setImportantForAccessibility(important);
+ updateVisibility();
if (mPanel != null) mPanel.setImportantForAccessibility(important);
}
+ private void updateVisibility() {
+ mPanel.setVisibility(mExpanded || mBouncerShowing ? VISIBLE : INVISIBLE);
+ }
+
public boolean panelEnabled() {
return true;
}
@@ -124,7 +130,8 @@ public abstract class PanelBar extends FrameLayout {
boolean fullyOpened = false;
if (SPEW) LOG("panelExpansionChanged: start state=%d", mState);
PanelView pv = mPanel;
- pv.setVisibility(expanded || mBouncerShowing ? VISIBLE : INVISIBLE);
+ mExpanded = expanded;
+ updateVisibility();
// adjust any other panels that may be partially visible
if (expanded) {
if (mState == STATE_CLOSED) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
index 19544b170d1f..9abbfb83f488 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
@@ -352,7 +352,7 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
@Override
public void onDraw(Canvas canvas) {
- if (mNavigationBarView.isQuickScrubEnabled()) {
+ if (!mNavigationBarView.isQuickScrubEnabled()) {
return;
}
int color = (int) mTrackColorEvaluator.evaluate(mDarkIntensity, mLightTrackColor,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 739d8d5c2c67..cfc0cc6207c3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -49,7 +49,6 @@ import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.ScrimView;
-import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.stack.ViewState;
import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.wakelock.DelayedWakeLock;
@@ -63,8 +62,8 @@ import java.util.function.Consumer;
* Controls both the scrim behind the notifications and in front of the notifications (when a
* security method gets shown).
*/
-public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
- OnHeadsUpChangedListener, OnColorsChangedListener, Dumpable {
+public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnColorsChangedListener,
+ Dumpable {
private static final String TAG = "ScrimController";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -106,7 +105,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
private final Context mContext;
protected final ScrimView mScrimBehind;
protected final ScrimView mScrimInFront;
- private final View mHeadsUpScrim;
private final LightBarController mLightBarController;
private final UnlockMethodCache mUnlockMethodCache;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@@ -140,9 +138,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
private int mCurrentInFrontTint;
private int mCurrentBehindTint;
private boolean mWallpaperVisibilityTimedOut;
- private int mPinnedHeadsUpCount;
- private float mTopHeadsUpDragAmount;
- private View mDraggedHeadsUpView;
private int mScrimsVisibility;
private final Consumer<Integer> mScrimVisibleListener;
private boolean mBlankScreen;
@@ -161,11 +156,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
private boolean mKeyguardOccluded;
public ScrimController(LightBarController lightBarController, ScrimView scrimBehind,
- ScrimView scrimInFront, View headsUpScrim, Consumer<Integer> scrimVisibleListener,
+ ScrimView scrimInFront, Consumer<Integer> scrimVisibleListener,
DozeParameters dozeParameters, AlarmManager alarmManager) {
mScrimBehind = scrimBehind;
mScrimInFront = scrimInFront;
- mHeadsUpScrim = headsUpScrim;
mScrimVisibleListener = scrimVisibleListener;
mContext = scrimBehind.getContext();
mUnlockMethodCache = UnlockMethodCache.getInstance(mContext);
@@ -196,7 +190,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
}
mState = ScrimState.UNINITIALIZED;
- updateHeadsUpScrim(false);
updateScrims();
}
@@ -285,10 +278,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
// with too many things at this case, in order to not skip the initial frames.
mScrimInFront.postOnAnimationDelayed(this::scheduleUpdate, 16);
mAnimationDelay = StatusBar.FADE_KEYGUARD_START_DELAY;
- } else if (!mDozeParameters.getAlwaysOn() && oldState == ScrimState.AOD) {
- // Execute first frame immediately when display was completely off.
- // Scheduling a frame isn't enough because the system may aggressively enter doze,
- // delaying callbacks or never triggering them until the power button is pressed.
+ } else if (!mDozeParameters.getAlwaysOn() && oldState == ScrimState.AOD
+ || (mState == ScrimState.AOD && !mDozeParameters.getDisplayNeedsBlanking())) {
+ // Scheduling a frame isn't enough when:
+ // • Leaving doze and we need to modify scrim color immediately
+ // • ColorFade will not kick-in and scrim cannot wait for pre-draw.
onPreDraw();
} else {
scheduleUpdate();
@@ -363,10 +357,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
return;
}
- if (mPinnedHeadsUpCount != 0) {
- updateHeadsUpScrim(false);
- }
-
setOrAdaptCurrentAnimation(mScrimBehind);
setOrAdaptCurrentAnimation(mScrimInFront);
}
@@ -610,8 +600,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
return mCurrentInFrontAlpha;
} else if (scrim == mScrimBehind) {
return mCurrentBehindAlpha;
- } else if (scrim == mHeadsUpScrim) {
- return calculateHeadsUpAlpha();
} else {
throw new IllegalArgumentException("Unknown scrim view");
}
@@ -622,8 +610,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
return mCurrentInFrontTint;
} else if (scrim == mScrimBehind) {
return mCurrentBehindTint;
- } else if (scrim == mHeadsUpScrim) {
- return Color.TRANSPARENT;
} else {
throw new IllegalArgumentException("Unknown scrim view");
}
@@ -670,40 +656,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
mScrimBehind.setDrawAsSrc(asSrc);
}
- @Override
- public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) {
- }
-
- @Override
- public void onHeadsUpPinned(ExpandableNotificationRow headsUp) {
- mPinnedHeadsUpCount++;
- updateHeadsUpScrim(true);
- }
-
- @Override
- public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) {
- mPinnedHeadsUpCount--;
- if (headsUp == mDraggedHeadsUpView) {
- mDraggedHeadsUpView = null;
- mTopHeadsUpDragAmount = 0.0f;
- }
- updateHeadsUpScrim(true);
- }
-
- @Override
- public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {
- }
-
- private void updateHeadsUpScrim(boolean animate) {
- if (animate) {
- mAnimationDuration = ANIMATION_DURATION;
- cancelAnimator((ValueAnimator) mHeadsUpScrim.getTag(TAG_KEY_ANIM));
- startScrimAnimation(mHeadsUpScrim, mHeadsUpScrim.getAlpha());
- } else {
- setOrAdaptCurrentAnimation(mHeadsUpScrim);
- }
- }
-
@VisibleForTesting
void setOnAnimationFinished(Runnable onAnimationFinished) {
mOnAnimationFinished = onAnimationFinished;
@@ -810,33 +762,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
return Handler.getMain();
}
- /**
- * Set the amount the current top heads up view is dragged. The range is from 0 to 1 and 0 means
- * the heads up is in its resting space and 1 means it's fully dragged out.
- *
- * @param draggedHeadsUpView the dragged view
- * @param topHeadsUpDragAmount how far is it dragged
- */
- public void setTopHeadsUpDragAmount(View draggedHeadsUpView, float topHeadsUpDragAmount) {
- mTopHeadsUpDragAmount = topHeadsUpDragAmount;
- mDraggedHeadsUpView = draggedHeadsUpView;
- updateHeadsUpScrim(false);
- }
-
- private float calculateHeadsUpAlpha() {
- float alpha;
- if (mPinnedHeadsUpCount >= 2) {
- alpha = 1.0f;
- } else if (mPinnedHeadsUpCount == 0) {
- alpha = 0.0f;
- } else {
- alpha = 1.0f - mTopHeadsUpDragAmount;
- }
- float expandFactor = (1.0f - mExpansionFraction);
- expandFactor = Math.max(expandFactor, 0.0f);
- return alpha * expandFactor;
- }
-
public void setExcludedBackgroundArea(Rect area) {
mScrimBehind.setExcludedArea(area);
}
@@ -851,13 +776,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
mScrimBehind.setChangeRunnable(changeRunnable);
}
- public void onDensityOrFontScaleChanged() {
- ViewGroup.LayoutParams layoutParams = mHeadsUpScrim.getLayoutParams();
- layoutParams.height = mHeadsUpScrim.getResources().getDimensionPixelSize(
- R.dimen.heads_up_scrim_height);
- mHeadsUpScrim.setLayoutParams(layoutParams);
- }
-
public void setCurrentUser(int currentUser) {
// Don't care in the base class.
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index 55e8714f796f..5b734ebf5d1a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -105,8 +105,7 @@ public enum ScrimState {
@Override
public void prepare(ScrimState previousState) {
final boolean alwaysOnEnabled = mDozeParameters.getAlwaysOn();
- final boolean wasPulsing = previousState == ScrimState.PULSING;
- mBlankScreen = wasPulsing && !mCanControlScreenOff;
+ mBlankScreen = mDisplayRequiresBlanking;
mCurrentBehindAlpha = mWallpaperSupportsAmbientMode
&& !mKeyguardUpdateMonitor.hasLockscreenWallpaper() ? 0f : 1f;
mCurrentInFrontAlpha = alwaysOnEnabled ? mAodFrontScrimAlpha : 1f;
@@ -114,7 +113,7 @@ public enum ScrimState {
mCurrentBehindTint = Color.BLACK;
// DisplayPowerManager will blank the screen for us, we just need
// to set our state.
- mAnimateChange = mCanControlScreenOff;
+ mAnimateChange = !mDisplayRequiresBlanking;
}
@Override
@@ -178,7 +177,6 @@ public enum ScrimState {
ScrimView mScrimBehind;
DozeParameters mDozeParameters;
boolean mDisplayRequiresBlanking;
- boolean mCanControlScreenOff;
boolean mWallpaperSupportsAmbientMode;
KeyguardUpdateMonitor mKeyguardUpdateMonitor;
int mIndex;
@@ -192,7 +190,6 @@ public enum ScrimState {
mScrimBehind = scrimBehind;
mDozeParameters = dozeParameters;
mDisplayRequiresBlanking = dozeParameters.getDisplayNeedsBlanking();
- mCanControlScreenOff = dozeParameters.getCanControlScreenOffAnimation();
mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(scrimInFront.getContext());
}
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 7422a4343cb4..e6a9b468f417 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -95,6 +95,7 @@ import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
+import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
@@ -189,6 +190,7 @@ import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.GestureRecorder;
+import com.android.systemui.statusbar.HeadsUpStatusBarView;
import com.android.systemui.statusbar.KeyboardShortcuts;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationData;
@@ -208,6 +210,7 @@ import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.SignalClusterView;
import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.notification.AboveShelfObserver;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
@@ -602,6 +605,9 @@ public class StatusBar extends SystemUI implements DemoMode,
private NavigationBarFragment mNavigationBar;
private View mNavigationBarView;
protected ActivityLaunchAnimator mActivityLaunchAnimator;
+ private HeadsUpAppearanceController mHeadsUpAppearanceController;
+ private boolean mVibrateOnOpening;
+ private VibratorHelper mVibratorHelper;
@Override
public void start() {
@@ -639,6 +645,9 @@ public class StatusBar extends SystemUI implements DemoMode,
updateDisplaySize();
Resources res = mContext.getResources();
+ mVibrateOnOpening = mContext.getResources().getBoolean(
+ R.bool.config_vibrateOnIconAnimation);
+ mVibratorHelper = Dependency.get(VibratorHelper.class);
mScrimSrcModeEnabled = res.getBoolean(R.bool.config_status_bar_scrim_behind_use_src);
mClearAllEnabled = res.getBoolean(R.bool.config_enableNotificationsClearAll);
@@ -807,6 +816,12 @@ public class StatusBar extends SystemUI implements DemoMode,
mStatusBarView.setPanel(mNotificationPanel);
mStatusBarView.setScrimController(mScrimController);
mStatusBarView.setBouncerShowing(mBouncerShowing);
+ if (mHeadsUpAppearanceController != null) {
+ // This view is being recreated, let's destroy the old one
+ mHeadsUpAppearanceController.destroy();
+ }
+ mHeadsUpAppearanceController = new HeadsUpAppearanceController(
+ mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow);
setAreThereNotifications();
checkBarModes();
}).getFragmentManager()
@@ -899,14 +914,14 @@ public class StatusBar extends SystemUI implements DemoMode,
ScrimView scrimBehind = mStatusBarWindow.findViewById(R.id.scrim_behind);
ScrimView scrimInFront = mStatusBarWindow.findViewById(R.id.scrim_in_front);
- View headsUpScrim = mStatusBarWindow.findViewById(R.id.heads_up_scrim);
mScrimController = SystemUIFactory.getInstance().createScrimController(mLightBarController,
- scrimBehind, scrimInFront, headsUpScrim, mLockscreenWallpaper,
+ scrimBehind, scrimInFront, mLockscreenWallpaper,
scrimsVisible -> {
if (mStatusBarWindowManager != null) {
mStatusBarWindowManager.setScrimsVisibility(scrimsVisible);
}
- }, new DozeParameters(mContext), mContext.getSystemService(AlarmManager.class));
+ }, DozeParameters.getInstance(mContext),
+ mContext.getSystemService(AlarmManager.class));
if (mScrimSrcModeEnabled) {
Runnable runnable = () -> {
boolean asSrc = mBackdrop.getVisibility() != View.VISIBLE;
@@ -916,9 +931,9 @@ public class StatusBar extends SystemUI implements DemoMode,
mBackdrop.setOnVisibilityChangedRunnable(runnable);
runnable.run();
}
- mHeadsUpManager.addListener(mScrimController);
mStackScroller.setScrimController(mScrimController);
- mDozeScrimController = new DozeScrimController(mScrimController, context);
+ mDozeScrimController = new DozeScrimController(mScrimController, context,
+ DozeParameters.getInstance(context));
// Other icons
mVolumeComponent = getComponent(VolumeComponent.class);
@@ -1073,7 +1088,6 @@ public class StatusBar extends SystemUI implements DemoMode,
mReinflateNotificationsOnUserSwitched = true;
}
// end old BaseStatusBar.onDensityOrFontScaleChanged().
- mScrimController.onDensityOrFontScaleChanged();
// TODO: Remove this.
if (mBrightnessMirrorController != null) {
mBrightnessMirrorController.onDensityOrFontScaleChanged();
@@ -1087,6 +1101,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mKeyguardUserSwitcher.onDensityOrFontScaleChanged();
}
mNotificationIconAreaController.onDensityOrFontScaleChanged(mContext);
+ mHeadsUpManager.onDensityOrFontScaleChanged();
reevaluateStyles();
}
@@ -1384,8 +1399,7 @@ public class StatusBar extends SystemUI implements DemoMode,
updateQsExpansionEnabled();
// Let's also update the icons
- mNotificationIconAreaController.updateNotificationIcons(
- mEntryManager.getNotificationData());
+ mNotificationIconAreaController.updateNotificationIcons();
}
@Override
@@ -1867,7 +1881,7 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public boolean isDozing() {
- return mDozing;
+ return mDozing && mStackScroller.isFullyDark();
}
@Override
@@ -1991,7 +2005,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mVisualStabilityManager.setPanelExpanded(isExpanded);
if (isExpanded && getBarState() != StatusBarState.KEYGUARD) {
if (DEBUG) {
- Log.v(TAG, "clearing notification effects from setPanelExpanded");
+ Log.v(TAG, "clearing notification effects from setExpandedHeight");
}
clearNotificationEffects();
}
@@ -2150,6 +2164,9 @@ public class StatusBar extends SystemUI implements DemoMode,
} else if (KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN == key) {
mMetricsLogger.action(MetricsEvent.ACTION_SYSTEM_NAVIGATION_KEY_DOWN);
if (mNotificationPanel.isFullyCollapsed()) {
+ if (mVibrateOnOpening) {
+ mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK);
+ }
mNotificationPanel.expand(true /* animate */);
mMetricsLogger.count(NotificationPanelView.COUNTER_PANEL_OPEN, 1);
} else if (!mNotificationPanel.isInSettings() && !mNotificationPanel.isExpanding()){
@@ -2813,7 +2830,7 @@ public class StatusBar extends SystemUI implements DemoMode,
public void setRemoteInputActive(NotificationData.Entry entry,
boolean remoteInputActive) {
mHeadsUpManager.setRemoteInputActive(entry, remoteInputActive);
- entry.row.updateMaxHeights();
+ entry.row.notifyHeightChanged(true /* needsAnimation */);
}
public void lockScrollTo(NotificationData.Entry entry) {
mStackScroller.lockScrollTo(entry.row);
@@ -3817,13 +3834,16 @@ public class StatusBar extends SystemUI implements DemoMode,
private void updateDozingState() {
Trace.traceCounter(Trace.TRACE_TAG_APP, "dozing", mDozing ? 1 : 0);
Trace.beginSection("StatusBar#updateDozingState");
+
+ boolean sleepingFromKeyguard =
+ mStatusBarKeyguardViewManager.isGoingToSleepVisibleNotOccluded();
boolean animate = (!mDozing && mDozeServiceHost.shouldAnimateWakeup())
- || (mDozing && mDozeServiceHost.shouldAnimateScreenOff());
- mNotificationPanel.setDozing(mDozing, animate);
+ || (mDozing && mDozeServiceHost.shouldAnimateScreenOff() && sleepingFromKeyguard);
+
mStackScroller.setDark(mDozing, animate, mWakeUpTouchLocation);
mDozeScrimController.setDozing(mDozing);
mKeyguardIndicationController.setDozing(mDozing);
- mNotificationPanel.setDark(mDozing, animate);
+ mNotificationPanel.setDozing(mDozing, animate);
updateQsExpansionEnabled();
mViewHierarchyManager.updateRowStates();
Trace.endSection();
@@ -3833,6 +3853,9 @@ public class StatusBar extends SystemUI implements DemoMode,
if (mStackScroller == null) return;
boolean onKeyguard = mState == StatusBarState.KEYGUARD;
boolean publicMode = mLockscreenUserManager.isAnyProfilePublicMode();
+ if (mHeadsUpAppearanceController != null) {
+ mHeadsUpAppearanceController.setPublicMode(publicMode);
+ }
mStackScroller.setHideSensitive(publicMode, goingToFullShade);
mStackScroller.setDimmed(onKeyguard, fromShadeLocked /* animate */);
mStackScroller.setExpandingEnabled(!onKeyguard);
@@ -4739,6 +4762,7 @@ public class StatusBar extends SystemUI implements DemoMode,
if (mDozingRequested) {
mDozingRequested = false;
DozeLog.traceDozing(mContext, mDozing);
+ mWakefulnessLifecycle.dispatchStartedWakingUp();
updateDozing();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index b26b7c950695..56a7b1ba37d1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -95,6 +95,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
protected boolean mLastRemoteInputActive;
private boolean mLastDozing;
private int mLastFpMode;
+ private boolean mGoingToSleepVisibleNotOccluded;
private OnDismissAction mAfterKeyguardGoneAction;
private final ArrayList<Runnable> mAfterKeyguardGoneRunnables = new ArrayList<>();
@@ -149,8 +150,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mBouncer.setExpansion(expansion);
if (expansion == 1) {
mBouncer.onFullyHidden();
- updateStates();
- } else if (!mBouncer.isShowing()) {
+ } else if (!mBouncer.isShowing() && !mBouncer.isAnimatingAway()) {
mBouncer.show(true /* resetSecuritySelection */, false /* notifyFalsing */);
} else if (noLongerTracking) {
// Notify that falsing manager should stop its session when user stops touching,
@@ -158,6 +158,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
// data.
mBouncer.onFullyShown();
}
+ if (expansion == 0 || expansion == 1) {
+ updateStates();
+ }
}
mLastTracking = tracking;
}
@@ -262,11 +265,16 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
}
+ public boolean isGoingToSleepVisibleNotOccluded() {
+ return mGoingToSleepVisibleNotOccluded;
+ }
+
public void onStartedGoingToSleep() {
- // TODO: remove
+ mGoingToSleepVisibleNotOccluded = isShowing() && !isOccluded();
}
public void onFinishedGoingToSleep() {
+ mGoingToSleepVisibleNotOccluded = false;
mBouncer.onScreenTurnedOff();
}
@@ -371,6 +379,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
public void startPreHideAnimation(Runnable finishRunnable) {
if (mBouncer.isShowing()) {
mBouncer.startPreHideAnimation(finishRunnable);
+ mNotificationPanelView.onBouncerPreHideAnimation();
} else if (finishRunnable != null) {
finishRunnable.run();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
index defb46ce27b2..309a1a7abe4d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
@@ -73,7 +73,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mActivityManager = ActivityManager.getService();
mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation();
- mDozeParameters = new DozeParameters(mContext);
+ mDozeParameters = DozeParameters.getInstance(mContext);
mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze();
}
@@ -141,11 +141,9 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D
mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
}
- final boolean showWallpaperOnAod = mDozeParameters.getAlwaysOn() &&
- state.wallpaperSupportsAmbientMode &&
- state.scrimsVisibility != ScrimController.VISIBILITY_FULLY_OPAQUE;
- if (state.keyguardShowing && !state.backdropShowing &&
- (!state.dozing || showWallpaperOnAod)) {
+ final boolean scrimsOccludingWallpaper =
+ state.scrimsVisibility == ScrimController.VISIBILITY_FULLY_OPAQUE;
+ if (state.keyguardShowing && !state.backdropShowing && !scrimsOccludingWallpaper) {
mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
} else {
mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
index 49f880ce3320..7221efab0bb2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
@@ -28,6 +28,7 @@ import android.os.PowerSaveState;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.settingslib.fuelgauge.BatterySaverUtils;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -93,7 +94,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
@Override
public void setPowerSaveMode(boolean powerSave) {
- mPowerManager.setPowerSaveMode(powerSave);
+ BatterySaverUtils.setPowerSaveMode(mContext, powerSave, /*needFirstTimeWarning*/ true);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
index 040d7ec32ecc..aeda55a8bf8d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
@@ -443,6 +443,9 @@ public class HeadsUpManager {
entry.reset();
}
+ public void onDensityOrFontScaleChanged() {
+ }
+
/**
* This represents a notification and how long it is in a heads up mode. It also manages its
* lifecycle automatically when created.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
index b22ce1822acd..0adb4392a174 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
@@ -64,6 +64,7 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
+ .setUids(null)
.build();
private static final int NO_NETWORK = -1;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
index 0f637fb5a40a..7c1c566a57bf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
@@ -70,6 +70,8 @@ public class AmbientState {
private int mIntrinsicPadding;
private int mExpandAnimationTopChange;
private ExpandableNotificationRow mExpandingNotification;
+ private boolean mFullyDark;
+ private int mDarkTopPadding;
public AmbientState(Context context) {
reload(context);
@@ -409,4 +411,26 @@ public class AmbientState {
public int getExpandAnimationTopChange() {
return mExpandAnimationTopChange;
}
+
+ /**
+ * {@see isFullyDark}
+ */
+ public void setFullyDark(boolean fullyDark) {
+ mFullyDark = fullyDark;
+ }
+
+ /**
+ * @return {@code true } when shade is completely dark: in AOD or ambient display.
+ */
+ public boolean isFullyDark() {
+ return mFullyDark;
+ }
+
+ public void setDarkTopPadding(int darkTopPadding) {
+ mDarkTopPadding = darkTopPadding;
+ }
+
+ public int getDarkTopPadding() {
+ return mDarkTopPadding;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
index 53377d955722..c26568ea00b3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
@@ -21,12 +21,12 @@ import android.util.Property;
import android.view.View;
import java.util.ArrayList;
-import java.util.Set;
/**
* Filters the animations for only a certain type of properties.
*/
public class AnimationFilter {
+ public static final int NO_DELAY = -1;
boolean animateAlpha;
boolean animateX;
boolean animateY;
@@ -40,7 +40,7 @@ public class AnimationFilter {
public boolean animateShadowAlpha;
boolean hasDelays;
boolean hasGoToFullShadeEvent;
- boolean hasHeadsUpDisappearClickEvent;
+ long customDelay;
private ArraySet<Property> mAnimatedProperties = new ArraySet<>();
public AnimationFilter animateAlpha() {
@@ -129,8 +129,14 @@ public class AnimationFilter {
hasGoToFullShadeEvent = true;
}
if (ev.animationType == NotificationStackScrollLayout.AnimationEvent
+ .ANIMATION_TYPE_HEADS_UP_DISAPPEAR) {
+ customDelay = StackStateAnimator.ANIMATION_DELAY_HEADS_UP;
+ } else if (ev.animationType == NotificationStackScrollLayout.AnimationEvent
.ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK) {
- hasHeadsUpDisappearClickEvent = true;
+ // We need both timeouts when clicking, one to delay it and one for the animation
+ // to look nice
+ customDelay = StackStateAnimator.ANIMATION_DELAY_HEADS_UP_CLICKED
+ + StackStateAnimator.ANIMATION_DELAY_HEADS_UP;
}
}
}
@@ -165,7 +171,7 @@ public class AnimationFilter {
animateHideSensitive = false;
hasDelays = false;
hasGoToFullShadeEvent = false;
- hasHeadsUpDisappearClickEvent = false;
+ customDelay = NO_DELAY;
mAnimatedProperties.clear();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ExpandableViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ExpandableViewState.java
index 3bf7d892ea0e..a7925aa003e0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ExpandableViewState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ExpandableViewState.java
@@ -233,7 +233,8 @@ public class ExpandableViewState extends ViewState {
expandableView.setDark(this.dark, animationFilter.animateDark, properties.delay);
if (properties.wasAdded(child) && !hidden) {
- expandableView.performAddAnimation(properties.delay, properties.duration);
+ expandableView.performAddAnimation(properties.delay, properties.duration,
+ false /* isHeadsUpAppear */);
}
if (!expandableView.isInShelf() && this.inShelf) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/HeadsUpAppearInterpolator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/HeadsUpAppearInterpolator.java
index 05c0099359ab..59ce0ca3b3cb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/HeadsUpAppearInterpolator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/HeadsUpAppearInterpolator.java
@@ -23,6 +23,11 @@ import android.view.animation.PathInterpolator;
* An interpolator specifically designed for the appear animation of heads up notifications.
*/
public class HeadsUpAppearInterpolator extends PathInterpolator {
+
+ private static float X1 = 250f;
+ private static float X2 = 200f;
+ private static float XTOT = (X1 + X2);;
+
public HeadsUpAppearInterpolator() {
super(getAppearPath());
}
@@ -30,22 +35,18 @@ public class HeadsUpAppearInterpolator extends PathInterpolator {
private static Path getAppearPath() {
Path path = new Path();
path.moveTo(0, 0);
- float x1 = 250f;
- float x2 = 150f;
- float x3 = 100f;
float y1 = 90f;
- float y2 = 78f;
- float y3 = 80f;
- float xTot = (x1 + x2 + x3);
- path.cubicTo(x1 * 0.9f / xTot, 0f,
- x1 * 0.8f / xTot, y1 / y3,
- x1 / xTot , y1 / y3);
- path.cubicTo((x1 + x2 * 0.4f) / xTot, y1 / y3,
- (x1 + x2 * 0.2f) / xTot, y2 / y3,
- (x1 + x2) / xTot, y2 / y3);
- path.cubicTo((x1 + x2 + x3 * 0.4f) / xTot, y2 / y3,
- (x1 + x2 + x3 * 0.2f) / xTot, 1f,
- 1f, 1f);
+ float y2 = 80f;
+ path.cubicTo(X1 * 0.8f / XTOT, y1 / y2,
+ X1 * 0.8f / XTOT, y1 / y2,
+ X1 / XTOT, y1 / y2);
+ path.cubicTo((X1 + X2 * 0.4f) / XTOT, y1 / y2,
+ (X1 + X2 * 0.2f) / XTOT, 1.0f,
+ 1.0f , 1.0f);
return path;
}
+
+ public static float getFractionUntilOvershoot() {
+ return X1 / XTOT;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
index ac2a1e1e041f..e5ab712e9bdd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
@@ -102,6 +102,9 @@ public class NotificationChildrenContainer extends ViewGroup {
private boolean mShowDividersWhenExpanded;
private boolean mHideDividersDuringExpand;
+ private int mTranslationForHeader;
+ private int mCurrentHeaderTranslation = 0;
+ private float mHeaderVisibleAmount = 1.0f;
public NotificationChildrenContainer(Context context) {
this(context, null);
@@ -142,6 +145,9 @@ public class NotificationChildrenContainer extends ViewGroup {
res.getBoolean(R.bool.config_showDividersWhenGroupNotificationExpanded);
mHideDividersDuringExpand =
res.getBoolean(R.bool.config_hideDividersDuringExpand);
+ mTranslationForHeader = res.getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_content_margin)
+ - mNotificationHeaderMargin;
}
@Override
@@ -486,7 +492,7 @@ public class NotificationChildrenContainer extends ViewGroup {
if (showingAsLowPriority()) {
return mNotificationHeaderLowPriority.getHeight();
}
- int intrinsicHeight = mNotificationHeaderMargin;
+ int intrinsicHeight = mNotificationHeaderMargin + mCurrentHeaderTranslation;
int visibleChildren = 0;
int childCount = mChildren.size();
boolean firstChild = true;
@@ -541,7 +547,7 @@ public class NotificationChildrenContainer extends ViewGroup {
public void getState(StackScrollState resultState, ExpandableViewState parentState,
AmbientState ambientState) {
int childCount = mChildren.size();
- int yPosition = mNotificationHeaderMargin;
+ int yPosition = mNotificationHeaderMargin + mCurrentHeaderTranslation;
boolean firstChild = true;
int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren();
int lastVisibleIndex = maxAllowedVisibleChildren - 1;
@@ -645,6 +651,11 @@ public class NotificationChildrenContainer extends ViewGroup {
mHeaderViewState.zTranslation = childrenExpandedAndNotAnimating
? parentState.zTranslation
: 0;
+ mHeaderViewState.yTranslation = mCurrentHeaderTranslation;
+ mHeaderViewState.alpha = mHeaderVisibleAmount;
+ // The hiding is done automatically by the alpha, otherwise we'll pick it up again
+ // in the next frame with the initFrom call above and have an invisible header
+ mHeaderViewState.hidden = false;
}
}
@@ -1009,7 +1020,8 @@ public class NotificationChildrenContainer extends ViewGroup {
return getMinHeight(NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED, true
/* likeHighPriority */);
}
- int maxContentHeight = mNotificationHeaderMargin + mNotificatonTopPadding;
+ int maxContentHeight = mNotificationHeaderMargin + mCurrentHeaderTranslation
+ + mNotificatonTopPadding;
int visibleChildren = 0;
int childCount = mChildren.size();
for (int i = 0; i < childCount; i++) {
@@ -1071,7 +1083,8 @@ public class NotificationChildrenContainer extends ViewGroup {
}
private int getVisibleChildrenExpandHeight() {
- int intrinsicHeight = mNotificationHeaderMargin + mNotificatonTopPadding + mDividerHeight;
+ int intrinsicHeight = mNotificationHeaderMargin + mCurrentHeaderTranslation
+ + mNotificatonTopPadding + mDividerHeight;
int visibleChildren = 0;
int childCount = mChildren.size();
int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren(true /* forceCollapsed */);
@@ -1110,7 +1123,7 @@ public class NotificationChildrenContainer extends ViewGroup {
if (!likeHighPriority && showingAsLowPriority()) {
return mNotificationHeaderLowPriority.getHeight();
}
- int minExpandHeight = mNotificationHeaderMargin;
+ int minExpandHeight = mNotificationHeaderMargin + mCurrentHeaderTranslation;
int visibleChildren = 0;
boolean firstChild = true;
int childCount = mChildren.size();
@@ -1190,7 +1203,8 @@ public class NotificationChildrenContainer extends ViewGroup {
}
public int getPositionInLinearLayout(View childInGroup) {
- int position = mNotificationHeaderMargin + mNotificatonTopPadding;
+ int position = mNotificationHeaderMargin + mCurrentHeaderTranslation
+ + mNotificatonTopPadding;
for (int i = 0; i < mChildren.size(); i++) {
ExpandableNotificationRow child = mChildren.get(i);
@@ -1281,4 +1295,9 @@ public class NotificationChildrenContainer extends ViewGroup {
last = false;
}
}
+
+ public void setHeaderVisibleAmount(float headerVisibleAmount) {
+ mHeaderVisibleAmount = headerVisibleAmount;
+ mCurrentHeaderTranslation = (int) ((1.0f - headerVisibleAmount) * mTranslationForHeader);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationRoundnessManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationRoundnessManager.java
new file mode 100644
index 000000000000..f98b3d92a113
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationRoundnessManager.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.stack;
+
+import android.view.View;
+
+import com.android.systemui.statusbar.ActivatableNotificationView;
+import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
+
+import java.util.HashSet;
+
+/**
+ * A class that manages the roundness for notification views
+ */
+class NotificationRoundnessManager implements OnHeadsUpChangedListener {
+
+ private boolean mExpanded;
+ private ActivatableNotificationView mFirst;
+ private ActivatableNotificationView mLast;
+ private HashSet<View> mAnimatedChildren;
+ private Runnable mRoundingChangedCallback;
+ private ExpandableNotificationRow mTrackedHeadsUp;
+ private float mAppearFraction;
+
+ @Override
+ public void onHeadsUpPinned(ExpandableNotificationRow headsUp) {
+ updateRounding(headsUp, false /* animate */);
+ }
+
+ @Override
+ public void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) {
+ updateRounding(headsUp, true /* animate */);
+ }
+
+ public void onHeadsupAnimatingAwayChanged(ExpandableNotificationRow row,
+ boolean isAnimatingAway) {
+ updateRounding(row, false /* animate */);
+ }
+
+ private void updateRounding(ActivatableNotificationView view, boolean animate) {
+ float topRoundness = getRoundness(view, true /* top */);
+ float bottomRoundness = getRoundness(view, false /* top */);
+ boolean firstChanged = view.setTopRoundness(topRoundness, animate);
+ boolean secondChanged = view.setBottomRoundness(bottomRoundness, animate);
+ if ((view == mFirst || view == mLast) && (firstChanged || secondChanged)) {
+ mRoundingChangedCallback.run();
+ }
+ }
+
+ private float getRoundness(ActivatableNotificationView view, boolean top) {
+ if ((view.isPinned() || view.isHeadsUpAnimatingAway()) && !mExpanded) {
+ return 1.0f;
+ }
+ if (view == mFirst && top) {
+ return 1.0f;
+ }
+ if (view == mLast && !top) {
+ return 1.0f;
+ }
+ if (view == mTrackedHeadsUp && mAppearFraction <= 0.0f) {
+ // If we're pushing up on a headsup the appear fraction is < 0 and it needs to still be
+ // rounded.
+ return 1.0f;
+ }
+ return 0.0f;
+ }
+
+ public void setExpanded(float expandedHeight, float appearFraction) {
+ mExpanded = expandedHeight != 0.0f;
+ mAppearFraction = appearFraction;
+ if (mTrackedHeadsUp != null) {
+ updateRounding(mTrackedHeadsUp, true);
+ }
+ }
+
+ public void setFirstAndLastBackgroundChild(ActivatableNotificationView first,
+ ActivatableNotificationView last) {
+ boolean firstChanged = mFirst != first;
+ boolean lastChanged = mLast != last;
+ if (!firstChanged && !lastChanged) {
+ return;
+ }
+ ActivatableNotificationView oldFirst = mFirst;
+ ActivatableNotificationView oldLast = mLast;
+ mFirst = first;
+ mLast = last;
+ if (firstChanged && oldFirst != null && !oldFirst.isRemoved()) {
+ updateRounding(oldFirst, oldFirst.isShown());
+ }
+ if (lastChanged && oldLast != null && !oldLast.isRemoved()) {
+ updateRounding(oldLast, oldLast.isShown());
+ }
+ if (mFirst != null) {
+ updateRounding(mFirst, mFirst.isShown() && !mAnimatedChildren.contains(mFirst));
+ }
+ if (mLast != null) {
+ updateRounding(mLast, mLast.isShown() && !mAnimatedChildren.contains(mLast));
+ }
+ mRoundingChangedCallback.run();
+ }
+
+ public void setAnimatedChildren(HashSet<View> animatedChildren) {
+ mAnimatedChildren = animatedChildren;
+ }
+
+ public void setOnRoundingChangedCallback(Runnable roundingChangedCallback) {
+ mRoundingChangedCallback = roundingChangedCallback;
+ }
+
+ public void setTrackingHeadsUp(ExpandableNotificationRow row) {
+ mTrackedHeadsUp = row;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index a85f4e2b53a5..dc9420314371 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -94,8 +94,8 @@ import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.ScrimController;
+import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.HeadsUpUtil;
import com.android.systemui.statusbar.policy.ScrollAdapter;
@@ -108,6 +108,8 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
/**
* A layout which handles a dynamic amount of notifications and presents them in a scrollable stack.
@@ -289,6 +291,7 @@ public class NotificationStackScrollLayout extends ViewGroup
private HashSet<Pair<ExpandableNotificationRow, Boolean>> mHeadsUpChangeAnimations
= new HashSet<>();
private HeadsUpManagerPhone mHeadsUpManager;
+ private NotificationRoundnessManager mRoundnessManager = new NotificationRoundnessManager();
private boolean mTrackingHeadsUp;
private ScrimController mScrimController;
private boolean mForceNoOverlappingRendering;
@@ -400,9 +403,11 @@ public class NotificationStackScrollLayout extends ViewGroup
private int mSidePaddings;
private final int mSeparatorWidth;
private final int mSeparatorThickness;
- private final Rect mTmpRect = new Rect();
+ private final Rect mBackgroundAnimationRect = new Rect();
private int mClockBottom;
private int mAntiBurnInOffsetX;
+ private ArrayList<BiConsumer<Float, Float>> mExpandedHeightListeners = new ArrayList<>();
+ private int mHeadsUpInset;
public NotificationStackScrollLayout(Context context) {
this(context, null);
@@ -440,6 +445,9 @@ public class NotificationStackScrollLayout extends ViewGroup
mSeparatorWidth = res.getDimensionPixelSize(R.dimen.widget_separator_width);
mSeparatorThickness = res.getDimensionPixelSize(R.dimen.widget_separator_thickness);
mDarkSeparatorPadding = res.getDimensionPixelSize(R.dimen.widget_bottom_separator_padding);
+ mRoundnessManager.setAnimatedChildren(mChildrenToAddAnimated);
+ mRoundnessManager.setOnRoundingChangedCallback(this::invalidate);
+ addOnExpandedHeightListener(mRoundnessManager::setExpanded);
updateWillNotDraw();
mBackgroundPaint.setAntiAlias(true);
@@ -515,26 +523,29 @@ public class NotificationStackScrollLayout extends ViewGroup
final int darkBottom = darkTop + mSeparatorThickness;
if (mAmbientState.hasPulsingNotifications()) {
- // TODO draw divider between notification and shelf
- } else if (mAmbientState.isDark()) {
+ // No divider, we have a notification icon instead
+ } else if (mAmbientState.isFullyDark()) {
// Only draw divider on AOD if we actually have notifications
if (mFirstVisibleBackgroundChild != null) {
canvas.drawRect(darkLeft, darkTop, darkRight, darkBottom, mBackgroundPaint);
}
- setClipBounds(null);
} else {
float animProgress = Interpolators.FAST_OUT_SLOW_IN
.getInterpolation(1f - mDarkAmount);
float sidePaddingsProgress = Interpolators.FAST_OUT_SLOW_IN
.getInterpolation((1f - mDarkAmount) * 2);
- mTmpRect.set((int) MathUtils.lerp(darkLeft, lockScreenLeft, sidePaddingsProgress),
+ mBackgroundAnimationRect.set(
+ (int) MathUtils.lerp(darkLeft, lockScreenLeft, sidePaddingsProgress),
(int) MathUtils.lerp(darkTop, lockScreenTop, animProgress),
(int) MathUtils.lerp(darkRight, lockScreenRight, sidePaddingsProgress),
(int) MathUtils.lerp(darkBottom, lockScreenBottom, animProgress));
- canvas.drawRoundRect(mTmpRect.left, mTmpRect.top, mTmpRect.right, mTmpRect.bottom,
- mCornerRadius, mCornerRadius, mBackgroundPaint);
- setClipBounds(animProgress == 1 ? null : mTmpRect);
+ if (!mAmbientState.isDark() || mFirstVisibleBackgroundChild != null) {
+ canvas.drawRoundRect(mBackgroundAnimationRect.left, mBackgroundAnimationRect.top,
+ mBackgroundAnimationRect.right, mBackgroundAnimationRect.bottom,
+ mCornerRadius, mCornerRadius, mBackgroundPaint);
+ }
}
+ updateClipping();
}
private void updateBackgroundDimming() {
@@ -582,13 +593,15 @@ public class NotificationStackScrollLayout extends ViewGroup
res.getDimensionPixelSize(R.dimen.notification_divider_height_increased);
mMinTopOverScrollToEscape = res.getDimensionPixelSize(
R.dimen.min_top_overscroll_to_qs);
- mStatusBarHeight = res.getDimensionPixelOffset(R.dimen.status_bar_height);
+ mStatusBarHeight = res.getDimensionPixelSize(R.dimen.status_bar_height);
mBottomMargin = res.getDimensionPixelSize(R.dimen.notification_panel_margin_bottom);
mSidePaddings = res.getDimensionPixelSize(R.dimen.notification_side_paddings);
mMinInteractionHeight = res.getDimensionPixelSize(
R.dimen.notification_min_interaction_height);
mCornerRadius = res.getDimensionPixelSize(
Utils.getThemeAttr(mContext, android.R.attr.dialogCornerRadius));
+ mHeadsUpInset = mStatusBarHeight + res.getDimensionPixelSize(
+ R.dimen.heads_up_status_bar_padding);
}
public void setDrawBackgroundAsSrc(boolean asSrc) {
@@ -693,7 +706,7 @@ public class NotificationStackScrollLayout extends ViewGroup
if (mPulsing) {
mTopPadding = mClockBottom;
} else {
- mTopPadding = mAmbientState.isDark() ? mDarkTopPadding : mRegularTopPadding;
+ mTopPadding = (int) MathUtils.lerp(mRegularTopPadding, mDarkTopPadding, mDarkAmount);
}
mAmbientState.setLayoutHeight(getLayoutHeight());
updateAlgorithmLayoutMinHeight();
@@ -701,7 +714,8 @@ public class NotificationStackScrollLayout extends ViewGroup
}
private void updateAlgorithmLayoutMinHeight() {
- mAmbientState.setLayoutMinHeight(mQsExpanded && !onKeyguard() ? getLayoutMinHeight() : 0);
+ mAmbientState.setLayoutMinHeight(mQsExpanded && !onKeyguard() || isHeadsUpTransition()
+ ? getLayoutMinHeight() : 0);
}
/**
@@ -820,6 +834,7 @@ public class NotificationStackScrollLayout extends ViewGroup
if (mRegularTopPadding != topPadding) {
mRegularTopPadding = topPadding;
mDarkTopPadding = topPadding + mDarkSeparatorPadding;
+ mAmbientState.setDarkTopPadding(mDarkTopPadding);
updateAlgorithmHeightAndPadding();
updateContentHeight();
if (animate && mAnimationsEnabled && mIsExpanded) {
@@ -854,11 +869,12 @@ public class NotificationStackScrollLayout extends ViewGroup
float translationY;
float appearEndPosition = getAppearEndPosition();
float appearStartPosition = getAppearStartPosition();
+ float appearFraction = 1.0f;
if (height >= appearEndPosition) {
translationY = 0;
stackHeight = (int) height;
} else {
- float appearFraction = getAppearFraction(height);
+ appearFraction = getAppearFraction(height);
if (appearFraction >= 0) {
translationY = NotificationUtils.interpolate(getExpandTranslationStart(), 0,
appearFraction);
@@ -867,7 +883,12 @@ public class NotificationStackScrollLayout extends ViewGroup
// start
translationY = height - appearStartPosition + getExpandTranslationStart();
}
- stackHeight = (int) (height - translationY);
+ if (isHeadsUpTransition()) {
+ stackHeight = mFirstVisibleBackgroundChild.getPinnedHeadsUpHeight();
+ translationY = MathUtils.lerp(mHeadsUpInset - mTopPadding, 0, appearFraction);
+ } else {
+ stackHeight = (int) (height - translationY);
+ }
}
if (stackHeight != mCurrentStackHeight) {
mCurrentStackHeight = stackHeight;
@@ -875,6 +896,10 @@ public class NotificationStackScrollLayout extends ViewGroup
requestChildrenUpdate();
}
setStackTranslation(translationY);
+ for (int i = 0; i < mExpandedHeightListeners.size(); i++) {
+ BiConsumer<Float, Float> listener = mExpandedHeightListeners.get(i);
+ listener.accept(mExpandedHeight, appearFraction);
+ }
}
private void setRequestedClipBounds(Rect clipRect) {
@@ -883,13 +908,17 @@ public class NotificationStackScrollLayout extends ViewGroup
}
public void updateClipping() {
+ boolean animatingClipping = mDarkAmount > 0 && mDarkAmount < 1;
boolean clipped = mRequestedClipBounds != null && !mInHeadsUpPinnedMode
&& !mHeadsUpAnimatingAway;
if (mIsClipped != clipped) {
mIsClipped = clipped;
updateFadingState();
}
- if (clipped) {
+
+ if (animatingClipping) {
+ setClipBounds(mBackgroundAnimationRect);
+ } else if (clipped) {
setClipBounds(mRequestedClipBounds);
} else {
setClipBounds(null);
@@ -909,12 +938,8 @@ public class NotificationStackScrollLayout extends ViewGroup
* Measured in absolute height.
*/
private float getAppearStartPosition() {
- if (mTrackingHeadsUp && mFirstVisibleBackgroundChild != null) {
- if (mAmbientState.isAboveShelf(mFirstVisibleBackgroundChild)) {
- // If we ever expanded beyond the first notification, it's allowed to merge into
- // the shelf
- return mFirstVisibleBackgroundChild.getPinnedHeadsUpHeight();
- }
+ if (isHeadsUpTransition()) {
+ return mHeadsUpInset + mFirstVisibleBackgroundChild.getPinnedHeadsUpHeight();
}
return getMinExpansionHeight();
}
@@ -948,17 +973,14 @@ public class NotificationStackScrollLayout extends ViewGroup
int appearPosition;
int notGoneChildCount = getNotGoneChildCount();
if (mEmptyShadeView.getVisibility() == GONE && notGoneChildCount != 0) {
- int minNotificationsForShelf = 1;
- if (mTrackingHeadsUp
+ if (isHeadsUpTransition()
|| (mHeadsUpManager.hasPinnedHeadsUp() && !mAmbientState.isDark())) {
appearPosition = getTopHeadsUpPinnedHeight();
- minNotificationsForShelf = 2;
} else {
appearPosition = 0;
- }
- if (notGoneChildCount >= minNotificationsForShelf
- && mShelf.getVisibility() != GONE) {
- appearPosition += mShelf.getIntrinsicHeight();
+ if (notGoneChildCount >= 1 && mShelf.getVisibility() != GONE) {
+ appearPosition += mShelf.getIntrinsicHeight();
+ }
}
} else {
appearPosition = mEmptyShadeView.getHeight();
@@ -966,6 +988,11 @@ public class NotificationStackScrollLayout extends ViewGroup
return appearPosition + (onKeyguard() ? mTopPadding : mIntrinsicPadding);
}
+ private boolean isHeadsUpTransition() {
+ return mTrackingHeadsUp && mFirstVisibleBackgroundChild != null
+ && mAmbientState.isAboveShelf(mFirstVisibleBackgroundChild);
+ }
+
/**
* @param height the height of the panel
* @return the fraction of the appear animation that has been performed
@@ -1076,10 +1103,6 @@ public class NotificationStackScrollLayout extends ViewGroup
@Override
public boolean updateSwipeProgress(View animView, boolean dismissable, float swipeProgress) {
- if (!mIsExpanded && isPinnedHeadsUp(animView) && canChildBeDismissed(animView)) {
- mScrimController.setTopHeadsUpDragAmount(animView,
- Math.min(Math.abs(swipeProgress / 2f - 1.0f), 1.0f));
- }
// Returning true prevents alpha fading.
return !mFadeNotificationsOnDismiss;
}
@@ -2075,7 +2098,7 @@ public class NotificationStackScrollLayout extends ViewGroup
float previousPaddingAmount = 0.0f;
int numShownItems = 0;
boolean finish = false;
- int maxDisplayedNotifications = mAmbientState.isDark()
+ int maxDisplayedNotifications = mAmbientState.isFullyDark()
? (hasPulsingNotifications() ? 1 : 0)
: mMaxDisplayedNotifications;
@@ -2085,7 +2108,7 @@ public class NotificationStackScrollLayout extends ViewGroup
&& !expandableView.hasNoContentHeight()) {
boolean limitReached = maxDisplayedNotifications != -1
&& numShownItems >= maxDisplayedNotifications;
- boolean notificationOnAmbientThatIsNotPulsing = mAmbientState.isDark()
+ boolean notificationOnAmbientThatIsNotPulsing = mAmbientState.isFullyDark()
&& hasPulsingNotifications()
&& expandableView instanceof ExpandableNotificationRow
&& !isPulsing(((ExpandableNotificationRow) expandableView).getEntry());
@@ -2168,7 +2191,7 @@ public class NotificationStackScrollLayout extends ViewGroup
private void updateBackground() {
// No need to update the background color if it's not being drawn.
- if (!mShouldDrawNotificationBackground || mAmbientState.isDark()) {
+ if (!mShouldDrawNotificationBackground || mAmbientState.isFullyDark()) {
return;
}
@@ -2521,6 +2544,9 @@ public class NotificationStackScrollLayout extends ViewGroup
}
public int getLayoutMinHeight() {
+ if (isHeadsUpTransition()) {
+ return getTopHeadsUpPinnedHeight();
+ }
return mShelf.getVisibility() == GONE ? 0 : mShelf.getIntrinsicHeight();
}
@@ -2929,42 +2955,18 @@ public class NotificationStackScrollLayout extends ViewGroup
private void updateFirstAndLastBackgroundViews() {
ActivatableNotificationView firstChild = getFirstChildWithBackground();
ActivatableNotificationView lastChild = getLastChildWithBackground();
- boolean firstChanged = firstChild != mFirstVisibleBackgroundChild;
- boolean lastChanged = lastChild != mLastVisibleBackgroundChild;
if (mAnimationsEnabled && mIsExpanded) {
- mAnimateNextBackgroundTop = firstChanged;
- mAnimateNextBackgroundBottom = lastChanged;
+ mAnimateNextBackgroundTop = firstChild != mFirstVisibleBackgroundChild;
+ mAnimateNextBackgroundBottom = lastChild != mLastVisibleBackgroundChild;
} else {
mAnimateNextBackgroundTop = false;
mAnimateNextBackgroundBottom = false;
}
- if (firstChanged && mFirstVisibleBackgroundChild != null
- && !mFirstVisibleBackgroundChild.isRemoved()) {
- mFirstVisibleBackgroundChild.setTopRoundness(0.0f,
- mFirstVisibleBackgroundChild.isShown());
- }
- if (lastChanged && mLastVisibleBackgroundChild != null
- && !mLastVisibleBackgroundChild.isRemoved()) {
- mLastVisibleBackgroundChild.setBottomRoundness(0.0f,
- mLastVisibleBackgroundChild.isShown());
- }
mFirstVisibleBackgroundChild = firstChild;
mLastVisibleBackgroundChild = lastChild;
mAmbientState.setLastVisibleBackgroundChild(lastChild);
- applyRoundedNess();
- }
-
- private void applyRoundedNess() {
- if (mFirstVisibleBackgroundChild != null) {
- mFirstVisibleBackgroundChild.setTopRoundness(1.0f,
- mFirstVisibleBackgroundChild.isShown()
- && !mChildrenToAddAnimated.contains(mFirstVisibleBackgroundChild));
- }
- if (mLastVisibleBackgroundChild != null) {
- mLastVisibleBackgroundChild.setBottomRoundness(1.0f,
- mLastVisibleBackgroundChild.isShown()
- && !mChildrenToAddAnimated.contains(mLastVisibleBackgroundChild));
- }
+ mRoundnessManager.setFirstAndLastBackgroundChild(mFirstVisibleBackgroundChild,
+ mLastVisibleBackgroundChild);
invalidate();
}
@@ -3021,6 +3023,12 @@ public class NotificationStackScrollLayout extends ViewGroup
}
@Override
+ public void bindRow(ExpandableNotificationRow row) {
+ row.setHeadsUpAnimatingAwayListener(animatingAway
+ -> mRoundnessManager.onHeadsupAnimatingAwayChanged(row, animatingAway));
+ }
+
+ @Override
public void applyExpandAnimationParams(ExpandAnimationParameters params) {
mAmbientState.setExpandAnimationTopChange(params == null ? 0 : params.getTopChange());
requestChildrenUpdate();
@@ -3298,7 +3306,7 @@ public class NotificationStackScrollLayout extends ViewGroup
.animateY(mShelf));
ev.darkAnimationOriginIndex = mDarkAnimationOriginIndex;
mAnimationEvents.add(ev);
- startBackgroundFadeIn();
+ startBackgroundFade();
}
mDarkNeedsAnimation = false;
}
@@ -3889,7 +3897,6 @@ public class NotificationStackScrollLayout extends ViewGroup
requestChildrenUpdate();
applyCurrentBackgroundBounds();
updateWillNotDraw();
- updateContentHeight();
updateAntiBurnInTranslation();
notifyHeightChangeListener(mShelf);
}
@@ -3910,6 +3917,11 @@ public class NotificationStackScrollLayout extends ViewGroup
private void setDarkAmount(float darkAmount) {
mDarkAmount = darkAmount;
+ final boolean fullyDark = darkAmount == 1;
+ if (mAmbientState.isFullyDark() != fullyDark) {
+ mAmbientState.setFullyDark(fullyDark);
+ updateContentHeight();
+ }
updateBackgroundDimming();
}
@@ -3917,8 +3929,9 @@ public class NotificationStackScrollLayout extends ViewGroup
return mDarkAmount;
}
- private void startBackgroundFadeIn() {
- ObjectAnimator fadeAnimator = ObjectAnimator.ofFloat(this, DARK_AMOUNT, mDarkAmount, 0f);
+ private void startBackgroundFade() {
+ ObjectAnimator fadeAnimator = ObjectAnimator.ofFloat(this, DARK_AMOUNT, mDarkAmount,
+ mAmbientState.isDark() ? 1f : 0);
fadeAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP);
fadeAnimator.setInterpolator(Interpolators.ALPHA_IN);
fadeAnimator.start();
@@ -4288,6 +4301,7 @@ public class NotificationStackScrollLayout extends ViewGroup
public void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) {
mHeadsUpManager = headsUpManager;
mAmbientState.setHeadsUpManager(headsUpManager);
+ mHeadsUpManager.addListener(mRoundnessManager);
}
public void generateHeadsUpAnimation(ExpandableNotificationRow row, boolean isHeadsUp) {
@@ -4319,8 +4333,9 @@ public class NotificationStackScrollLayout extends ViewGroup
requestChildrenUpdate();
}
- public void setTrackingHeadsUp(boolean trackingHeadsUp) {
- mTrackingHeadsUp = trackingHeadsUp;
+ public void setTrackingHeadsUp(ExpandableNotificationRow row) {
+ mTrackingHeadsUp = row != null;
+ mRoundnessManager.setTrackingHeadsUp(row);
}
public void setScrimController(ScrimController scrimController) {
@@ -4502,6 +4517,27 @@ public class NotificationStackScrollLayout extends ViewGroup
mAmbientState.getScrollY()));
}
+ public boolean isFullyDark() {
+ return mAmbientState.isFullyDark();
+ }
+
+ /**
+ * Add a listener whenever the expanded height changes. The first value passed as an argument
+ * is the expanded height and the second one is the appearFraction.
+ *
+ * @param listener the listener to notify.
+ */
+ public void addOnExpandedHeightListener(BiConsumer<Float, Float> listener) {
+ mExpandedHeightListeners.add(listener);
+ }
+
+ /**
+ * Stop a listener from listening to the expandedHeight.
+ */
+ public void removeOnExpandedHeightListener(BiConsumer<Float, Float> listener) {
+ mExpandedHeightListeners.remove(listener);
+ }
+
/**
* A listener that is notified when the empty space below the notifications is clicked on
*/
@@ -4880,7 +4916,8 @@ public class NotificationStackScrollLayout extends ViewGroup
.animateHeight()
.animateTopInset()
.animateY()
- .animateZ(),
+ .animateZ()
+ .hasDelays(),
// ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK
new AnimationFilter()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
index 51737a863748..7c8e0fc4886b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
@@ -50,6 +50,8 @@ public class StackScrollAlgorithm {
private boolean mIsExpanded;
private boolean mClipNotificationScrollToTop;
private int mStatusBarHeight;
+ private float mHeadsUpInset;
+ private int mPinnedZTranslationExtra;
public StackScrollAlgorithm(Context context) {
initView(context);
@@ -68,6 +70,10 @@ public class StackScrollAlgorithm {
mCollapsedSize = res.getDimensionPixelSize(R.dimen.notification_min_height);
mStatusBarHeight = res.getDimensionPixelSize(R.dimen.status_bar_height);
mClipNotificationScrollToTop = res.getBoolean(R.bool.config_clipNotificationScrollToTop);
+ mHeadsUpInset = mStatusBarHeight + res.getDimensionPixelSize(
+ R.dimen.heads_up_status_bar_padding);
+ mPinnedZTranslationExtra = res.getDimensionPixelSize(
+ R.dimen.heads_up_pinned_elevation);
}
public void getStackScrollState(AmbientState ambientState, StackScrollState resultState) {
@@ -184,7 +190,7 @@ public class StackScrollAlgorithm {
private void updateDimmedActivatedHideSensitive(AmbientState ambientState,
StackScrollState resultState, StackScrollAlgorithmState algorithmState) {
boolean dimmed = ambientState.isDimmed();
- boolean dark = ambientState.isDark();
+ boolean dark = ambientState.isFullyDark();
boolean hideSensitive = ambientState.isHideSensitive();
View activatedChild = ambientState.getActivatedChild();
int childCount = algorithmState.visibleChildren.size();
@@ -457,7 +463,7 @@ public class StackScrollAlgorithm {
}
}
if (row.isPinned()) {
- childState.yTranslation = Math.max(childState.yTranslation, 0);
+ childState.yTranslation = Math.max(childState.yTranslation, mHeadsUpInset);
childState.height = Math.max(row.getIntrinsicHeight(), childState.height);
childState.hidden = false;
ExpandableViewState topState = resultState.getViewStateForView(topHeadsUpEntry);
@@ -522,9 +528,6 @@ public class StackScrollAlgorithm {
childViewState.inShelf = true;
childViewState.headsUpIsVisible = false;
}
- if (!ambientState.isShadeExpanded()) {
- childViewState.height = (int) (mStatusBarHeight - childViewState.yTranslation);
- }
}
protected int getMaxAllowedChildHeight(View child) {
@@ -592,6 +595,13 @@ public class StackScrollAlgorithm {
} else {
childViewState.zTranslation = baseZ;
}
+
+ // We need to scrim the notification more from its surrounding content when we are pinned,
+ // and we therefore elevate it higher.
+ // We can use the headerVisibleAmount for this, since the value nicely goes from 0 to 1 when
+ // expanding after which we have a normal elevation again.
+ childViewState.zTranslation += (1.0f - child.getHeaderVisibleAmount())
+ * mPinnedZTranslationExtra;
return childrenOnTop;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
index 236c348e539b..d48ae76495f4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
@@ -29,6 +29,7 @@ import com.android.systemui.R;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.ExpandableView;
import com.android.systemui.statusbar.NotificationShelf;
+import com.android.systemui.statusbar.StatusBarIconView;
import java.util.ArrayList;
import java.util.HashSet;
@@ -45,13 +46,17 @@ public class StackStateAnimator {
public static final int ANIMATION_DURATION_APPEAR_DISAPPEAR = 464;
public static final int ANIMATION_DURATION_DIMMED_ACTIVATED = 220;
public static final int ANIMATION_DURATION_CLOSE_REMOTE_INPUT = 150;
- public static final int ANIMATION_DURATION_HEADS_UP_APPEAR = 650;
- public static final int ANIMATION_DURATION_HEADS_UP_DISAPPEAR = 230;
+ public static final int ANIMATION_DURATION_HEADS_UP_APPEAR = 550;
+ public static final int ANIMATION_DURATION_HEADS_UP_APPEAR_CLOSED
+ = (int) (ANIMATION_DURATION_HEADS_UP_APPEAR
+ * HeadsUpAppearInterpolator.getFractionUntilOvershoot());
+ public static final int ANIMATION_DURATION_HEADS_UP_DISAPPEAR = 300;
public static final int ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING = 80;
public static final int ANIMATION_DELAY_PER_ELEMENT_MANUAL = 32;
public static final int ANIMATION_DELAY_PER_ELEMENT_GO_TO_FULL_SHADE = 48;
public static final int DELAY_EFFECT_MAX_INDEX_DIFFERENCE = 2;
public static final int ANIMATION_DELAY_HEADS_UP = 120;
+ public static final int ANIMATION_DELAY_HEADS_UP_CLICKED= 120;
private final int mGoToFullShadeAppearingTranslation;
private final ExpandableViewState mTmpState = new ExpandableViewState();
@@ -74,8 +79,9 @@ public class StackStateAnimator {
private ValueAnimator mBottomOverScrollAnimator;
private int mHeadsUpAppearHeightBottom;
private boolean mShadeExpanded;
- private ArrayList<View> mChildrenToClearFromOverlay = new ArrayList<>();
private NotificationShelf mShelf;
+ private float mStatusBarIconLocation;
+ private int[] mTmpLocation = new int[2];
public StackStateAnimator(NotificationStackScrollLayout hostLayout) {
mHostLayout = hostLayout;
@@ -222,8 +228,8 @@ public class StackStateAnimator {
if (mAnimationFilter.hasGoToFullShadeEvent) {
return calculateDelayGoToFullShade(viewState);
}
- if (mAnimationFilter.hasHeadsUpDisappearClickEvent) {
- return ANIMATION_DELAY_HEADS_UP;
+ if (mAnimationFilter.customDelay != AnimationFilter.NO_DELAY) {
+ return mAnimationFilter.customDelay;
}
long minDelay = 0;
for (NotificationStackScrollLayout.AnimationEvent event : mNewEvents) {
@@ -327,10 +333,6 @@ public class StackStateAnimator {
private void onAnimationFinished() {
mHostLayout.onChildAnimationFinished();
- for (View v : mChildrenToClearFromOverlay) {
- removeFromOverlay(v);
- }
- mChildrenToClearFromOverlay.clear();
}
/**
@@ -396,13 +398,14 @@ public class StackStateAnimator {
}
changingView.performRemoveAnimation(ANIMATION_DURATION_APPEAR_DISAPPEAR,
- translationDirection, new Runnable() {
+ 0 /* delay */, translationDirection, false /* isHeadsUpAppear */,
+ 0, new Runnable() {
@Override
public void run() {
// remove the temporary overlay
removeFromOverlay(changingView);
}
- });
+ }, null);
} else if (event.animationType ==
NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE_SWIPED_OUT) {
// A race condition can trigger the view to be added to the overlay even though
@@ -424,7 +427,9 @@ public class StackStateAnimator {
if (event.headsUpFromBottom) {
mTmpState.yTranslation = mHeadsUpAppearHeightBottom;
} else {
- mTmpState.yTranslation = -mTmpState.height;
+ mTmpState.yTranslation = 0;
+ changingView.performAddAnimation(0, ANIMATION_DURATION_HEADS_UP_APPEAR_CLOSED,
+ true /* isHeadsUpAppear */);
}
mHeadsUpAppearChildren.add(changingView);
mTmpState.applyToView(changingView);
@@ -433,22 +438,56 @@ public class StackStateAnimator {
event.animationType == NotificationStackScrollLayout
.AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK) {
mHeadsUpDisappearChildren.add(changingView);
+ Runnable endRunnable = null;
+ // We need some additional delay in case we were removed to make sure we're not
+ // lagging
+ int extraDelay = event.animationType == NotificationStackScrollLayout
+ .AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK
+ ? ANIMATION_DELAY_HEADS_UP_CLICKED
+ : 0;
if (changingView.getParent() == null) {
// This notification was actually removed, so we need to add it to the overlay
mHostLayout.getOverlay().add(changingView);
mTmpState.initFrom(changingView);
- mTmpState.yTranslation = -changingView.getActualHeight();
+ mTmpState.yTranslation = 0;
// We temporarily enable Y animations, the real filter will be combined
// afterwards anyway
mAnimationFilter.animateY = true;
- mAnimationProperties.delay =
- event.animationType == NotificationStackScrollLayout
- .AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK
- ? ANIMATION_DELAY_HEADS_UP
- : 0;
+ mAnimationProperties.delay = extraDelay + ANIMATION_DELAY_HEADS_UP;
mAnimationProperties.duration = ANIMATION_DURATION_HEADS_UP_DISAPPEAR;
mTmpState.animateTo(changingView, mAnimationProperties);
- mChildrenToClearFromOverlay.add(changingView);
+ endRunnable = () -> {
+ // remove the temporary overlay
+ removeFromOverlay(changingView);
+ };
+ }
+ float targetLocation = 0;
+ boolean needsAnimation = true;
+ if (changingView instanceof ExpandableNotificationRow) {
+ ExpandableNotificationRow row = (ExpandableNotificationRow) changingView;
+ if (row.isDismissed()) {
+ needsAnimation = false;
+ }
+ StatusBarIconView icon = row.getEntry().icon;
+ if (icon.getParent() != null) {
+ icon.getLocationOnScreen(mTmpLocation);
+ float iconPosition = mTmpLocation[0] - icon.getTranslationX()
+ + ViewState.getFinalTranslationX(icon) + icon.getWidth() * 0.25f;
+ mHostLayout.getLocationOnScreen(mTmpLocation);
+ targetLocation = iconPosition - mTmpLocation[0];
+ }
+ }
+
+ if (needsAnimation) {
+ // We need to add the global animation listener, since once no animations are
+ // running anymore, the panel will instantly hide itself. We need to wait until
+ // the animation is fully finished for this though.
+ changingView.performRemoveAnimation(ANIMATION_DURATION_HEADS_UP_DISAPPEAR
+ + ANIMATION_DELAY_HEADS_UP, extraDelay, 0.0f,
+ true /* isHeadsUpAppear */, targetLocation, endRunnable,
+ getGlobalAnimationFinishedListener());
+ } else if (endRunnable != null) {
+ endRunnable.run();
}
}
mNewEvents.add(event);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java
index 04a7bd79c6ca..4b3643f620a0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java
@@ -641,6 +641,22 @@ public class ViewState {
}
/**
+ * Get the end value of the xTranslation animation running on a view or the xTranslation
+ * if no animation is running.
+ */
+ public static float getFinalTranslationX(View view) {
+ if (view == null) {
+ return 0;
+ }
+ ValueAnimator xAnimator = getChildTag(view, TAG_ANIMATOR_TRANSLATION_X);
+ if (xAnimator == null) {
+ return view.getTranslationX();
+ } else {
+ return getChildTag(view, TAG_END_TRANSLATION_X);
+ }
+ }
+
+ /**
* Get the end value of the yTranslation animation running on a view or the yTranslation
* if no animation is running.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
new file mode 100644
index 000000000000..41b094a32682
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
@@ -0,0 +1,835 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.volume;
+
+import android.animation.ObjectAnimator;
+import android.annotation.SuppressLint;
+import android.app.Dialog;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
+import android.media.AudioManager;
+import android.media.AudioSystem;
+import android.os.Debug;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.SystemClock;
+import android.provider.Settings.Global;
+import android.util.Log;
+import android.util.Slog;
+import android.util.SparseBooleanArray;
+import android.view.ContextThemeWrapper;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.animation.DecelerateInterpolator;
+import android.widget.ImageButton;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.android.settingslib.Utils;
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.plugins.VolumeDialog;
+import com.android.systemui.plugins.VolumeDialogController;
+import com.android.systemui.plugins.VolumeDialogController.State;
+import com.android.systemui.plugins.VolumeDialogController.StreamState;
+
+/**
+ * Car version of the volume dialog.
+ *
+ * A client of VolumeDialogControllerImpl and its state model.
+ *
+ * Methods ending in "H" must be called on the (ui) handler.
+ */
+public class CarVolumeDialogImpl implements VolumeDialog {
+ private static final String TAG = Util.logTag(CarVolumeDialogImpl.class);
+
+ private static final long USER_ATTEMPT_GRACE_PERIOD = 1000;
+ private static final int UPDATE_ANIMATION_DURATION = 80;
+
+ private final Context mContext;
+ private final H mHandler = new H();
+ private final VolumeDialogController mController;
+
+ private Window mWindow;
+ private CustomDialog mDialog;
+ private ViewGroup mDialogView;
+ private ViewGroup mDialogRowsView;
+ private final List<VolumeRow> mRows = new ArrayList<>();
+ private ConfigurableTexts mConfigurableTexts;
+ private final SparseBooleanArray mDynamic = new SparseBooleanArray();
+ private final KeyguardManager mKeyguard;
+ private final Object mSafetyWarningLock = new Object();
+ private final ColorStateList mActiveSliderTint;
+ private final ColorStateList mInactiveSliderTint;
+
+ private boolean mShowing;
+
+ private int mActiveStream;
+ private int mPrevActiveStream;
+ private boolean mAutomute = VolumePrefs.DEFAULT_ENABLE_AUTOMUTE;
+ private boolean mSilentMode = VolumePrefs.DEFAULT_ENABLE_SILENT_MODE;
+ private State mState;
+ private SafetyWarningDialog mSafetyWarning;
+ private boolean mHovering = false;
+ private boolean mExpanded = false;
+ private View mExpandBtn;
+
+ public CarVolumeDialogImpl(Context context) {
+ mContext = new ContextThemeWrapper(context, com.android.systemui.R.style.qs_theme);
+ mController = Dependency.get(VolumeDialogController.class);
+ mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+ mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(mContext));
+ mInactiveSliderTint = loadColorStateList(R.color.volume_slider_inactive);
+ }
+
+ public void init(int windowType, Callback callback) {
+ initDialog();
+
+ mController.addCallback(mControllerCallbackH, mHandler);
+ mController.getState();
+ }
+
+ @Override
+ public void destroy() {
+ mController.removeCallback(mControllerCallbackH);
+ mHandler.removeCallbacksAndMessages(null);
+ }
+
+ private void initDialog() {
+ mDialog = new CustomDialog(mContext);
+
+ mConfigurableTexts = new ConfigurableTexts(mContext);
+ mHovering = false;
+ mShowing = false;
+ mWindow = mDialog.getWindow();
+ mWindow.requestFeature(Window.FEATURE_NO_TITLE);
+ mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+ mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND
+ | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
+ mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+ | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
+ mWindow.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
+ mWindow.setWindowAnimations(com.android.internal.R.style.Animation_Toast);
+ final WindowManager.LayoutParams lp = mWindow.getAttributes();
+ lp.format = PixelFormat.TRANSLUCENT;
+ lp.setTitle(VolumeDialogImpl.class.getSimpleName());
+ lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
+ lp.windowAnimations = -1;
+ mWindow.setAttributes(lp);
+ mWindow.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+
+ mDialog.setCanceledOnTouchOutside(true);
+ mDialog.setContentView(R.layout.car_volume_dialog);
+ mDialog.setOnShowListener(dialog -> {
+ mDialogView.setTranslationY(-mDialogView.getHeight());
+ mDialogView.setAlpha(0);
+ mDialogView.animate()
+ .alpha(1)
+ .translationY(0)
+ .setDuration(300)
+ .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
+ .start();
+ });
+ mExpandBtn = mDialog.findViewById(R.id.expand);
+ mExpandBtn.setOnClickListener(v -> {
+ mExpanded = !mExpanded;
+ updateRowsH(getActiveRow());
+ });
+ mDialogView = mDialog.findViewById(R.id.volume_dialog);
+ mDialogView.setOnHoverListener((v, event) -> {
+ int action = event.getActionMasked();
+ mHovering = (action == MotionEvent.ACTION_HOVER_ENTER)
+ || (action == MotionEvent.ACTION_HOVER_MOVE);
+ rescheduleTimeoutH();
+ return true;
+ });
+
+ mDialogRowsView = mDialog.findViewById(R.id.car_volume_dialog_rows);
+
+ if (mRows.isEmpty()) {
+ addRow(AudioManager.STREAM_MUSIC,
+ R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true, true);
+ addRow(AudioManager.STREAM_RING,
+ R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true, false);
+ addRow(AudioManager.STREAM_ALARM,
+ R.drawable.ic_volume_alarm, R.drawable.ic_volume_alarm_mute, true, false);
+ } else {
+ addExistingRows();
+ }
+
+ updateRowsH(getActiveRow());
+ }
+
+ private ColorStateList loadColorStateList(int colorResId) {
+ return ColorStateList.valueOf(mContext.getColor(colorResId));
+ }
+
+ public void setStreamImportant(int stream, boolean important) {
+ mHandler.obtainMessage(H.SET_STREAM_IMPORTANT, stream, important ? 1 : 0).sendToTarget();
+ }
+
+ public void setAutomute(boolean automute) {
+ if (mAutomute == automute) return;
+ mAutomute = automute;
+ mHandler.sendEmptyMessage(H.RECHECK_ALL);
+ }
+
+ public void setSilentMode(boolean silentMode) {
+ if (mSilentMode == silentMode) return;
+ mSilentMode = silentMode;
+ mHandler.sendEmptyMessage(H.RECHECK_ALL);
+ }
+
+ private void addRow(int stream, int iconRes, int iconMuteRes, boolean important,
+ boolean defaultStream) {
+ addRow(stream, iconRes, iconMuteRes, important, defaultStream, false);
+ }
+
+ private void addRow(int stream, int iconRes, int iconMuteRes, boolean important,
+ boolean defaultStream, boolean dynamic) {
+ if (D.BUG) Slog.d(TAG, "Adding row for stream " + stream);
+ VolumeRow row = new VolumeRow();
+ initRow(row, stream, iconRes, iconMuteRes, important, defaultStream);
+ mDialogRowsView.addView(row.view);
+ mRows.add(row);
+ }
+
+ private void addExistingRows() {
+ int N = mRows.size();
+ for (int i = 0; i < N; i++) {
+ final VolumeRow row = mRows.get(i);
+ initRow(row, row.stream, row.iconRes, row.iconMuteRes, row.important,
+ row.defaultStream);
+ mDialogRowsView.addView(row.view);
+ updateVolumeRowH(row);
+ }
+ }
+
+ private VolumeRow getActiveRow() {
+ for (VolumeRow row : mRows) {
+ if (row.stream == mActiveStream) {
+ return row;
+ }
+ }
+ return mRows.get(0);
+ }
+
+ private VolumeRow findRow(int stream) {
+ for (VolumeRow row : mRows) {
+ if (row.stream == stream) return row;
+ }
+ return null;
+ }
+
+ public void dump(PrintWriter writer) {
+ writer.println(VolumeDialogImpl.class.getSimpleName() + " state:");
+ writer.print(" mShowing: "); writer.println(mShowing);
+ writer.print(" mActiveStream: "); writer.println(mActiveStream);
+ writer.print(" mDynamic: "); writer.println(mDynamic);
+ writer.print(" mAutomute: "); writer.println(mAutomute);
+ writer.print(" mSilentMode: "); writer.println(mSilentMode);
+ }
+
+ private static int getImpliedLevel(SeekBar seekBar, int progress) {
+ final int m = seekBar.getMax();
+ final int n = m / 100 - 1;
+ final int level = progress == 0 ? 0
+ : progress == m ? (m / 100) : (1 + (int)((progress / (float) m) * n));
+ return level;
+ }
+
+ @SuppressLint("InflateParams")
+ private void initRow(final VolumeRow row, final int stream, int iconRes, int iconMuteRes,
+ boolean important, boolean defaultStream) {
+ row.stream = stream;
+ row.iconRes = iconRes;
+ row.iconMuteRes = iconMuteRes;
+ row.important = important;
+ row.defaultStream = defaultStream;
+ row.view = mDialog.getLayoutInflater().inflate(R.layout.car_volume_dialog_row, null);
+ row.view.setId(row.stream);
+ row.view.setTag(row);
+ row.slider = row.view.findViewById(R.id.volume_row_slider);
+ row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row));
+ row.anim = null;
+
+ row.icon = row.view.findViewById(R.id.volume_row_icon);
+ row.icon.setImageResource(iconRes);
+ }
+
+ public void show(int reason) {
+ mHandler.obtainMessage(H.SHOW, reason, 0).sendToTarget();
+ }
+
+ public void dismiss(int reason) {
+ mHandler.obtainMessage(H.DISMISS, reason, 0).sendToTarget();
+ }
+
+ private void showH(int reason) {
+ if (D.BUG) Log.d(TAG, "showH r=" + Events.DISMISS_REASONS[reason]);
+ mHandler.removeMessages(H.SHOW);
+ mHandler.removeMessages(H.DISMISS);
+ rescheduleTimeoutH();
+ if (mShowing) return;
+ mShowing = true;
+
+ mDialog.show();
+ Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked());
+ mController.notifyVisible(true);
+ }
+
+ protected void rescheduleTimeoutH() {
+ mHandler.removeMessages(H.DISMISS);
+ final int timeout = computeTimeoutH();
+ mHandler.sendMessageDelayed(mHandler
+ .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT, 0), timeout);
+ if (D.BUG) Log.d(TAG, "rescheduleTimeout " + timeout + " " + Debug.getCaller());
+ mController.userActivity();
+ }
+
+ private int computeTimeoutH() {
+ if (mHovering) return 16000;
+ if (mSafetyWarning != null) return 5000;
+ return 3000;
+ }
+
+ protected void dismissH(int reason) {
+ mHandler.removeMessages(H.DISMISS);
+ mHandler.removeMessages(H.SHOW);
+ if (!mShowing) return;
+ mDialogView.animate().cancel();
+ mShowing = false;
+
+ mDialogView.setTranslationY(0);
+ mDialogView.setAlpha(1);
+ mDialogView.animate()
+ .alpha(0)
+ .translationY(-mDialogView.getHeight())
+ .setDuration(250)
+ .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator())
+ .withEndAction(() -> mHandler.postDelayed(() -> {
+ if (D.BUG) Log.d(TAG, "mDialog.dismiss()");
+ mDialog.dismiss();
+ }, 50))
+ .start();
+
+ Events.writeEvent(mContext, Events.EVENT_DISMISS_DIALOG, reason);
+ mController.notifyVisible(false);
+ synchronized (mSafetyWarningLock) {
+ if (mSafetyWarning != null) {
+ if (D.BUG) Log.d(TAG, "SafetyWarning dismissed");
+ mSafetyWarning.dismiss();
+ }
+ }
+ }
+
+ private boolean shouldBeVisibleH(VolumeRow row) {
+ if (mExpanded) {
+ return true;
+ }
+ return row.defaultStream;
+ }
+
+ private void updateRowsH(final VolumeRow activeRow) {
+ if (D.BUG) Log.d(TAG, "updateRowsH");
+ if (!mShowing) {
+ trimObsoleteH();
+ }
+ // apply changes to all rows
+ for (final VolumeRow row : mRows) {
+ final boolean isActive = row == activeRow;
+ final boolean shouldBeVisible = shouldBeVisibleH(row);
+ Util.setVisOrGone(row.view, shouldBeVisible);
+ if (row.view.isShown()) {
+ updateVolumeRowSliderTintH(row, isActive);
+ }
+ }
+ }
+
+ private void trimObsoleteH() {
+ if (D.BUG) Log.d(TAG, "trimObsoleteH");
+ for (int i = mRows.size() - 1; i >= 0; i--) {
+ final VolumeRow row = mRows.get(i);
+ if (row.ss == null || !row.ss.dynamic) continue;
+ if (!mDynamic.get(row.stream)) {
+ mRows.remove(i);
+ mDialogRowsView.removeView(row.view);
+ }
+ }
+ }
+
+ protected void onStateChangedH(State state) {
+ mState = state;
+ mDynamic.clear();
+ // add any new dynamic rows
+ for (int i = 0; i < state.states.size(); i++) {
+ final int stream = state.states.keyAt(i);
+ final StreamState ss = state.states.valueAt(i);
+ if (!ss.dynamic) continue;
+ mDynamic.put(stream, true);
+ if (findRow(stream) == null) {
+ addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true,
+ false, true);
+ }
+ }
+
+ if (mActiveStream != state.activeStream) {
+ mPrevActiveStream = mActiveStream;
+ mActiveStream = state.activeStream;
+ updateRowsH(getActiveRow());
+ rescheduleTimeoutH();
+ }
+ for (VolumeRow row : mRows) {
+ updateVolumeRowH(row);
+ }
+
+ }
+
+ private void updateVolumeRowH(VolumeRow row) {
+ if (D.BUG) Log.d(TAG, "updateVolumeRowH s=" + row.stream);
+ if (mState == null) return;
+ final StreamState ss = mState.states.get(row.stream);
+ if (ss == null) return;
+ row.ss = ss;
+ if (ss.level > 0) {
+ row.lastAudibleLevel = ss.level;
+ }
+ if (ss.level == row.requestedLevel) {
+ row.requestedLevel = -1;
+ }
+ final boolean isRingStream = row.stream == AudioManager.STREAM_RING;
+ final boolean isSystemStream = row.stream == AudioManager.STREAM_SYSTEM;
+ final boolean isAlarmStream = row.stream == AudioManager.STREAM_ALARM;
+ final boolean isMusicStream = row.stream == AudioManager.STREAM_MUSIC;
+ final boolean isRingVibrate = isRingStream
+ && mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE;
+ final boolean isRingSilent = isRingStream
+ && mState.ringerModeInternal == AudioManager.RINGER_MODE_SILENT;
+ final boolean isZenPriorityOnly = mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
+ final boolean isZenAlarms = mState.zenMode == Global.ZEN_MODE_ALARMS;
+ final boolean isZenNone = mState.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS;
+ final boolean zenMuted = isZenAlarms ? (isRingStream || isSystemStream)
+ : isZenNone ? (isRingStream || isSystemStream || isAlarmStream || isMusicStream)
+ : isZenPriorityOnly ? ((isAlarmStream && mState.disallowAlarms) ||
+ (isMusicStream && mState.disallowMedia) ||
+ (isRingStream && mState.disallowRinger) ||
+ (isSystemStream && mState.disallowSystem))
+ : false;
+
+ // update slider max
+ final int max = ss.levelMax * 100;
+ if (max != row.slider.getMax()) {
+ row.slider.setMax(max);
+ }
+
+ // update icon
+ final boolean iconEnabled = (mAutomute || ss.muteSupported) && !zenMuted;
+ row.icon.setEnabled(iconEnabled);
+ row.icon.setAlpha(iconEnabled ? 1 : 0.5f);
+ final int iconRes =
+ isRingVibrate ? R.drawable.ic_volume_ringer_vibrate
+ : isRingSilent || zenMuted ? row.iconMuteRes
+ : ss.routedToBluetooth ?
+ (ss.muted ? R.drawable.ic_volume_media_bt_mute
+ : R.drawable.ic_volume_media_bt)
+ : mAutomute && ss.level == 0 ? row.iconMuteRes
+ : (ss.muted ? row.iconMuteRes : row.iconRes);
+ row.icon.setImageResource(iconRes);
+ row.iconState =
+ iconRes == R.drawable.ic_volume_ringer_vibrate ? Events.ICON_STATE_VIBRATE
+ : (iconRes == R.drawable.ic_volume_media_bt_mute || iconRes == row.iconMuteRes)
+ ? Events.ICON_STATE_MUTE
+ : (iconRes == R.drawable.ic_volume_media_bt || iconRes == row.iconRes)
+ ? Events.ICON_STATE_UNMUTE
+ : Events.ICON_STATE_UNKNOWN;
+ if (iconEnabled) {
+ if (isRingStream) {
+ if (isRingVibrate) {
+ row.icon.setContentDescription(mContext.getString(
+ R.string.volume_stream_content_description_unmute,
+ getStreamLabelH(ss)));
+ } else {
+ if (mController.hasVibrator()) {
+ row.icon.setContentDescription(mContext.getString(
+ R.string.volume_stream_content_description_vibrate,
+ getStreamLabelH(ss)));
+ } else {
+ row.icon.setContentDescription(mContext.getString(
+ R.string.volume_stream_content_description_mute,
+ getStreamLabelH(ss)));
+ }
+ }
+ } else {
+ if (ss.muted || mAutomute && ss.level == 0) {
+ row.icon.setContentDescription(mContext.getString(
+ R.string.volume_stream_content_description_unmute,
+ getStreamLabelH(ss)));
+ } else {
+ row.icon.setContentDescription(mContext.getString(
+ R.string.volume_stream_content_description_mute,
+ getStreamLabelH(ss)));
+ }
+ }
+ } else {
+ row.icon.setContentDescription(getStreamLabelH(ss));
+ }
+
+ // ensure tracking is disabled if zenMuted
+ if (zenMuted) {
+ row.tracking = false;
+ }
+
+ // update slider
+ final boolean enableSlider = !zenMuted;
+ final int vlevel = row.ss.muted && (!isRingStream && !zenMuted) ? 0
+ : row.ss.level;
+ updateVolumeRowSliderH(row, enableSlider, vlevel);
+ }
+
+ private String getStreamLabelH(StreamState ss) {
+ if (ss.remoteLabel != null) {
+ return ss.remoteLabel;
+ }
+ try {
+ return mContext.getResources().getString(ss.name);
+ } catch (Resources.NotFoundException e) {
+ Slog.e(TAG, "Can't find translation for stream " + ss);
+ return "";
+ }
+ }
+
+ private void updateVolumeRowSliderTintH(VolumeRow row, boolean isActive) {
+ if (isActive) {
+ row.slider.requestFocus();
+ }
+ final ColorStateList tint = isActive && row.slider.isEnabled() ? mActiveSliderTint
+ : mInactiveSliderTint;
+ if (tint == row.cachedSliderTint) return;
+ row.cachedSliderTint = tint;
+ row.slider.setProgressTintList(tint);
+ row.slider.setThumbTintList(tint);
+ }
+
+ private void updateVolumeRowSliderH(VolumeRow row, boolean enable, int vlevel) {
+ row.slider.setEnabled(enable);
+ updateVolumeRowSliderTintH(row, row.stream == mActiveStream);
+ if (row.tracking) {
+ return; // don't update if user is sliding
+ }
+ final int progress = row.slider.getProgress();
+ final int level = getImpliedLevel(row.slider, progress);
+ final boolean rowVisible = row.view.getVisibility() == View.VISIBLE;
+ final boolean inGracePeriod = (SystemClock.uptimeMillis() - row.userAttempt)
+ < USER_ATTEMPT_GRACE_PERIOD;
+ mHandler.removeMessages(H.RECHECK, row);
+ if (mShowing && rowVisible && inGracePeriod) {
+ if (D.BUG) Log.d(TAG, "inGracePeriod");
+ mHandler.sendMessageAtTime(mHandler.obtainMessage(H.RECHECK, row),
+ row.userAttempt + USER_ATTEMPT_GRACE_PERIOD);
+ return; // don't update if visible and in grace period
+ }
+ if (vlevel == level) {
+ if (mShowing && rowVisible) {
+ return; // don't clamp if visible
+ }
+ }
+ final int newProgress = vlevel * 100;
+ if (progress != newProgress) {
+ if (mShowing && rowVisible) {
+ // animate!
+ if (row.anim != null && row.anim.isRunning()
+ && row.animTargetProgress == newProgress) {
+ return; // already animating to the target progress
+ }
+ // start/update animation
+ if (row.anim == null) {
+ row.anim = ObjectAnimator.ofInt(row.slider, "progress", progress, newProgress);
+ row.anim.setInterpolator(new DecelerateInterpolator());
+ } else {
+ row.anim.cancel();
+ row.anim.setIntValues(progress, newProgress);
+ }
+ row.animTargetProgress = newProgress;
+ row.anim.setDuration(UPDATE_ANIMATION_DURATION);
+ row.anim.start();
+ } else {
+ // update slider directly to clamped value
+ if (row.anim != null) {
+ row.anim.cancel();
+ }
+ row.slider.setProgress(newProgress, true);
+ }
+ }
+ }
+
+ private void recheckH(VolumeRow row) {
+ if (row == null) {
+ if (D.BUG) Log.d(TAG, "recheckH ALL");
+ trimObsoleteH();
+ for (VolumeRow r : mRows) {
+ updateVolumeRowH(r);
+ }
+ } else {
+ if (D.BUG) Log.d(TAG, "recheckH " + row.stream);
+ updateVolumeRowH(row);
+ }
+ }
+
+ private void setStreamImportantH(int stream, boolean important) {
+ for (VolumeRow row : mRows) {
+ if (row.stream == stream) {
+ row.important = important;
+ return;
+ }
+ }
+ }
+
+ private void showSafetyWarningH(int flags) {
+ if ((flags & (AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_SHOW_UI_WARNINGS)) != 0
+ || mShowing) {
+ synchronized (mSafetyWarningLock) {
+ if (mSafetyWarning != null) {
+ return;
+ }
+ mSafetyWarning = new SafetyWarningDialog(mContext, mController.getAudioManager()) {
+ @Override
+ protected void cleanUp() {
+ synchronized (mSafetyWarningLock) {
+ mSafetyWarning = null;
+ }
+ recheckH(null);
+ }
+ };
+ mSafetyWarning.show();
+ }
+ recheckH(null);
+ }
+ rescheduleTimeoutH();
+ }
+
+ private final VolumeDialogController.Callbacks mControllerCallbackH
+ = new VolumeDialogController.Callbacks() {
+ @Override
+ public void onShowRequested(int reason) {
+ showH(reason);
+ }
+
+ @Override
+ public void onDismissRequested(int reason) {
+ dismissH(reason);
+ }
+
+ @Override
+ public void onScreenOff() {
+ dismissH(Events.DISMISS_REASON_SCREEN_OFF);
+ }
+
+ @Override
+ public void onStateChanged(State state) {
+ onStateChangedH(state);
+ }
+
+ @Override
+ public void onLayoutDirectionChanged(int layoutDirection) {
+ mDialogView.setLayoutDirection(layoutDirection);
+ }
+
+ @Override
+ public void onConfigurationChanged() {
+ mDialog.dismiss();
+ initDialog();
+ mConfigurableTexts.update();
+ }
+
+ @Override
+ public void onShowVibrateHint() {
+ if (mSilentMode) {
+ mController.setRingerMode(AudioManager.RINGER_MODE_SILENT, false);
+ }
+ }
+
+ @Override
+ public void onShowSilentHint() {
+ if (mSilentMode) {
+ mController.setRingerMode(AudioManager.RINGER_MODE_NORMAL, false);
+ }
+ }
+
+ @Override
+ public void onShowSafetyWarning(int flags) {
+ showSafetyWarningH(flags);
+ }
+
+ @Override
+ public void onAccessibilityModeChanged(Boolean showA11yStream) {
+ }
+ };
+
+ private final class H extends Handler {
+ private static final int SHOW = 1;
+ private static final int DISMISS = 2;
+ private static final int RECHECK = 3;
+ private static final int RECHECK_ALL = 4;
+ private static final int SET_STREAM_IMPORTANT = 5;
+ private static final int RESCHEDULE_TIMEOUT = 6;
+ private static final int STATE_CHANGED = 7;
+
+ public H() {
+ super(Looper.getMainLooper());
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case SHOW: showH(msg.arg1); break;
+ case DISMISS: dismissH(msg.arg1); break;
+ case RECHECK: recheckH((VolumeRow) msg.obj); break;
+ case RECHECK_ALL: recheckH(null); break;
+ case SET_STREAM_IMPORTANT: setStreamImportantH(msg.arg1, msg.arg2 != 0); break;
+ case RESCHEDULE_TIMEOUT: rescheduleTimeoutH(); break;
+ case STATE_CHANGED: onStateChangedH(mState); break;
+ }
+ }
+ }
+
+ private final class CustomDialog extends Dialog implements DialogInterface {
+ public CustomDialog(Context context) {
+ super(context, com.android.systemui.R.style.qs_theme);
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ rescheduleTimeoutH();
+ return super.dispatchTouchEvent(ev);
+ }
+
+ @Override
+ protected void onStart() {
+ super.setCanceledOnTouchOutside(true);
+ super.onStart();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ mHandler.sendEmptyMessage(H.RECHECK_ALL);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (isShowing()) {
+ if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
+ dismissH(Events.DISMISS_REASON_TOUCH_OUTSIDE);
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ private final class VolumeSeekBarChangeListener implements OnSeekBarChangeListener {
+ private final VolumeRow mRow;
+
+ private VolumeSeekBarChangeListener(VolumeRow row) {
+ mRow = row;
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ if (mRow.ss == null) return;
+ if (D.BUG) Log.d(TAG, AudioSystem.streamToString(mRow.stream)
+ + " onProgressChanged " + progress + " fromUser=" + fromUser);
+ if (!fromUser) return;
+ if (mRow.ss.levelMin > 0) {
+ final int minProgress = mRow.ss.levelMin * 100;
+ if (progress < minProgress) {
+ seekBar.setProgress(minProgress);
+ progress = minProgress;
+ }
+ }
+ final int userLevel = getImpliedLevel(seekBar, progress);
+ if (mRow.ss.level != userLevel || mRow.ss.muted && userLevel > 0) {
+ mRow.userAttempt = SystemClock.uptimeMillis();
+ if (mRow.requestedLevel != userLevel) {
+ mController.setStreamVolume(mRow.stream, userLevel);
+ mRow.requestedLevel = userLevel;
+ Events.writeEvent(mContext, Events.EVENT_TOUCH_LEVEL_CHANGED, mRow.stream,
+ userLevel);
+ }
+ }
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ if (D.BUG) Log.d(TAG, "onStartTrackingTouch"+ " " + mRow.stream);
+ mController.setActiveStream(mRow.stream);
+ mRow.tracking = true;
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ if (D.BUG) Log.d(TAG, "onStopTrackingTouch"+ " " + mRow.stream);
+ mRow.tracking = false;
+ mRow.userAttempt = SystemClock.uptimeMillis();
+ final int userLevel = getImpliedLevel(seekBar, seekBar.getProgress());
+ Events.writeEvent(mContext, Events.EVENT_TOUCH_LEVEL_DONE, mRow.stream, userLevel);
+ if (mRow.ss.level != userLevel) {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(H.RECHECK, mRow),
+ USER_ATTEMPT_GRACE_PERIOD);
+ }
+ }
+ }
+
+ private static class VolumeRow {
+ private View view;
+ private ImageButton icon;
+ private SeekBar slider;
+ private int stream;
+ private StreamState ss;
+ private long userAttempt; // last user-driven slider change
+ private boolean tracking; // tracking slider touch
+ private int requestedLevel = -1; // pending user-requested level via progress changed
+ private int iconRes;
+ private int iconMuteRes;
+ private boolean important;
+ private boolean defaultStream;
+ private ColorStateList cachedSliderTint;
+ private int iconState; // from Events
+ private ObjectAnimator anim; // slider progress animation for non-touch-related updates
+ private int animTargetProgress;
+ private int lastAudibleLevel = 1;
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
index 0203c43d3683..6e5b5484cabe 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
@@ -19,6 +19,7 @@ package com.android.systemui.volume;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.media.VolumePolicy;
@@ -80,6 +81,7 @@ public class VolumeDialogComponent implements VolumeComponent, TunerService.Tuna
Dependency.get(ExtensionController.class).newExtension(VolumeDialog.class)
.withPlugin(VolumeDialog.class)
.withDefault(this::createDefault)
+ .withFeature(PackageManager.FEATURE_AUTOMOTIVE, this::createCarDefault)
.withCallback(dialog -> {
if (mDialog != null) {
mDialog.destroy();
@@ -100,6 +102,14 @@ public class VolumeDialogComponent implements VolumeComponent, TunerService.Tuna
return impl;
}
+ private VolumeDialog createCarDefault() {
+ CarVolumeDialogImpl impl = new CarVolumeDialogImpl(mContext);
+ impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false);
+ impl.setAutomute(true);
+ impl.setSilentMode(false);
+ return impl;
+ }
+
@Override
public void onTuningChanged(String key, String newValue) {
if (VOLUME_DOWN_SILENT.equals(key)) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index e94d6bd5ee99..1c8a26cc61d1 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -451,11 +451,11 @@ public class VolumeDialogImpl implements VolumeDialog {
toastText = R.string.volume_dialog_ringer_guidance_ring;
break;
case RINGER_MODE_SILENT:
- toastText = R.string.volume_dialog_ringer_guidance_silent;
+ toastText = com.android.internal.R.string.volume_dialog_ringer_guidance_silent;
break;
case RINGER_MODE_VIBRATE:
default:
- toastText = R.string.volume_dialog_ringer_guidance_vibrate;
+ toastText = com.android.internal.R.string.volume_dialog_ringer_guidance_vibrate;
}
Toast.makeText(mContext, toastText, Toast.LENGTH_SHORT).show();
diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk
index ebb088be8171..107ce1eecf2f 100644
--- a/packages/SystemUI/tests/Android.mk
+++ b/packages/SystemUI/tests/Android.mk
@@ -40,6 +40,7 @@ LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
LOCAL_STATIC_ANDROID_LIBRARIES := \
SystemUIPluginLib \
SystemUISharedLib \
+ android-support-car \
android-support-v4 \
android-support-v7-recyclerview \
android-support-v7-preference \
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java
index 8c4fd7386d6d..66836365705e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java
@@ -28,6 +28,9 @@ import static com.android.systemui.utils.os.FakeHandler.Mode.QUEUEING;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.os.Looper;
@@ -37,6 +40,7 @@ import android.view.Display;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.utils.os.FakeHandler;
import org.junit.Before;
@@ -54,14 +58,17 @@ public class DozeScreenStateTest extends SysuiTestCase {
FakeHandler mHandlerFake;
@Mock
DozeParameters mDozeParameters;
+ @Mock
+ WakeLock mWakeLock;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(true);
+ when(mDozeParameters.getAlwaysOn()).thenReturn(true);
mServiceFake = new DozeServiceFake();
mHandlerFake = new FakeHandler(Looper.getMainLooper());
- mScreen = new DozeScreenState(mServiceFake, mHandlerFake, mDozeParameters);
+ mScreen = new DozeScreenState(mServiceFake, mHandlerFake, mDozeParameters, mWakeLock);
}
@Test
@@ -142,4 +149,23 @@ public class DozeScreenStateTest extends SysuiTestCase {
assertFalse(mServiceFake.screenStateSet);
}
+ @Test
+ public void test_holdsWakeLockWhenGoingToLowPowerDelayed() {
+ // Transition to low power mode will be delayed to let
+ // animations play at 60 fps.
+ when(mDozeParameters.shouldControlScreenOff()).thenReturn(true);
+ mHandlerFake.setMode(QUEUEING);
+
+ mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
+ mHandlerFake.dispatchQueuedMessages();
+ reset(mWakeLock);
+
+ mScreen.transitionTo(INITIALIZED, DOZE_AOD);
+ verify(mWakeLock).acquire();
+ verify(mWakeLock, never()).release();
+
+ mHandlerFake.dispatchQueuedMessages();
+ verify(mWakeLock).release();
+ }
+
} \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
index 75ade9d603e5..0d8d9526f607 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
@@ -28,15 +28,20 @@ import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.os.Handler;
import android.os.HandlerThread;
+import android.os.PowerManager;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.wakelock.WakeLockFake;
@@ -46,33 +51,39 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class DozeUiTest extends SysuiTestCase {
+ @Mock
private AlarmManager mAlarmManager;
+ @Mock
private DozeMachine mMachine;
+ @Mock
+ private DozeParameters mDozeParameters;
+ @Mock
+ private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+ @Mock
+ private DozeHost mHost;
private WakeLockFake mWakeLock;
- private DozeHostFake mHost;
private Handler mHandler;
private HandlerThread mHandlerThread;
private DozeUi mDozeUi;
@Before
public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
mHandlerThread = new HandlerThread("DozeUiTest");
mHandlerThread.start();
- mAlarmManager = mock(AlarmManager.class);
- mMachine = mock(DozeMachine.class);
mWakeLock = new WakeLockFake();
- mHost = new DozeHostFake();
mHandler = mHandlerThread.getThreadHandler();
- DozeParameters params = mock(DozeParameters.class);
- when(params.getCanControlScreenOffAnimation()).thenReturn(true);
- when(params.getDisplayNeedsBlanking()).thenReturn(false);
- mDozeUi = new DozeUi(mContext, mAlarmManager, mMachine, mWakeLock, mHost, mHandler, params);
+ mDozeUi = new DozeUi(mContext, mAlarmManager, mMachine, mWakeLock, mHost, mHandler,
+ mDozeParameters, mKeyguardUpdateMonitor);
}
@After
@@ -96,18 +107,69 @@ public class DozeUiTest extends SysuiTestCase {
}
@Test
- public void propagatesAnimateScreenOff() {
- Assert.assertTrue("animateScreenOff should be true", mHost.animateScreenOff);
+ public void propagatesAnimateScreenOff_noAlwaysOn() {
+ reset(mHost);
+ when(mDozeParameters.getAlwaysOn()).thenReturn(false);
+ when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
+
+ mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false);
+ verify(mHost).setAnimateScreenOff(eq(false));
+ }
+
+ @Test
+ public void propagatesAnimateScreenOff_alwaysOn() {
+ reset(mHost);
+ when(mDozeParameters.getAlwaysOn()).thenReturn(true);
+ when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
+
+ // Take over when the keyguard is visible.
+ mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(true);
+ verify(mHost).setAnimateScreenOff(eq(true));
+
+ // Do not animate screen-off when keyguard isn't visible - PowerManager will do it.
+ mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false);
+ verify(mHost).setAnimateScreenOff(eq(false));
+ }
+
+ @Test
+ public void neverAnimateScreenOff_whenNotSupported() {
+ // Re-initialize DozeParameters saying that the display requires blanking.
+ reset(mDozeParameters);
+ reset(mHost);
+ when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(true);
+ mDozeUi = new DozeUi(mContext, mAlarmManager, mMachine, mWakeLock, mHost, mHandler,
+ mDozeParameters, mKeyguardUpdateMonitor);
+
+ // Never animate if display doesn't support it.
+ mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(true);
+ mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false);
+ verify(mHost, never()).setAnimateScreenOff(eq(false));
+ }
- DozeParameters params = mock(DozeParameters.class);
- new DozeUi(mContext, mAlarmManager, mMachine, mWakeLock, mHost, mHandler, params);
- Assert.assertFalse("animateScreenOff should be false", mHost.animateScreenOff);
+ @Test
+ public void transitionSetsAnimateWakeup_alwaysOn() {
+ when(mDozeParameters.getAlwaysOn()).thenReturn(true);
+ when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
+ mDozeUi.transitionTo(UNINITIALIZED, DOZE);
+ verify(mHost).setAnimateWakeup(eq(true));
+ }
+
+ @Test
+ public void keyguardVisibility_changesControlScreenOffAnimation() {
+ // Pre-condition
+ reset(mDozeParameters);
+ when(mDozeParameters.getAlwaysOn()).thenReturn(true);
+ when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
+
+ mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(false);
+ verify(mDozeParameters).setControlScreenOffAnimation(eq(false));
+ mDozeUi.getKeyguardCallback().onKeyguardVisibilityChanged(true);
+ verify(mDozeParameters).setControlScreenOffAnimation(eq(true));
}
@Test
- public void transitionSetsAnimateWakeup() {
- mHost.animateWakeup = false;
+ public void transitionSetsAnimateWakeup_noAlwaysOn() {
mDozeUi.transitionTo(UNINITIALIZED, DOZE);
- Assert.assertTrue("animateScreenOff should be true", mHost.animateWakeup);
+ verify(mHost).setAnimateWakeup(eq(false));
}
} \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java
index 2705bca042b4..5c80bb5ded9d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java
@@ -24,7 +24,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.IWallpaperManager;
-import android.os.Handler;
import android.os.RemoteException;
import android.support.test.filters.SmallTest;
@@ -37,7 +36,6 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@RunWith(JUnit4.class)
@@ -77,7 +75,7 @@ public class DozeWallpaperStateTest extends SysuiTestCase {
public void testAnimates_whenSupported() throws RemoteException {
// Pre-conditions
when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
- when(mDozeParameters.getCanControlScreenOffAnimation()).thenReturn(true);
+ when(mDozeParameters.shouldControlScreenOff()).thenReturn(true);
when(mDozeParameters.getAlwaysOn()).thenReturn(true);
mDozeWallpaperState.transitionTo(DozeMachine.State.UNINITIALIZED,
@@ -92,8 +90,8 @@ public class DozeWallpaperStateTest extends SysuiTestCase {
public void testDoesNotAnimate_whenNotSupported() throws RemoteException {
// Pre-conditions
when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(true);
- when(mDozeParameters.getCanControlScreenOffAnimation()).thenReturn(false);
when(mDozeParameters.getAlwaysOn()).thenReturn(true);
+ when(mDozeParameters.shouldControlScreenOff()).thenReturn(false);
mDozeWallpaperState.transitionTo(DozeMachine.State.UNINITIALIZED,
DozeMachine.State.DOZE_AOD);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java
index e15e0b4184f3..9eba9b894064 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java
@@ -18,6 +18,7 @@ package com.android.systemui.keyguard;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -99,6 +100,23 @@ public class WakefulnessLifecycleTest extends SysuiTestCase {
}
@Test
+ public void doesNotDispatchTwice() throws Exception {
+ mWakefulness.dispatchStartedWakingUp();
+ mWakefulness.dispatchStartedWakingUp();
+ mWakefulness.dispatchFinishedWakingUp();
+ mWakefulness.dispatchFinishedWakingUp();
+ mWakefulness.dispatchStartedGoingToSleep();
+ mWakefulness.dispatchStartedGoingToSleep();
+ mWakefulness.dispatchFinishedGoingToSleep();
+ mWakefulness.dispatchFinishedGoingToSleep();
+
+ verify(mWakefulnessObserver, times(1)).onStartedGoingToSleep();
+ verify(mWakefulnessObserver, times(1)).onFinishedGoingToSleep();
+ verify(mWakefulnessObserver, times(1)).onStartedWakingUp();
+ verify(mWakefulnessObserver, times(1)).onFinishedWakingUp();
+ }
+
+ @Test
public void dump() throws Exception {
mWakefulness.dump(null, new PrintWriter(new ByteArrayOutputStream()), new String[0]);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
index 34e444e9ad18..231a186686a0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
@@ -40,17 +40,22 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.function.Consumer;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class ExpandableNotificationRowTest extends SysuiTestCase {
private ExpandableNotificationRow mGroup;
private NotificationTestHelper mNotificationTestHelper;
+ boolean mHeadsUpAnimatingAway = false;
@Before
public void setUp() throws Exception {
mNotificationTestHelper = new NotificationTestHelper(mContext);
mGroup = mNotificationTestHelper.createGroup();
+ mGroup.setHeadsUpAnimatingAwayListener(
+ animatingAway -> mHeadsUpAnimatingAway = animatingAway);
}
@Test
@@ -195,4 +200,12 @@ public class ExpandableNotificationRowTest extends SysuiTestCase {
mGroup.getAppOpsOnClickListener().onClick(view);
verify(l, times(1)).onClick(any(), anyInt(), anyInt(), any());
}
+
+ @Test
+ public void testHeadsUpAnimatingAwayListener() {
+ mGroup.setHeadsUpAnimatingAway(true);
+ Assert.assertEquals(true, mHeadsUpAnimatingAway);
+ mGroup.setHeadsUpAnimatingAway(false);
+ Assert.assertEquals(false, mHeadsUpAnimatingAway);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
index b1e1c02a035f..2000bff7e99a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
@@ -60,6 +60,7 @@ public class NotificationDataTest extends SysuiTestCase {
private static final int UID_NORMAL = 123;
private static final int UID_ALLOW_DURING_SETUP = 456;
+ private static final String TEST_HIDDEN_NOTIFICATION_KEY = "testHiddenNotificationKey";
private final StatusBarNotification mMockStatusBarNotification =
mock(StatusBarNotification.class);
@@ -247,6 +248,22 @@ public class NotificationDataTest extends SysuiTestCase {
assertFalse(mNotificationData.shouldFilterOut(mRow.getEntry().notification));
}
+ @Test
+ public void testShouldFilterHiddenNotifications() {
+ // setup
+ when(mFsc.isSystemAlertWarningNeeded(anyInt(), anyString())).thenReturn(false);
+ when(mFsc.isSystemAlertNotification(any())).thenReturn(false);
+
+ // test should filter out hidden notifications:
+ // hidden
+ when(mMockStatusBarNotification.getKey()).thenReturn(TEST_HIDDEN_NOTIFICATION_KEY);
+ assertTrue(mNotificationData.shouldFilterOut(mMockStatusBarNotification));
+
+ // not hidden
+ when(mMockStatusBarNotification.getKey()).thenReturn("not hidden");
+ assertFalse(mNotificationData.shouldFilterOut(mMockStatusBarNotification));
+ }
+
private void initStatusBarNotification(boolean allowDuringSetup) {
Bundle bundle = new Bundle();
bundle.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, allowDuringSetup);
@@ -269,6 +286,21 @@ public class NotificationDataTest extends SysuiTestCase {
@Override
protected boolean getRanking(String key, NotificationListenerService.Ranking outRanking) {
super.getRanking(key, outRanking);
+ if (key.equals(TEST_HIDDEN_NOTIFICATION_KEY)) {
+ outRanking.populate(key, outRanking.getRank(),
+ outRanking.matchesInterruptionFilter(),
+ outRanking.getVisibilityOverride(), outRanking.getSuppressedVisualEffects(),
+ outRanking.getImportance(), outRanking.getImportanceExplanation(),
+ outRanking.getOverrideGroupKey(), outRanking.getChannel(), null, null,
+ outRanking.canShowBadge(), outRanking.getUserSentiment(), true);
+ } else {
+ outRanking.populate(key, outRanking.getRank(),
+ outRanking.matchesInterruptionFilter(),
+ outRanking.getVisibilityOverride(), outRanking.getSuppressedVisualEffects(),
+ outRanking.getImportance(), outRanking.getImportanceExplanation(),
+ outRanking.getOverrideGroupKey(), outRanking.getChannel(), null, null,
+ outRanking.canShowBadge(), outRanking.getUserSentiment(), false);
+ }
return true;
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java
index 7e5db344629c..3703d6ad2b83 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java
@@ -140,7 +140,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
0,
NotificationManager.IMPORTANCE_DEFAULT,
null, null,
- null, null, null, true, sentiment);
+ null, null, null, true, sentiment, false);
return true;
}).when(mRankingMap).getRanking(eq(key), any(NotificationListenerService.Ranking.class));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
index e89ff9733388..550a35dc9ffc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
@@ -16,11 +16,15 @@
package com.android.systemui.statusbar.phone;
+import android.content.Context;
+import android.os.PowerManager;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters.IntInOutMatcher;
+
+import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -28,6 +32,14 @@ import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class DozeParametersTest extends SysuiTestCase {
@@ -186,4 +198,38 @@ public class DozeParametersTest extends SysuiTestCase {
}
}
+ @Test
+ public void test_setControlScreenOffAnimation_setsDozeAfterScreenOff_false() {
+ TestableDozeParameters dozeParameters = new TestableDozeParameters(getContext());
+ PowerManager mockedPowerManager = dozeParameters.getPowerManager();
+ dozeParameters.setControlScreenOffAnimation(true);
+ reset(mockedPowerManager);
+ dozeParameters.setControlScreenOffAnimation(false);
+ verify(mockedPowerManager).setDozeAfterScreenOff(eq(true));
+ }
+
+ @Test
+ public void test_setControlScreenOffAnimation_setsDozeAfterScreenOff_true() {
+ TestableDozeParameters dozeParameters = new TestableDozeParameters(getContext());
+ PowerManager mockedPowerManager = dozeParameters.getPowerManager();
+ dozeParameters.setControlScreenOffAnimation(false);
+ reset(mockedPowerManager);
+ dozeParameters.setControlScreenOffAnimation(true);
+ verify(dozeParameters.getPowerManager()).setDozeAfterScreenOff(eq(false));
+ }
+
+ private class TestableDozeParameters extends DozeParameters {
+ private PowerManager mPowerManager;
+
+ TestableDozeParameters(Context context) {
+ super(context);
+ mPowerManager = mock(PowerManager.class);
+ }
+
+ @Override
+ protected PowerManager getPowerManager() {
+ return mPowerManager;
+ }
+ }
+
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java
index ca2f713d2b6f..203ebe6d5132 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java
@@ -34,18 +34,23 @@ import com.android.systemui.doze.DozeHost;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@SmallTest
public class DozeScrimControllerTest extends SysuiTestCase {
+ @Mock
private ScrimController mScrimController;
+ @Mock
+ private DozeParameters mDozeParameters;
private DozeScrimController mDozeScrimController;
@Before
public void setup() {
- mScrimController = mock(ScrimController.class);
+ MockitoAnnotations.initMocks(this);
// Make sure callbacks will be invoked to complete the lifecycle.
doAnswer(invocationOnMock -> {
ScrimController.Callback callback = invocationOnMock.getArgument(1);
@@ -56,7 +61,8 @@ public class DozeScrimControllerTest extends SysuiTestCase {
}).when(mScrimController).transitionTo(any(ScrimState.class),
any(ScrimController.Callback.class));
- mDozeScrimController = new DozeScrimController(mScrimController, getContext());
+ mDozeScrimController = new DozeScrimController(mScrimController, getContext(),
+ mDozeParameters);
mDozeScrimController.setDozing(true);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
new file mode 100644
index 000000000000..7a61bfef3716
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyObject;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.TestableDependency;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.HeadsUpStatusBarView;
+import com.android.systemui.statusbar.NotificationTestHelper;
+import com.android.systemui.statusbar.policy.DarkIconDispatcher;
+import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.HashSet;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class HeadsUpAppearanceControllerTest extends SysuiTestCase {
+
+ private final NotificationStackScrollLayout mStackScroller =
+ mock(NotificationStackScrollLayout.class);
+ private final NotificationPanelView mPanelView = mock(NotificationPanelView.class);
+ private final DarkIconDispatcher mDarkIconDispatcher = mock(DarkIconDispatcher.class);
+ private HeadsUpAppearanceController mHeadsUpAppearanceController;
+ private ExpandableNotificationRow mFirst;
+ private HeadsUpStatusBarView mHeadsUpStatusBarView;
+ private HeadsUpManagerPhone mHeadsUpManager;
+
+ @Before
+ public void setUp() throws Exception {
+ NotificationTestHelper testHelper = new NotificationTestHelper(getContext());
+ mFirst = testHelper.createRow();
+ mDependency.injectTestDependency(DarkIconDispatcher.class, mDarkIconDispatcher);
+ mHeadsUpStatusBarView = new HeadsUpStatusBarView(mContext, mock(View.class),
+ mock(TextView.class));
+ mHeadsUpManager = mock(HeadsUpManagerPhone.class);
+ mHeadsUpAppearanceController = new HeadsUpAppearanceController(
+ mock(NotificationIconAreaController.class),
+ mHeadsUpManager,
+ mHeadsUpStatusBarView,
+ mStackScroller,
+ mPanelView,
+ new View(mContext));
+ mHeadsUpAppearanceController.setExpandedHeight(0.0f, 0.0f);
+ }
+
+ @Test
+ public void testShowinEntryUpdated() {
+ mFirst.setPinned(true);
+ when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
+ when(mHeadsUpManager.getTopEntry()).thenReturn(mFirst.getEntry());
+ mHeadsUpAppearanceController.onHeadsUpPinned(mFirst);
+ Assert.assertEquals(mFirst.getEntry(), mHeadsUpStatusBarView.getShowingEntry());
+
+ mFirst.setPinned(false);
+ when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
+ mHeadsUpAppearanceController.onHeadsUpUnPinned(mFirst);
+ Assert.assertEquals(null, mHeadsUpStatusBarView.getShowingEntry());
+ }
+
+ @Test
+ public void testShownUpdated() {
+ mFirst.setPinned(true);
+ when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
+ when(mHeadsUpManager.getTopEntry()).thenReturn(mFirst.getEntry());
+ mHeadsUpAppearanceController.onHeadsUpPinned(mFirst);
+ Assert.assertTrue(mHeadsUpAppearanceController.isShown());
+
+ mFirst.setPinned(false);
+ when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
+ mHeadsUpAppearanceController.onHeadsUpUnPinned(mFirst);
+ Assert.assertFalse(mHeadsUpAppearanceController.isShown());
+ }
+
+ @Test
+ public void testHeaderUpdated() {
+ mFirst.setPinned(true);
+ when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
+ when(mHeadsUpManager.getTopEntry()).thenReturn(mFirst.getEntry());
+ mHeadsUpAppearanceController.onHeadsUpPinned(mFirst);
+ Assert.assertEquals(mFirst.getHeaderVisibleAmount(), 0.0f, 0.0f);
+
+ mFirst.setPinned(false);
+ when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
+ mHeadsUpAppearanceController.onHeadsUpUnPinned(mFirst);
+ Assert.assertEquals(mFirst.getHeaderVisibleAmount(), 1.0f, 0.0f);
+ }
+
+ @Test
+ public void testDestroy() {
+ reset(mHeadsUpManager);
+ reset(mDarkIconDispatcher);
+ reset(mPanelView);
+ reset(mStackScroller);
+ mHeadsUpAppearanceController.destroy();
+ verify(mHeadsUpManager).removeListener(any());
+ verify(mDarkIconDispatcher).removeDarkReceiver((DarkIconDispatcher.DarkReceiver) any());
+ verify(mPanelView).removeVerticalTranslationListener(any());
+ verify(mPanelView).removeTrackingHeadsUpListener(any());
+ verify(mPanelView).setHeadsUpAppearanceController(any());
+ verify(mStackScroller).removeOnExpandedHeightListener(any());
+ verify(mStackScroller).removeOnLayoutChangeListener(any());
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index f3a8417ff547..a37947df7094 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -22,8 +22,6 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.calls;
-import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
@@ -238,9 +236,19 @@ public class KeyguardBouncerTest extends SysuiTestCase {
}
@Test
- public void testIsShowing() {
+ public void testIsShowing_animated() {
Assert.assertFalse("Show wasn't invoked yet", mBouncer.isShowing());
- mBouncer.show(true);
+ mBouncer.show(true /* reset */);
+ Assert.assertTrue("Should be showing", mBouncer.isShowing());
+ }
+
+ @Test
+ public void testIsShowing_forSwipeUp() {
+ mBouncer.setExpansion(1f);
+ mBouncer.show(true /* reset */, false /* animated */);
+ Assert.assertFalse("Should only be showing after collapsing notification panel",
+ mBouncer.isShowing());
+ mBouncer.setExpansion(0f);
Assert.assertTrue("Should be showing", mBouncer.isShowing());
}
@@ -269,6 +277,25 @@ public class KeyguardBouncerTest extends SysuiTestCase {
}
@Test
+ public void testIsHiding_preHideOrHide() {
+ Assert.assertFalse("Should not be hiding on initial state", mBouncer.isAnimatingAway());
+ mBouncer.startPreHideAnimation(null /* runnable */);
+ Assert.assertTrue("Should be hiding during pre-hide", mBouncer.isAnimatingAway());
+ mBouncer.hide(false /* destroyView */);
+ Assert.assertFalse("Should be hidden after hide()", mBouncer.isAnimatingAway());
+ }
+
+ @Test
+ public void testIsHiding_skipsTranslation() {
+ mBouncer.show(false /* reset */);
+ reset(mKeyguardHostView);
+ mBouncer.startPreHideAnimation(null /* runnable */);
+ mBouncer.setExpansion(0.5f);
+ verify(mKeyguardHostView, never()).setTranslationY(anyFloat());
+ verify(mKeyguardHostView, never()).setAlpha(anyFloat());
+ }
+
+ @Test
public void testIsSecure() {
Assert.assertTrue("Bouncer is secure before inflating views", mBouncer.isSecure());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index d32c9a8e5649..45845fc147a6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -64,7 +64,6 @@ public class ScrimControllerTest extends SysuiTestCase {
private SynchronousScrimController mScrimController;
private ScrimView mScrimBehind;
private ScrimView mScrimInFront;
- private View mHeadsUpScrim;
private Consumer<Integer> mScrimVisibilityCallback;
private int mScrimVisibility;
private LightBarController mLightBarController;
@@ -78,7 +77,6 @@ public class ScrimControllerTest extends SysuiTestCase {
mLightBarController = mock(LightBarController.class);
mScrimBehind = new ScrimView(getContext());
mScrimInFront = new ScrimView(getContext());
- mHeadsUpScrim = new View(getContext());
mWakeLock = mock(WakeLock.class);
mAlarmManager = mock(AlarmManager.class);
mAlwaysOnEnabled = true;
@@ -87,7 +85,7 @@ public class ScrimControllerTest extends SysuiTestCase {
when(mDozeParamenters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled);
when(mDozeParamenters.getDisplayNeedsBlanking()).thenReturn(true);
mScrimController = new SynchronousScrimController(mLightBarController, mScrimBehind,
- mScrimInFront, mHeadsUpScrim, mScrimVisibilityCallback, mDozeParamenters,
+ mScrimInFront, mScrimVisibilityCallback, mDozeParamenters,
mAlarmManager);
}
@@ -349,7 +347,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
- public void testWillHideAoDWallpaper() {
+ public void testWillHideAodWallpaper() {
mScrimController.setWallpaperSupportsAmbientMode(true);
mScrimController.transitionTo(ScrimState.AOD);
verify(mAlarmManager).setExact(anyInt(), anyLong(), any(), any(), any());
@@ -415,56 +413,6 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
- public void testHeadsUpScrimOpacity() {
- mScrimController.setPanelExpansion(0f);
- mScrimController.onHeadsUpPinned(null /* row */);
- mScrimController.finishAnimationsImmediately();
-
- Assert.assertNotEquals("Heads-up scrim should be visible", 0f,
- mHeadsUpScrim.getAlpha(), 0.01f);
-
- mScrimController.onHeadsUpUnPinned(null /* row */);
- mScrimController.finishAnimationsImmediately();
-
- Assert.assertEquals("Heads-up scrim should have disappeared", 0f,
- mHeadsUpScrim.getAlpha(), 0.01f);
- }
-
- @Test
- public void testHeadsUpScrimCounting() {
- mScrimController.setPanelExpansion(0f);
- mScrimController.onHeadsUpPinned(null /* row */);
- mScrimController.onHeadsUpPinned(null /* row */);
- mScrimController.onHeadsUpPinned(null /* row */);
- mScrimController.finishAnimationsImmediately();
-
- Assert.assertNotEquals("Heads-up scrim should be visible", 0f,
- mHeadsUpScrim.getAlpha(), 0.01f);
-
- mScrimController.onHeadsUpUnPinned(null /* row */);
- mScrimController.finishAnimationsImmediately();
-
- Assert.assertEquals("Heads-up scrim should only disappear when counter reaches 0", 1f,
- mHeadsUpScrim.getAlpha(), 0.01f);
-
- mScrimController.onHeadsUpUnPinned(null /* row */);
- mScrimController.onHeadsUpUnPinned(null /* row */);
- mScrimController.finishAnimationsImmediately();
- Assert.assertEquals("Heads-up scrim should have disappeared", 0f,
- mHeadsUpScrim.getAlpha(), 0.01f);
- }
-
- @Test
- public void testNoHeadsUpScrimExpanded() {
- mScrimController.setPanelExpansion(1f);
- mScrimController.onHeadsUpPinned(null /* row */);
- mScrimController.finishAnimationsImmediately();
-
- Assert.assertEquals("Heads-up scrim should not be visible when shade is expanded", 0f,
- mHeadsUpScrim.getAlpha(), 0.01f);
- }
-
- @Test
public void testScrimFocus() {
mScrimController.transitionTo(ScrimState.AOD);
Assert.assertFalse("Should not be focusable on AOD", mScrimBehind.isFocusable());
@@ -540,16 +488,23 @@ public class ScrimControllerTest extends SysuiTestCase {
private FakeHandler mHandler;
private boolean mAnimationCancelled;
+ boolean mOnPreDrawCalled;
SynchronousScrimController(LightBarController lightBarController,
- ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim,
+ ScrimView scrimBehind, ScrimView scrimInFront,
Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
AlarmManager alarmManager) {
- super(lightBarController, scrimBehind, scrimInFront, headsUpScrim,
+ super(lightBarController, scrimBehind, scrimInFront,
scrimVisibleListener, dozeParameters, alarmManager);
mHandler = new FakeHandler(Looper.myLooper());
}
+ @Override
+ public boolean onPreDraw() {
+ mOnPreDrawCalled = true;
+ return super.onPreDraw();
+ }
+
void finishAnimationsImmediately() {
boolean[] animationFinished = {false};
setOnAnimationFinished(()-> animationFinished[0] = true);
@@ -562,7 +517,6 @@ public class ScrimControllerTest extends SysuiTestCase {
// Force finish all animations.
endAnimation(mScrimBehind, TAG_KEY_ANIM);
endAnimation(mScrimInFront, TAG_KEY_ANIM);
- endAnimation(mHeadsUpScrim, TAG_KEY_ANIM);
if (!animationFinished[0]) {
throw new IllegalStateException("Animation never finished");
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java
index 7ca9d73a230e..f76de5a03d2d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java
@@ -19,11 +19,15 @@ package com.android.systemui.statusbar.policy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
@@ -32,6 +36,9 @@ import android.content.Intent;
import android.content.pm.StringParceledListSlice;
import android.content.pm.UserInfo;
import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
import android.os.UserManager;
import android.security.IKeyChainService;
import android.support.test.runner.AndroidJUnit4;
@@ -61,6 +68,7 @@ public class SecurityControllerTest extends SysuiTestCase implements SecurityCon
private final UserManager mUserManager = mock(UserManager.class);
private SecurityControllerImpl mSecurityController;
private CountDownLatch mStateChangedLatch;
+ private ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class);
// implementing SecurityControllerCallback
@Override
@@ -72,7 +80,7 @@ public class SecurityControllerTest extends SysuiTestCase implements SecurityCon
public void setUp() throws Exception {
mContext.addMockSystemService(Context.DEVICE_POLICY_SERVICE, mDevicePolicyManager);
mContext.addMockSystemService(Context.USER_SERVICE, mUserManager);
- mContext.addMockSystemService(Context.CONNECTIVITY_SERVICE, mock(ConnectivityManager.class));
+ mContext.addMockSystemService(Context.CONNECTIVITY_SERVICE, mConnectivityManager);
Intent intent = new Intent(IKeyChainService.class.getName());
ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0);
@@ -176,4 +184,12 @@ public class SecurityControllerTest extends SysuiTestCase implements SecurityCon
//assertTrue(mStateChangedLatch.await(31, TimeUnit.SECONDS));
//assertFalse(mSecurityController.hasCACertInCurrentUser());
}
+
+ @Test
+ public void testNetworkRequest() {
+ verify(mConnectivityManager, times(1)).registerNetworkCallback(argThat(
+ (NetworkRequest request) -> request.networkCapabilities.getUids() == null
+ && request.networkCapabilities.getCapabilities().length == 0
+ ), any(NetworkCallback.class));
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationRoundnessManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationRoundnessManagerTest.java
new file mode 100644
index 000000000000..28d1aff7f983
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationRoundnessManagerTest.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.stack;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyFloat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeast;
+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 static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.View;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.ActivatableNotificationView;
+import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.NotificationTestHelper;
+import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.phone.ScrimController;
+import com.android.systemui.statusbar.phone.StatusBar;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.HashSet;
+import java.util.function.Consumer;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class NotificationRoundnessManagerTest extends SysuiTestCase {
+
+ private NotificationRoundnessManager mRoundnessManager = new NotificationRoundnessManager();
+ private HashSet<View> mAnimatedChildren = new HashSet<>();
+ private Runnable mRoundnessCallback = mock(Runnable.class);
+ private ExpandableNotificationRow mFirst;
+ private ExpandableNotificationRow mSecond;
+
+ @Before
+ public void setUp() throws Exception {
+ NotificationTestHelper testHelper = new NotificationTestHelper(getContext());
+ mFirst = testHelper.createRow();
+ mFirst.setHeadsUpAnimatingAwayListener(animatingAway
+ -> mRoundnessManager.onHeadsupAnimatingAwayChanged(mFirst, animatingAway));
+ mSecond = testHelper.createRow();
+ mSecond.setHeadsUpAnimatingAwayListener(animatingAway
+ -> mRoundnessManager.onHeadsupAnimatingAwayChanged(mSecond, animatingAway));
+ mRoundnessManager.setOnRoundingChangedCallback(mRoundnessCallback);
+ mRoundnessManager.setAnimatedChildren(mAnimatedChildren);
+ mRoundnessManager.setFirstAndLastBackgroundChild(mFirst, mFirst);
+ mRoundnessManager.setExpanded(1.0f, 1.0f);
+ }
+
+ @Test
+ public void testCallbackCalledWhenSecondChanged() {
+ mRoundnessManager.setFirstAndLastBackgroundChild(mFirst, mSecond);
+ verify(mRoundnessCallback, atLeast(1)).run();
+ }
+
+ @Test
+ public void testCallbackCalledWhenFirstChanged() {
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mFirst);
+ verify(mRoundnessCallback, atLeast(1)).run();
+ }
+
+ @Test
+ public void testRoundnessSetOnLast() {
+ mRoundnessManager.setFirstAndLastBackgroundChild(mFirst, mSecond);
+ Assert.assertEquals(1.0f, mSecond.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(0.0f, mSecond.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
+ public void testRoundnessSetOnNew() {
+ mRoundnessManager.setFirstAndLastBackgroundChild(mFirst, null);
+ Assert.assertEquals(0.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(1.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
+ public void testCompleteReplacement() {
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mSecond);
+ Assert.assertEquals(0.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(0.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
+ public void testNotCalledWhenRemoved() {
+ mFirst.setRemoved();
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mSecond);
+ Assert.assertEquals(1.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(1.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
+ public void testRoundedWhenPinnedAndCollapsed() {
+ mFirst.setPinned(true);
+ mRoundnessManager.setExpanded(0.0f /* expandedHeight */, 0.0f /* appearFraction */);
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mSecond);
+ Assert.assertEquals(1.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(1.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
+ public void testRoundedWhenGoingAwayAndCollapsed() {
+ mFirst.setHeadsUpAnimatingAway(true);
+ mRoundnessManager.setExpanded(0.0f /* expandedHeight */, 0.0f /* appearFraction */);
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mSecond);
+ Assert.assertEquals(1.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(1.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
+ public void testRoundedNormalRoundingWhenExpanded() {
+ mFirst.setHeadsUpAnimatingAway(true);
+ mRoundnessManager.setExpanded(1.0f /* expandedHeight */, 0.0f /* appearFraction */);
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mSecond);
+ Assert.assertEquals(0.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(0.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
+ public void testTrackingHeadsUpRoundedIfPushingUp() {
+ mRoundnessManager.setExpanded(1.0f /* expandedHeight */, -0.5f /* appearFraction */);
+ mRoundnessManager.setTrackingHeadsUp(mFirst);
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mSecond);
+ Assert.assertEquals(1.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(1.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
+ public void testTrackingHeadsUpNotRoundedIfPushingDown() {
+ mRoundnessManager.setExpanded(1.0f /* expandedHeight */, 0.5f /* appearFraction */);
+ mRoundnessManager.setTrackingHeadsUp(mFirst);
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mSecond);
+ Assert.assertEquals(0.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(0.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+
+ @Test
+ public void testRoundingUpdatedWhenAnimatingAwayTrue() {
+ mRoundnessManager.setExpanded(0.0f, 0.0f);
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mSecond);
+ mFirst.setHeadsUpAnimatingAway(true);
+ Assert.assertEquals(1.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(1.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+
+
+ @Test
+ public void testRoundingUpdatedWhenAnimatingAwayFalse() {
+ mRoundnessManager.setExpanded(0.0f, 0.0f);
+ mRoundnessManager.setFirstAndLastBackgroundChild(mSecond, mSecond);
+ mFirst.setHeadsUpAnimatingAway(true);
+ mFirst.setHeadsUpAnimatingAway(false);
+ Assert.assertEquals(0.0f, mFirst.getCurrentBottomRoundness(), 0.0f);
+ Assert.assertEquals(0.0f, mFirst.getCurrentTopRoundness(), 0.0f);
+ }
+}
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 0cc60e3146d7..9417f04bbf50 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -3964,7 +3964,8 @@ message MetricsEvent {
// Type TYPE_FAILURE: The request failed
// Package: Package of app that is autofilled
// Tag FIELD_AUTOFILL_SERVICE: Package of service that processed the request
- // Tag FIELD_AUTOFILL_NUM_DATASETS: The number of datasets returned (only in success case)
+ // Tag FIELD_AUTOFILL_NUM_DATASETS: The number of datasets returned in the response, or -1 if
+ // the service returned a null response.
// NOTE: starting on OS P, it also added:
// Type TYPE_CLOSE: Service returned a null response.
// Tag FIELD_AUTOFILL_NUM_FIELD_CLASSIFICATION_IDS: if service requested field classification,
@@ -5541,6 +5542,11 @@ message MetricsEvent {
// OS: P
FIELD_ANOMALY_TYPE = 1366;
+ // ACTION: Settings > Anomaly receiver > Anomaly received
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_ANOMALY_TRIGGERED = 1367;
+
// ---- End P Constants, all P 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 0763fa129f65..39d007092d6c 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -1134,14 +1134,38 @@ message SoftApConnectedClientsEvent {
NUM_CLIENTS_CHANGED = 2;
}
+ // Soft AP channel bandwidth types
+ enum ChannelBandwidth {
+
+ BANDWIDTH_INVALID = 0;
+
+ BANDWIDTH_20_NOHT = 1;
+
+ BANDWIDTH_20 = 2;
+
+ BANDWIDTH_40 = 3;
+
+ BANDWIDTH_80 = 4;
+
+ BANDWIDTH_80P80 = 5;
+
+ BANDWIDTH_160 = 6;
+ }
+
// Type of event being recorded
optional SoftApEventType event_type = 1;
- // Absolute time when event happened
+ // Time passed since last boot in milliseconds
optional int64 time_stamp_millis = 2;
// Number of connected clients if event_type is NUM_CLIENTS_CHANGED, otherwise zero.
optional int32 num_connected_clients = 3;
+
+ // Channel frequency used for Soft AP
+ optional int32 channel_frequency = 4;
+
+ // Channel bandwidth used for Soft AP
+ optional ChannelBandwidth channel_bandwidth = 5;
}
// Wps connection metrics
diff --git a/services/art-profile b/services/art-profile
index d2cde029b490..93e580af759a 100644
--- a/services/art-profile
+++ b/services/art-profile
@@ -10677,7 +10677,6 @@ PLcom/android/server/location/ContextHubService;->sendMessage(IILandroid/hardwar
PLcom/android/server/location/CountryDetectorBase;-><init>(Landroid/content/Context;)V
PLcom/android/server/location/CountryDetectorBase;->notifyListener(Landroid/location/Country;)V
PLcom/android/server/location/CountryDetectorBase;->setCountryListener(Landroid/location/CountryListener;)V
-PLcom/android/server/location/FlpHardwareProvider;->isSupported()Z
PLcom/android/server/location/GeocoderProxy;-><init>(Landroid/content/Context;IIILandroid/os/Handler;)V
PLcom/android/server/location/GeocoderProxy;->bind()Z
PLcom/android/server/location/GeocoderProxy;->createAndBind(Landroid/content/Context;IIILandroid/os/Handler;)Lcom/android/server/location/GeocoderProxy;
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index a5339e0e6549..009e723d61ce 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -80,6 +80,7 @@ import com.android.internal.util.Preconditions;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
+import com.android.server.autofill.AutofillManagerService.PackageCompatState;
import com.android.server.autofill.ui.AutoFillUI;
import java.io.FileDescriptor;
@@ -108,10 +109,6 @@ public final class AutofillManagerService extends SystemService {
private static final char COMPAT_PACKAGE_URL_IDS_BLOCK_BEGIN = '[';
private static final char COMPAT_PACKAGE_URL_IDS_BLOCK_END = ']';
- // TODO(b/74445943): temporary work around until P Development Preview 3 is branched
- private static final List<String> DEFAULT_BUTTONS = Arrays.asList("url_bar",
- "location_bar_edit_text");
-
private final Context mContext;
private final AutoFillUI mUi;
@@ -575,7 +572,7 @@ public final class AutofillManagerService extends SystemService {
private String getWhitelistedCompatModePackagesFromSettings() {
return Settings.Global.getString(
mContext.getContentResolver(),
- Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES);
+ Settings.Global.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES);
}
@Nullable
@@ -600,7 +597,7 @@ public final class AutofillManagerService extends SystemService {
final List<String> urlBarIds;
if (urlBlockIndex == -1) {
packageName = packageBlock;
- urlBarIds = DEFAULT_BUTTONS; // TODO(b/74445943): back to null
+ urlBarIds = null;
} else {
if (packageBlock.charAt(packageBlock.length() - 1)
!= COMPAT_PACKAGE_URL_IDS_BLOCK_END) {
@@ -655,7 +652,7 @@ public final class AutofillManagerService extends SystemService {
/**
* Compatibility mode metadata per package.
*/
- private static final class PackageCompatState {
+ static final class PackageCompatState {
private final long maxVersionCode;
private final String[] urlBarResourceIds;
@@ -666,8 +663,8 @@ public final class AutofillManagerService extends SystemService {
@Override
public String toString() {
- return "PackageCompatState: [maxVersionCode=" + maxVersionCode
- + ", urlBarResourceIds=" + Arrays.toString(urlBarResourceIds) + "]";
+ return "maxVersionCode=" + maxVersionCode
+ + ", urlBarResourceIds=" + Arrays.toString(urlBarResourceIds);
}
}
@@ -756,6 +753,25 @@ public final class AutofillManagerService extends SystemService {
}
}
}
+
+ private void dump(String prefix, PrintWriter pw) {
+ if (mUserSpecs == null) {
+ pw.println("N/A");
+ return;
+ }
+ pw.println();
+ final String prefix2 = prefix + " ";
+ for (int i = 0; i < mUserSpecs.size(); i++) {
+ final int user = mUserSpecs.keyAt(i);
+ pw.print(prefix); pw.print("User: "); pw.println(user);
+ final ArrayMap<String,PackageCompatState> perUser = mUserSpecs.get(i);
+ for (int j = 0; j < perUser.size(); j++) {
+ final String packageName = perUser.keyAt(j);
+ final PackageCompatState state = perUser.valueAt(j);
+ pw.print(prefix2); pw.print(packageName); pw.print(": "); pw.println(state);
+ }
+ }
+ }
}
final class AutoFillManagerServiceStub extends IAutoFillManager.Stub {
@@ -1121,6 +1137,7 @@ public final class AutofillManagerService extends SystemService {
boolean oldDebug = sDebug;
final String prefix = " ";
+ final String prefix2 = " ";
try {
synchronized (mLock) {
oldDebug = sDebug;
@@ -1145,8 +1162,8 @@ public final class AutofillManagerService extends SystemService {
}
mUi.dump(pw);
pw.print("Autofill Compat State: ");
- pw.println(mAutofillCompatState.mUserSpecs);
- pw.print(prefix); pw.print("from settings: ");
+ mAutofillCompatState.dump(prefix2, pw);
+ pw.print(prefix2); pw.print("from settings: ");
pw.println(getWhitelistedCompatModePackagesFromSettings());
}
if (showHistory) {
@@ -1179,7 +1196,7 @@ public final class AutofillManagerService extends SystemService {
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.USER_SETUP_COMPLETE), false, this, UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES), false, this,
+ Settings.Global.AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES), false, this,
UserHandle.USER_ALL);
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 54ea3ba4546b..ef0d7e6b5727 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -1189,7 +1189,7 @@ final class AutofillManagerServiceImpl {
boolean isFieldClassificationEnabledLocked() {
return Settings.Secure.getIntForUser(
mContext.getContentResolver(),
- Settings.Secure.AUTOFILL_FEATURE_FIELD_CLASSIFICATION, 0,
+ Settings.Secure.AUTOFILL_FEATURE_FIELD_CLASSIFICATION, 1,
mUserId) == 1;
}
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index 5c41f3f869ce..7bb532ebc8d7 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -26,6 +26,7 @@ import android.service.autofill.Dataset;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
+import android.view.WindowManager;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;
@@ -107,6 +108,13 @@ public final class Helper {
}
@NonNull
+ public static String paramsToString(@NonNull WindowManager.LayoutParams params) {
+ final StringBuilder builder = new StringBuilder(25);
+ params.dumpDimensions(builder);
+ return builder.toString();
+ }
+
+ @NonNull
static ArrayMap<AutofillId, AutofillValue> getFields(@NonNull Dataset dataset) {
final ArrayList<AutofillId> ids = dataset.getFieldIds();
final ArrayList<AutofillValue> values = dataset.getFieldValues();
@@ -128,7 +136,7 @@ public final class Helper {
return log;
}
- public static void printlnRedactedText(@NonNull PrintWriter pw, @Nullable String text) {
+ public static void printlnRedactedText(@NonNull PrintWriter pw, @Nullable CharSequence text) {
if (text == null) {
pw.println("null");
} else {
@@ -173,6 +181,7 @@ public final class Helper {
* @param structure Assist structure
* @param urlBarIds list of ids; only the first id found will be sanitized.
*/
+ @Nullable
public static void sanitizeUrlBar(@NonNull AssistStructure structure,
@NonNull String[] urlBarIds) {
final ViewNode urlBarNode = findViewNode(structure, (node) -> {
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 755fc54fb6d6..1e1de35a3a43 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -596,6 +596,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
if (response == null) {
processNullResponseLocked(requestFlags);
+ mMetricsLogger.write(newLogMaker(MetricsEvent.AUTOFILL_REQUEST, servicePackageName)
+ .setType(MetricsEvent.TYPE_SUCCESS)
+ .addTaggedData(MetricsEvent.FIELD_AUTOFILL_NUM_DATASETS, -1));
return;
}
@@ -1438,11 +1441,25 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillValue filledValue = viewState.getAutofilledValue();
if (!value.equals(filledValue)) {
- if (sDebug) {
- Slog.d(TAG, "found a change on required " + id + ": " + filledValue
- + " => " + value);
+ boolean changed = true;
+ if (filledValue == null) {
+ // Dataset was not autofilled, make sure initial value didn't change.
+ final AutofillValue initialValue = getValueFromContextsLocked(id);
+ if (initialValue != null && initialValue.equals(value)) {
+ if (sDebug) {
+ Slog.d(TAG, "id " + id + " is part of dataset but initial value "
+ + "didn't change: " + value);
+ }
+ changed = false;
+ }
+ }
+ if (changed) {
+ if (sDebug) {
+ Slog.d(TAG, "found a change on required " + id + ": " + filledValue
+ + " => " + value);
+ }
+ atLeastOneChanged = true;
}
- atLeastOneChanged = true;
}
}
}
@@ -2060,8 +2077,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (saveTriggerId != null) {
writeLog(MetricsEvent.AUTOFILL_EXPLICIT_SAVE_TRIGGER_DEFINITION);
}
- saveOnAllViewsInvisible =
- (saveInfo.getFlags() & SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE) != 0;
+ int flags = saveInfo.getFlags();
+ if (mCompatMode) {
+ flags |= SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE;
+ }
+ saveOnAllViewsInvisible = (flags & SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE) != 0;
// We only need to track views if we want to save once they become invisible.
if (saveOnAllViewsInvisible) {
diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java
index 0dbdc13e429b..03c5850fbda1 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -206,29 +206,51 @@ final class ViewState {
@Override
public String toString() {
- return "ViewState: [id=" + id + ", datasetId=" + mDatasetId
- + ", currentValue=" + mCurrentValue
- + ", autofilledValue=" + mAutofilledValue
- + ", bounds=" + mVirtualBounds + ", state=" + getStateAsString() + "]";
+ final StringBuilder builder = new StringBuilder("ViewState: [id=").append(id);
+ if (mDatasetId != null) {
+ builder.append("datasetId:" ).append(mDatasetId);
+ }
+ builder.append("state:" ).append(getStateAsString());
+ if (mCurrentValue != null) {
+ builder.append("currentValue:" ).append(mCurrentValue);
+ }
+ if (mAutofilledValue != null) {
+ builder.append("autofilledValue:" ).append(mAutofilledValue);
+ }
+ if (mSanitizedValue != null) {
+ builder.append("sanitizedValue:" ).append(mSanitizedValue);
+ }
+ if (mVirtualBounds != null) {
+ builder.append("virtualBounds:" ).append(mVirtualBounds);
+ }
+ return builder.toString();
}
void dump(String prefix, PrintWriter pw) {
- pw.print(prefix); pw.print("id:" ); pw.println(this.id);
- pw.print(prefix); pw.print("datasetId:" ); pw.println(this.mDatasetId);
+ pw.print(prefix); pw.print("id:" ); pw.println(id);
+ if (mDatasetId != null) {
+ pw.print(prefix); pw.print("datasetId:" ); pw.println(mDatasetId);
+ }
pw.print(prefix); pw.print("state:" ); pw.println(getStateAsString());
- pw.print(prefix); pw.print("response:");
- if (mResponse == null) {
- pw.println("N/A");
- } else {
+ if (mResponse != null) {
+ pw.print(prefix); pw.print("response:");
if (sVerbose) {
pw.println(mResponse);
} else {
- pw.println(mResponse.getRequestId());
+ pw.print("id=");pw.println(mResponse.getRequestId());
}
}
- pw.print(prefix); pw.print("currentValue:" ); pw.println(mCurrentValue);
- pw.print(prefix); pw.print("autofilledValue:" ); pw.println(mAutofilledValue);
- pw.print(prefix); pw.print("sanitizedValue:" ); pw.println(mSanitizedValue);
- pw.print(prefix); pw.print("virtualBounds:" ); pw.println(mVirtualBounds);
+ if (mCurrentValue != null) {
+ pw.print(prefix); pw.print("currentValue:" ); pw.println(mCurrentValue);
+ }
+ if (mAutofilledValue != null) {
+ pw.print(prefix); pw.print("autofilledValue:" ); pw.println(mAutofilledValue);
+ }
+ if (mSanitizedValue != null) {
+ pw.print(prefix); pw.print("sanitizedValue:" ); pw.println(mSanitizedValue);
+ }
+ if (mVirtualBounds != null) {
+ pw.print(prefix); pw.print("virtualBounds:" ); pw.println(mVirtualBounds);
+ }
}
} \ No newline at end of file
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index ef4656bd06bb..edfc41288906 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -15,6 +15,7 @@
*/
package com.android.server.autofill.ui;
+import static com.android.server.autofill.Helper.paramsToString;
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sVerbose;
@@ -37,7 +38,6 @@ import android.util.Slog;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.LayoutInflater;
-import android.view.MotionEvent;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
@@ -568,12 +568,24 @@ final class FillUi {
@Override
public String toString() {
- return "ViewItem: [dataset=" + (dataset == null ? "null" : dataset.getId())
- + ", value=" + (value == null ? "null" : value.length() + "_chars")
- + ", filterable=" + filterable
- + ", filter=" + (filter == null ? "null" : filter.pattern().length() + "_chars")
- + ", view=" + view.getAutofillId()
- + "]";
+ final StringBuilder builder = new StringBuilder("ViewItem:[view=")
+ .append(view.getAutofillId());
+ final String datasetId = dataset == null ? null : dataset.getId();
+ if (datasetId != null) {
+ builder.append(", dataset=").append(datasetId);
+ }
+ if (value != null) {
+ // Cannot print value because it could contain PII
+ builder.append(", value=").append(value.length()).append("_chars");
+ }
+ if (filterable) {
+ builder.append(", filterable");
+ }
+ if (filter != null) {
+ // Filter should not have PII, but it could be a huge regexp
+ builder.append(", filter=").append(filter.pattern().length()).append("_chars");
+ }
+ return builder.append(']').toString();
}
}
@@ -583,8 +595,7 @@ final class FillUi {
boolean fitsSystemWindows, int layoutDirection) {
if (sVerbose) {
Slog.v(TAG, "AutofillWindowPresenter.show(): fit=" + fitsSystemWindows
- + ", epicenter="+ transitionEpicenter + ", dir=" + layoutDirection
- + ", params=" + p);
+ + ", params=" + paramsToString(p));
}
UiThread.getHandler().post(() -> mWindow.show(p));
}
@@ -616,7 +627,9 @@ final class FillUi {
* Shows the window.
*/
public void show(WindowManager.LayoutParams params) {
- if (sVerbose) Slog.v(TAG, "show(): showing=" + mShowing + ", params="+ params);
+ if (sVerbose) {
+ Slog.v(TAG, "show(): showing=" + mShowing + ", params=" + paramsToString(params));
+ }
try {
// Okay here is a bit of voodoo - we want to show the window as system
// controlled one so it covers app windows - adjust the params accordingly.
diff --git a/services/core/java/com/android/server/AppStateTracker.java b/services/core/java/com/android/server/AppStateTracker.java
index 6d773e6eb202..cec4f1a0bdd7 100644
--- a/services/core/java/com/android/server/AppStateTracker.java
+++ b/services/core/java/com/android/server/AppStateTracker.java
@@ -261,6 +261,12 @@ public class AppStateTracker {
// we need to deliver the allow-while-idle alarms for this uid, package
unblockAllUnrestrictedAlarms();
}
+
+ if (!sender.isRunAnyInBackgroundAppOpsAllowed(uid, packageName)) {
+ Slog.v(TAG, "Package " + packageName + "/" + uid
+ + " toggled into fg service restriction");
+ stopForegroundServicesForUidPackage(uid, packageName);
+ }
}
/**
@@ -354,6 +360,13 @@ public class AppStateTracker {
}
/**
+ * Called when an app goes into forced app standby and its foreground
+ * services need to be removed from that state.
+ */
+ public void stopForegroundServicesForUidPackage(int uid, String packageName) {
+ }
+
+ /**
* Called when the job restrictions for multiple UIDs might have changed, so the alarm
* manager should re-evaluate all restrictions for all blocked jobs.
*/
@@ -1057,6 +1070,16 @@ public class AppStateTracker {
}
/**
+ * @return whether foreground services should be suppressed in the background
+ * due to forced app standby for the given app
+ */
+ public boolean areForegroundServicesRestricted(int uid, @NonNull String packageName) {
+ synchronized (mLock) {
+ return isRunAnyRestrictedLocked(uid, packageName);
+ }
+ }
+
+ /**
* @return whether force-app-standby is effective for a UID package-name.
*/
private boolean isRestricted(int uid, @NonNull String packageName,
diff --git a/services/core/java/com/android/server/BinderCallsStatsService.java b/services/core/java/com/android/server/BinderCallsStatsService.java
new file mode 100644
index 000000000000..2ed451610354
--- /dev/null
+++ b/services/core/java/com/android/server/BinderCallsStatsService.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server;
+
+import android.os.Binder;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.util.Slog;
+
+import com.android.internal.os.BinderCallsStats;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+public class BinderCallsStatsService extends Binder {
+
+ private static final String TAG = "BinderCallsStatsService";
+
+ private static final String PERSIST_SYS_BINDER_CPU_STATS_TRACKING
+ = "persist.sys.binder_cpu_stats_tracking";
+
+ public static void start() {
+ BinderCallsStatsService service = new BinderCallsStatsService();
+ ServiceManager.addService("binder_calls_stats", service);
+ // TODO Enable by default on eng/userdebug builds
+ boolean trackingEnabledDefault = false;
+ boolean trackingEnabled = SystemProperties.getBoolean(PERSIST_SYS_BINDER_CPU_STATS_TRACKING,
+ trackingEnabledDefault);
+
+ if (trackingEnabled) {
+ Slog.i(TAG, "Enabled CPU usage tracking for binder calls. Controlled by "
+ + PERSIST_SYS_BINDER_CPU_STATS_TRACKING);
+ BinderCallsStats.getInstance().setTrackingEnabled(true);
+ }
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ BinderCallsStats.getInstance().dump(pw);
+ }
+}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 30d31b8496e3..088f366b5f19 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -1386,6 +1386,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
+ private void restrictBackgroundRequestForCaller(NetworkCapabilities nc) {
+ if (!mPermissionMonitor.hasUseBackgroundNetworksPermission(Binder.getCallingUid())) {
+ nc.addCapability(NET_CAPABILITY_FOREGROUND);
+ }
+ }
+
@Override
public NetworkState[] getAllNetworkState() {
// Require internal since we're handing out IMSI details
@@ -4411,15 +4417,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
restrictRequestUidsForCaller(nc);
- if (!ConnectivityManager.checkChangePermission(mContext)) {
- // Apps without the CHANGE_NETWORK_STATE permission can't use background networks, so
- // make all their listens include NET_CAPABILITY_FOREGROUND. That way, they will get
- // onLost and onAvailable callbacks when networks move in and out of the background.
- // There is no need to do this for requests because an app without CHANGE_NETWORK_STATE
- // can't request networks.
- nc.addCapability(NET_CAPABILITY_FOREGROUND);
- }
- ensureValidNetworkSpecifier(networkCapabilities);
+ // Apps without the CHANGE_NETWORK_STATE permission can't use background networks, so
+ // make all their listens include NET_CAPABILITY_FOREGROUND. That way, they will get
+ // onLost and onAvailable callbacks when networks move in and out of the background.
+ // There is no need to do this for requests because an app without CHANGE_NETWORK_STATE
+ // can't request networks.
+ restrictBackgroundRequestForCaller(nc);
+ ensureValidNetworkSpecifier(nc);
NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(),
NetworkRequest.Type.LISTEN);
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 5b57c14c1115..f6ff359d8c19 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -3663,16 +3663,21 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
+ boolean reenableMinimumNonAuxSystemImes = false;
// TODO: The following code should find better place to live.
if (!resetDefaultEnabledIme) {
boolean enabledImeFound = false;
+ boolean enabledNonAuxImeFound = false;
final List<InputMethodInfo> enabledImes = mSettings.getEnabledInputMethodListLocked();
final int N = enabledImes.size();
for (int i = 0; i < N; ++i) {
final InputMethodInfo imi = enabledImes.get(i);
if (mMethodList.contains(imi)) {
enabledImeFound = true;
- break;
+ if (!imi.isAuxiliaryIme()) {
+ enabledNonAuxImeFound = true;
+ break;
+ }
}
}
if (!enabledImeFound) {
@@ -3681,12 +3686,18 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
resetDefaultEnabledIme = true;
resetSelectedInputMethodAndSubtypeLocked("");
+ } else if (!enabledNonAuxImeFound) {
+ if (DEBUG) {
+ Slog.i(TAG, "All the enabled non-Aux IMEs are gone. Do partial reset.");
+ }
+ reenableMinimumNonAuxSystemImes = true;
}
}
- if (resetDefaultEnabledIme) {
+ if (resetDefaultEnabledIme || reenableMinimumNonAuxSystemImes) {
final ArrayList<InputMethodInfo> defaultEnabledIme =
- InputMethodUtils.getDefaultEnabledImes(mContext, mMethodList);
+ InputMethodUtils.getDefaultEnabledImes(mContext, mMethodList,
+ reenableMinimumNonAuxSystemImes);
final int N = defaultEnabledIme.size();
for (int i = 0; i < N; ++i) {
final InputMethodInfo imi = defaultEnabledIme.get(i);
diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java
index 45a4dfb91bbf..d09a161d1ef4 100644
--- a/services/core/java/com/android/server/IpSecService.java
+++ b/services/core/java/com/android/server/IpSecService.java
@@ -36,6 +36,7 @@ import android.net.IpSecTransform;
import android.net.IpSecTransformResponse;
import android.net.IpSecTunnelInterfaceResponse;
import android.net.IpSecUdpEncapResponse;
+import android.net.LinkAddress;
import android.net.Network;
import android.net.NetworkUtils;
import android.net.TrafficStats;
@@ -618,10 +619,8 @@ public class IpSecService extends IIpSecService.Stub {
spi,
mConfig.getMarkValue(),
mConfig.getMarkMask());
- } catch (ServiceSpecificException e) {
- // FIXME: get the error code and throw is at an IOException from Errno Exception
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to delete SA with ID: " + mResourceId);
+ } catch (RemoteException | ServiceSpecificException e) {
+ Log.e(TAG, "Failed to delete SA with ID: " + mResourceId, e);
}
getResourceTracker().give();
@@ -677,14 +676,14 @@ public class IpSecService extends IIpSecService.Stub {
@Override
public void freeUnderlyingResources() {
try {
- mSrvConfig
- .getNetdInstance()
- .ipSecDeleteSecurityAssociation(
- mResourceId, mSourceAddress, mDestinationAddress, mSpi, 0, 0);
- } catch (ServiceSpecificException e) {
- // FIXME: get the error code and throw is at an IOException from Errno Exception
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to delete SPI reservation with ID: " + mResourceId);
+ if (!mOwnedByTransform) {
+ mSrvConfig
+ .getNetdInstance()
+ .ipSecDeleteSecurityAssociation(
+ mResourceId, mSourceAddress, mDestinationAddress, mSpi, 0, 0);
+ }
+ } catch (ServiceSpecificException | RemoteException e) {
+ Log.e(TAG, "Failed to delete SPI reservation with ID: " + mResourceId, e);
}
mSpi = IpSecManager.INVALID_SECURITY_PARAMETER_INDEX;
@@ -829,15 +828,13 @@ public class IpSecService extends IIpSecService.Stub {
0, direction, wildcardAddr, wildcardAddr, mark, 0xffffffff);
}
}
- } catch (ServiceSpecificException e) {
- // FIXME: get the error code and throw is at an IOException from Errno Exception
- } catch (RemoteException e) {
+ } catch (ServiceSpecificException | RemoteException e) {
Log.e(
TAG,
"Failed to delete VTI with interface name: "
+ mInterfaceName
+ " and id: "
- + mResourceId);
+ + mResourceId, e);
}
getResourceTracker().give();
@@ -1319,7 +1316,9 @@ public class IpSecService extends IIpSecService.Stub {
* from multiple local IP addresses over the same tunnel.
*/
@Override
- public synchronized void addAddressToTunnelInterface(int tunnelResourceId, String localAddr) {
+ public synchronized void addAddressToTunnelInterface(
+ int tunnelResourceId, LinkAddress localAddr) {
+ enforceNetworkStackPermission();
UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
// Get tunnelInterface record; if no such interface is found, will throw
@@ -1327,8 +1326,21 @@ public class IpSecService extends IIpSecService.Stub {
TunnelInterfaceRecord tunnelInterfaceInfo =
userRecord.mTunnelInterfaceRecords.getResourceOrThrow(tunnelResourceId);
- // TODO: Add calls to netd:
- // Add address to TunnelInterface
+ try {
+ // We can assume general validity of the IP address, since we get them as a
+ // LinkAddress, which does some validation.
+ mSrvConfig
+ .getNetdInstance()
+ .interfaceAddAddress(
+ tunnelInterfaceInfo.mInterfaceName,
+ localAddr.getAddress().getHostAddress(),
+ localAddr.getPrefixLength());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } catch (ServiceSpecificException e) {
+ // If we get here, one of the arguments provided was invalid. Wrap the SSE, and throw.
+ throw new IllegalArgumentException(e);
+ }
}
/**
@@ -1337,7 +1349,8 @@ public class IpSecService extends IIpSecService.Stub {
*/
@Override
public synchronized void removeAddressFromTunnelInterface(
- int tunnelResourceId, String localAddr) {
+ int tunnelResourceId, LinkAddress localAddr) {
+ enforceNetworkStackPermission();
UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
// Get tunnelInterface record; if no such interface is found, will throw
@@ -1345,8 +1358,21 @@ public class IpSecService extends IIpSecService.Stub {
TunnelInterfaceRecord tunnelInterfaceInfo =
userRecord.mTunnelInterfaceRecords.getResourceOrThrow(tunnelResourceId);
- // TODO: Add calls to netd:
- // Remove address from TunnelInterface
+ try {
+ // We can assume general validity of the IP address, since we get them as a
+ // LinkAddress, which does some validation.
+ mSrvConfig
+ .getNetdInstance()
+ .interfaceDelAddress(
+ tunnelInterfaceInfo.mInterfaceName,
+ localAddr.getAddress().getHostAddress(),
+ localAddr.getPrefixLength());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } catch (ServiceSpecificException e) {
+ // If we get here, one of the arguments provided was invalid. Wrap the SSE, and throw.
+ throw new IllegalArgumentException(e);
+ }
}
/**
@@ -1467,6 +1493,13 @@ public class IpSecService extends IIpSecService.Stub {
IpSecAlgorithm crypt = c.getEncryption();
IpSecAlgorithm authCrypt = c.getAuthenticatedEncryption();
+ String cryptName;
+ if (crypt == null) {
+ cryptName = (authCrypt == null) ? IpSecAlgorithm.CRYPT_NULL : "";
+ } else {
+ cryptName = crypt.getName();
+ }
+
mSrvConfig
.getNetdInstance()
.ipSecAddSecurityAssociation(
@@ -1481,7 +1514,7 @@ public class IpSecService extends IIpSecService.Stub {
(auth != null) ? auth.getName() : "",
(auth != null) ? auth.getKey() : new byte[] {},
(auth != null) ? auth.getTruncationLengthBits() : 0,
- (crypt != null) ? crypt.getName() : "",
+ cryptName,
(crypt != null) ? crypt.getKey() : new byte[] {},
(crypt != null) ? crypt.getTruncationLengthBits() : 0,
(authCrypt != null) ? authCrypt.getName() : "",
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 65e90bad41a7..26b83f5ae0c3 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -19,6 +19,7 @@ package com.android.server;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.PendingIntent;
@@ -82,8 +83,6 @@ import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
import com.android.server.location.ActivityRecognitionProxy;
-import com.android.server.location.FlpHardwareProvider;
-import com.android.server.location.FusedProxy;
import com.android.server.location.GeocoderProxy;
import com.android.server.location.GeofenceManager;
import com.android.server.location.GeofenceProxy;
@@ -491,13 +490,6 @@ public class LocationManagerService extends ILocationManager.Stub {
if (gpsProvider != null && gpsProvider.isEnabled()) {
gpsProvider.disable();
}
-
- // it is needed to check if FLP HW provider is supported before accessing the instance, this
- // avoids an exception to be thrown by the singleton factory method
- if (FlpHardwareProvider.isSupported()) {
- FlpHardwareProvider flpHardwareProvider = FlpHardwareProvider.getInstance(mContext);
- flpHardwareProvider.cleanup();
- }
}
/**
@@ -686,27 +678,6 @@ public class LocationManagerService extends ILocationManager.Stub {
Slog.e(TAG, "no geocoder provider found");
}
- // bind to fused hardware provider if supported
- // in devices without support, requesting an instance of FlpHardwareProvider will raise an
- // exception, so make sure we only do that when supported
- FlpHardwareProvider flpHardwareProvider;
- if (FlpHardwareProvider.isSupported()) {
- flpHardwareProvider = FlpHardwareProvider.getInstance(mContext);
- FusedProxy fusedProxy = FusedProxy.createAndBind(
- mContext,
- mLocationHandler,
- flpHardwareProvider.getLocationHardware(),
- com.android.internal.R.bool.config_enableHardwareFlpOverlay,
- com.android.internal.R.string.config_hardwareFlpPackageName,
- com.android.internal.R.array.config_locationProviderPackageNames);
- if (fusedProxy == null) {
- Slog.d(TAG, "Unable to bind FusedProxy.");
- }
- } else {
- flpHardwareProvider = null;
- Slog.d(TAG, "FLP HAL not supported");
- }
-
// bind to geofence provider
GeofenceProxy provider = GeofenceProxy.createAndBind(
mContext, com.android.internal.R.bool.config_enableGeofenceOverlay,
@@ -714,7 +685,7 @@ public class LocationManagerService extends ILocationManager.Stub {
com.android.internal.R.array.config_locationProviderPackageNames,
mLocationHandler,
mGpsGeofenceProxy,
- flpHardwareProvider != null ? flpHardwareProvider.getGeofenceHardware() : null);
+ null);
if (provider == null) {
Slog.d(TAG, "Unable to bind FLP Geofence proxy.");
}
@@ -1161,11 +1132,12 @@ public class LocationManagerService extends ILocationManager.Stub {
* Returns the model name of the GNSS hardware.
*/
@Override
+ @Nullable
public String getGnssHardwareModelName() {
if (mGnssSystemInfoProvider != null) {
return mGnssSystemInfoProvider.getGnssHardwareModelName();
} else {
- return LocationManager.GNSS_HARDWARE_MODEL_NAME_UNKNOWN;
+ return null;
}
}
diff --git a/services/core/java/com/android/server/am/ActiveInstrumentation.java b/services/core/java/com/android/server/am/ActiveInstrumentation.java
index 4a657334f4fb..ff6595115584 100644
--- a/services/core/java/com/android/server/am/ActiveInstrumentation.java
+++ b/services/core/java/com/android/server/am/ActiveInstrumentation.java
@@ -24,8 +24,6 @@ import android.os.Bundle;
import android.util.PrintWriterPrinter;
import android.util.proto.ProtoOutputStream;
-import com.android.server.am.proto.ActiveInstrumentationProto;
-
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index eb4e32e47489..e84c5f4d9dff 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -56,9 +56,10 @@ import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.TransferPipe;
import com.android.internal.util.FastPrintWriter;
+import com.android.server.AppStateTracker;
+import com.android.server.LocalServices;
import com.android.server.am.ActivityManagerService.ItemMatcher;
import com.android.server.am.ActivityManagerService.NeededUriGrants;
-import com.android.server.am.proto.ActiveServicesProto;
import android.app.ActivityManager;
import android.app.AppGlobals;
@@ -165,6 +166,44 @@ public final class ActiveServices {
};
/**
+ * Watch for apps being put into forced app standby, so we can step their fg
+ * services down.
+ */
+ class ForcedStandbyListener extends AppStateTracker.Listener {
+ @Override
+ public void stopForegroundServicesForUidPackage(final int uid, final String packageName) {
+ synchronized (mAm) {
+ final ServiceMap smap = getServiceMapLocked(UserHandle.getUserId(uid));
+ final int N = smap.mServicesByName.size();
+ final ArrayList<ServiceRecord> toStop = new ArrayList<>(N);
+ for (int i = 0; i < N; i++) {
+ final ServiceRecord r = smap.mServicesByName.valueAt(i);
+ if (uid == r.serviceInfo.applicationInfo.uid
+ || packageName.equals(r.serviceInfo.packageName)) {
+ if (r.isForeground) {
+ toStop.add(r);
+ }
+ }
+ }
+
+ // Now stop them all
+ final int numToStop = toStop.size();
+ if (numToStop > 0 && DEBUG_FOREGROUND_SERVICE) {
+ Slog.i(TAG, "Package " + packageName + "/" + uid
+ + " entering FAS with foreground services");
+ }
+ for (int i = 0; i < numToStop; i++) {
+ final ServiceRecord r = toStop.get(i);
+ if (DEBUG_FOREGROUND_SERVICE) {
+ Slog.i(TAG, " Stopping fg for service " + r);
+ }
+ setServiceForegroundInnerLocked(r, 0, null, 0);
+ }
+ }
+ }
+ }
+
+ /**
* Information about an app that is currently running one or more foreground services.
* (This maps directly to the running apps we show in the notification.)
*/
@@ -302,6 +341,11 @@ public final class ActiveServices {
? maxBg : ActivityManager.isLowRamDeviceStatic() ? 1 : 8;
}
+ void systemServicesReady() {
+ AppStateTracker ast = LocalServices.getService(AppStateTracker.class);
+ ast.addListener(new ForcedStandbyListener());
+ }
+
ServiceRecord getServiceByNameLocked(ComponentName name, int callingUser) {
// TODO: Deal with global services
if (DEBUG_MU)
@@ -327,6 +371,12 @@ public final class ActiveServices {
return getServiceMapLocked(callingUser).mServicesByName;
}
+ private boolean appRestrictedAnyInBackground(final int uid, final String packageName) {
+ final int mode = mAm.mAppOpsService.checkOperation(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName);
+ return (mode != AppOpsManager.MODE_ALLOWED);
+ }
+
ComponentName startServiceLocked(IApplicationThread caller, Intent service, String resolvedType,
int callingPid, int callingUid, boolean fgRequired, String callingPackage, final int userId)
throws TransactionTooLargeException {
@@ -365,13 +415,24 @@ public final class ActiveServices {
return null;
}
+ // If the app has strict background restrictions, we treat any service
+ // start analogously to the legacy-app forced-restrictions case.
+ boolean forcedStandby = false;
+ if (appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) {
+ if (DEBUG_FOREGROUND_SERVICE) {
+ Slog.d(TAG, "Forcing bg-only service start only for "
+ + r.name.flattenToShortString());
+ }
+ forcedStandby = true;
+ }
+
// If this isn't a direct-to-foreground start, check our ability to kick off an
// arbitrary service
- if (!r.startRequested && !fgRequired) {
+ if (forcedStandby || (!r.startRequested && !fgRequired)) {
// Before going further -- if this app is not allowed to start services in the
// background, then at this point we aren't going to let it period.
final int allowed = mAm.getAppStartModeLocked(r.appInfo.uid, r.packageName,
- r.appInfo.targetSdkVersion, callingPid, false, false);
+ r.appInfo.targetSdkVersion, callingPid, false, false, forcedStandby);
if (allowed != ActivityManager.APP_START_MODE_NORMAL) {
Slog.w(TAG, "Background start not allowed: service "
+ service + " to " + r.name.flattenToShortString()
@@ -625,7 +686,7 @@ public final class ActiveServices {
ServiceRecord service = services.mServicesByName.valueAt(i);
if (service.appInfo.uid == uid && service.startRequested) {
if (mAm.getAppStartModeLocked(service.appInfo.uid, service.packageName,
- service.appInfo.targetSdkVersion, -1, false, false)
+ service.appInfo.targetSdkVersion, -1, false, false, false)
!= ActivityManager.APP_START_MODE_NORMAL) {
if (stopping == null) {
stopping = new ArrayList<>();
@@ -1019,7 +1080,10 @@ public final class ActiveServices {
}
}
- private void setServiceForegroundInnerLocked(ServiceRecord r, int id,
+ /**
+ * @param id Notification ID. Zero === exit foreground state for the given service.
+ */
+ private void setServiceForegroundInnerLocked(final ServiceRecord r, int id,
Notification notification, int flags) {
if (id != 0) {
if (notification == null) {
@@ -1061,44 +1125,56 @@ public final class ActiveServices {
mAm.mHandler.removeMessages(
ActivityManagerService.SERVICE_FOREGROUND_TIMEOUT_MSG, r);
}
- if (r.foregroundId != id) {
- cancelForegroundNotificationLocked(r);
- r.foregroundId = id;
- }
- notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
- r.foregroundNoti = notification;
- if (!r.isForeground) {
- final ServiceMap smap = getServiceMapLocked(r.userId);
- if (smap != null) {
- ActiveForegroundApp active = smap.mActiveForegroundApps.get(r.packageName);
- if (active == null) {
- active = new ActiveForegroundApp();
- active.mPackageName = r.packageName;
- active.mUid = r.appInfo.uid;
- active.mShownWhileScreenOn = mScreenOn;
- if (r.app != null) {
- active.mAppOnTop = active.mShownWhileTop =
- r.app.uidRecord.curProcState
- <= ActivityManager.PROCESS_STATE_TOP;
+
+ // Apps under strict background restrictions simply don't get to have foreground
+ // services, so now that we've enforced the startForegroundService() contract
+ // we only do the machinery of making the service foreground when the app
+ // is not restricted.
+ if (!appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) {
+ if (r.foregroundId != id) {
+ cancelForegroundNotificationLocked(r);
+ r.foregroundId = id;
+ }
+ notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
+ r.foregroundNoti = notification;
+ if (!r.isForeground) {
+ final ServiceMap smap = getServiceMapLocked(r.userId);
+ if (smap != null) {
+ ActiveForegroundApp active = smap.mActiveForegroundApps.get(r.packageName);
+ if (active == null) {
+ active = new ActiveForegroundApp();
+ active.mPackageName = r.packageName;
+ active.mUid = r.appInfo.uid;
+ active.mShownWhileScreenOn = mScreenOn;
+ if (r.app != null) {
+ active.mAppOnTop = active.mShownWhileTop =
+ r.app.uidRecord.curProcState
+ <= ActivityManager.PROCESS_STATE_TOP;
+ }
+ active.mStartTime = active.mStartVisibleTime
+ = SystemClock.elapsedRealtime();
+ smap.mActiveForegroundApps.put(r.packageName, active);
+ requestUpdateActiveForegroundAppsLocked(smap, 0);
}
- active.mStartTime = active.mStartVisibleTime
- = SystemClock.elapsedRealtime();
- smap.mActiveForegroundApps.put(r.packageName, active);
- requestUpdateActiveForegroundAppsLocked(smap, 0);
+ active.mNumActive++;
}
- active.mNumActive++;
+ r.isForeground = true;
+ StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED,
+ r.appInfo.uid, r.shortName,
+ StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER);
+ }
+ r.postNotification();
+ if (r.app != null) {
+ updateServiceForegroundLocked(r.app, true);
+ }
+ getServiceMapLocked(r.userId).ensureNotStartingBackgroundLocked(r);
+ mAm.notifyPackageUse(r.serviceInfo.packageName,
+ PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);
+ } else {
+ if (DEBUG_FOREGROUND_SERVICE) {
+ Slog.d(TAG, "Suppressing startForeground() for FAS " + r);
}
- r.isForeground = true;
- StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED, r.appInfo.uid, r.shortName,
- StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER);
- }
- r.postNotification();
- if (r.app != null) {
- updateServiceForegroundLocked(r.app, true);
}
- getServiceMapLocked(r.userId).ensureNotStartingBackgroundLocked(r);
- mAm.notifyPackageUse(r.serviceInfo.packageName,
- PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);
} else {
if (r.isForeground) {
final ServiceMap smap = getServiceMapLocked(r.userId);
@@ -1106,7 +1182,8 @@ public final class ActiveServices {
decActiveForegroundAppLocked(smap, r);
}
r.isForeground = false;
- StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED, r.appInfo.uid, r.shortName,
+ StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED,
+ r.appInfo.uid, r.shortName,
StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__EXIT);
if (r.app != null) {
mAm.updateLruProcessLocked(r.app, false, null);
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index 44980772d895..4a8bc8745012 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -35,9 +35,9 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.proto.ActivityDisplayProto.CONFIGURATION_CONTAINER;
-import static com.android.server.am.proto.ActivityDisplayProto.STACKS;
-import static com.android.server.am.proto.ActivityDisplayProto.ID;
+import static com.android.server.am.ActivityDisplayProto.CONFIGURATION_CONTAINER;
+import static com.android.server.am.ActivityDisplayProto.STACKS;
+import static com.android.server.am.ActivityDisplayProto.ID;
import android.annotation.Nullable;
import android.app.ActivityManagerInternal;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 305c1d0eb7b6..955035b272bd 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -123,7 +123,6 @@ import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICAT
import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
-
import static com.android.internal.util.XmlUtils.readBooleanAttribute;
import static com.android.internal.util.XmlUtils.readIntAttribute;
import static com.android.internal.util.XmlUtils.readLongAttribute;
@@ -187,6 +186,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_URI_PERMI
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME;
import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_ONLY;
import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS;
@@ -204,7 +204,6 @@ import static android.view.WindowManager.TRANSIT_NONE;
import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
import static android.view.WindowManager.TRANSIT_TASK_OPEN;
import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
-
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.START_TAG;
@@ -389,8 +388,8 @@ import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationDefinition;
import android.view.View;
import android.view.WindowManager;
-
import android.view.autofill.AutofillManagerInternal;
+
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -442,19 +441,19 @@ import com.android.server.ThreadPriorityBooster;
import com.android.server.Watchdog;
import com.android.server.am.ActivityStack.ActivityState;
import com.android.server.am.MemoryStatUtil.MemoryStat;
-import com.android.server.am.proto.ActivityManagerServiceProto;
-import com.android.server.am.proto.ActivityManagerServiceDumpActivitiesProto;
-import com.android.server.am.proto.ActivityManagerServiceDumpBroadcastsProto;
-import com.android.server.am.proto.ActivityManagerServiceDumpProcessesProto;
-import com.android.server.am.proto.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto;
-import com.android.server.am.proto.ActivityManagerServiceDumpServicesProto;
-import com.android.server.am.proto.GrantUriProto;
-import com.android.server.am.proto.ImportanceTokenProto;
-import com.android.server.am.proto.MemInfoDumpProto;
-import com.android.server.am.proto.NeededUriGrantsProto;
-import com.android.server.am.proto.ProcessOomProto;
-import com.android.server.am.proto.ProcessToGcProto;
-import com.android.server.am.proto.StickyBroadcastProto;
+import com.android.server.am.ActivityManagerServiceProto;
+import com.android.server.am.ActivityManagerServiceDumpActivitiesProto;
+import com.android.server.am.ActivityManagerServiceDumpBroadcastsProto;
+import com.android.server.am.ActivityManagerServiceDumpProcessesProto;
+import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto;
+import com.android.server.am.ActivityManagerServiceDumpServicesProto;
+import com.android.server.am.GrantUriProto;
+import com.android.server.am.ImportanceTokenProto;
+import com.android.server.am.MemInfoDumpProto;
+import com.android.server.am.NeededUriGrantsProto;
+import com.android.server.am.ProcessOomProto;
+import com.android.server.am.ProcessToGcProto;
+import com.android.server.am.StickyBroadcastProto;
import com.android.server.firewall.IntentFirewall;
import com.android.server.job.JobSchedulerInternal;
import com.android.server.pm.Installer;
@@ -755,21 +754,6 @@ public class ActivityManagerService extends IActivityManager.Stub
private final RecentTasks mRecentTasks;
/**
- * For addAppTask: cached of the last activity component that was added.
- */
- ComponentName mLastAddedTaskComponent;
-
- /**
- * For addAppTask: cached of the last activity uid that was added.
- */
- int mLastAddedTaskUid;
-
- /**
- * For addAppTask: cached of the last ActivityInfo that was added.
- */
- ActivityInfo mLastAddedTaskActivity;
-
- /**
* The package name of the DeviceOwner. This package is not permitted to have its data cleared.
*/
String mDeviceOwnerName;
@@ -2867,6 +2851,7 @@ public class ActivityManagerService extends IActivityManager.Stub
public void onBootPhase(int phase) {
if (phase == PHASE_SYSTEM_SERVICES_READY) {
mService.mBatteryStatsService.systemServicesReady();
+ mService.mServices.systemServicesReady();
}
}
@@ -9132,7 +9117,7 @@ public class ActivityManagerService extends IActivityManager.Stub
public boolean isAppStartModeDisabled(int uid, String packageName) {
synchronized (this) {
- return getAppStartModeLocked(uid, packageName, 0, -1, false, true)
+ return getAppStartModeLocked(uid, packageName, 0, -1, false, true, false)
== ActivityManager.APP_START_MODE_DISABLED;
}
}
@@ -9208,12 +9193,12 @@ public class ActivityManagerService extends IActivityManager.Stub
}
int getAppStartModeLocked(int uid, String packageName, int packageTargetSdk,
- int callingPid, boolean alwaysRestrict, boolean disabledOnly) {
+ int callingPid, boolean alwaysRestrict, boolean disabledOnly, boolean forcedStandby) {
UidRecord uidRec = mActiveUids.get(uid);
if (DEBUG_BACKGROUND_CHECK) Slog.d(TAG, "checkAllowBackground: uid=" + uid + " pkg="
+ packageName + " rec=" + uidRec + " always=" + alwaysRestrict + " idle="
+ (uidRec != null ? uidRec.idle : false));
- if (uidRec == null || alwaysRestrict || uidRec.idle) {
+ if (uidRec == null || alwaysRestrict || forcedStandby || uidRec.idle) {
boolean ephemeral;
if (uidRec == null) {
ephemeral = getPackageManagerInternalLocked().isPackageEphemeral(
@@ -10611,27 +10596,24 @@ public class ActivityManagerService extends IActivityManager.Stub
intent.addFlags(Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
}
}
- if (!comp.equals(mLastAddedTaskComponent) || callingUid != mLastAddedTaskUid) {
- mLastAddedTaskActivity = null;
- }
- ActivityInfo ainfo = mLastAddedTaskActivity;
- if (ainfo == null) {
- ainfo = mLastAddedTaskActivity = AppGlobals.getPackageManager().getActivityInfo(
- comp, 0, UserHandle.getUserId(callingUid));
- if (ainfo.applicationInfo.uid != callingUid) {
- throw new SecurityException(
- "Can't add task for another application: target uid="
- + ainfo.applicationInfo.uid + ", calling uid=" + callingUid);
- }
+ final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp, 0,
+ UserHandle.getUserId(callingUid));
+ if (ainfo.applicationInfo.uid != callingUid) {
+ throw new SecurityException(
+ "Can't add task for another application: target uid="
+ + ainfo.applicationInfo.uid + ", calling uid=" + callingUid);
}
- TaskRecord task = TaskRecord.create(this,
- mStackSupervisor.getNextTaskIdForUserLocked(r.userId),
- ainfo, intent, description);
+ final ActivityStack stack = r.getStack();
+ final TaskRecord task = stack.createTaskRecord(
+ mStackSupervisor.getNextTaskIdForUserLocked(r.userId), ainfo, intent,
+ null /* voiceSession */, null /* voiceInteractor */, !ON_TOP);
if (!mRecentTasks.addToBottom(task)) {
+ // The app has too many tasks already and we can't add any more
+ stack.removeTask(task, "addAppTask", REMOVE_TASK_MODE_DESTROYING);
return INVALID_TASK_ID;
}
- r.getStack().addTask(task, !ON_TOP, "addAppTask");
+ task.lastTaskDescription.copyFrom(description);
// TODO: Send the thumbnail to WM to store it.
@@ -17110,8 +17092,8 @@ public class ActivityManagerService extends IActivityManager.Stub
if (mRunningVoice != null) {
final long vrToken = proto.start(ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE);
- proto.write(ActivityManagerServiceDumpProcessesProto.VoiceProto.SESSION, mRunningVoice.toString());
- mVoiceWakeLock.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.VoiceProto.WAKELOCK);
+ proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION, mRunningVoice.toString());
+ mVoiceWakeLock.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK);
proto.end(vrToken);
}
@@ -21770,6 +21752,56 @@ public class ActivityManagerService extends IActivityManager.Stub
// INSTRUMENTATION
// =========================================================
+ private static String[] HIDDENAPI_EXEMPT_PACKAGES = {
+ "com.android.bluetooth.tests",
+ "com.android.managedprovisioning.tests",
+ "com.android.frameworks.coretests",
+ "com.android.frameworks.coretests.binderproxycountingtestapp",
+ "com.android.frameworks.coretests.binderproxycountingtestservice",
+ "com.android.frameworks.tests.net",
+ "com.android.frameworks.tests.uiservices",
+ "com.android.coretests.apps.bstatstestapp",
+ "com.android.servicestests.apps.conntestapp",
+ "com.android.frameworks.servicestests",
+ "com.android.frameworks.utiltests",
+ "com.android.mtp.tests",
+ "android.mtp",
+ "com.android.documentsui.tests",
+ "com.android.shell.tests",
+ "com.android.systemui.tests",
+ "com.android.testables",
+ "android.net.wifi.test",
+ "com.android.server.wifi.test",
+ "com.android.frameworks.telephonytests",
+ "com.android.providers.contacts.tests",
+ "com.android.providers.contacts.tests2",
+ "com.android.settings.tests.unit",
+ "com.android.server.telecom.tests",
+ "com.android.vcard.tests",
+ "com.android.providers.blockednumber.tests",
+ "android.settings.functional",
+ "com.android.notification.functional",
+ "com.android.frameworks.dexloggertest",
+ "com.android.server.usb",
+ "com.android.providers.downloads.tests",
+ "com.android.emergency.tests.unit",
+ "com.android.providers.calendar.tests",
+ "com.android.settingslib",
+ "com.android.rs.test",
+ "com.android.printspooler.outofprocess.tests",
+ "com.android.cellbroadcastreceiver.tests.unit",
+ "com.android.providers.telephony.tests",
+ "com.android.carrierconfig.tests",
+ "com.android.phone.tests",
+ "com.android.service.ims.presence.tests",
+ "com.android.providers.setting.test",
+ "com.android.frameworks.locationtests",
+ "com.android.frameworks.coretests.privacy",
+ "com.android.settings.ui",
+ "com.android.perftests.core",
+ "com.android.perftests.multiuser",
+ };
+
public boolean startInstrumentation(ComponentName className,
String profileFile, int flags, Bundle arguments,
IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection,
@@ -21852,6 +21884,14 @@ public class ActivityManagerService extends IActivityManager.Stub
}
boolean disableHiddenApiChecks =
(flags & INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0;
+
+ // TODO: Temporary whitelist of packages which need to be exempt from hidden API
+ // checks. Remove this as soon as the testing infrastructure allows to set
+ // the flag in AndroidTest.xml.
+ if (Arrays.asList(HIDDENAPI_EXEMPT_PACKAGES).contains(ai.packageName)) {
+ disableHiddenApiChecks = true;
+ }
+
ProcessRecord app = addAppLocked(ai, defProcess, false, disableHiddenApiChecks,
abiOverride);
app.instr = activeInstr;
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 19ca3be645a9..ccc17a3b1d0e 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -112,16 +112,16 @@ import static com.android.server.am.EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY;
import static com.android.server.am.TaskPersister.DEBUG;
import static com.android.server.am.TaskPersister.IMAGE_EXTENSION;
import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
-import static com.android.server.am.proto.ActivityRecordProto.CONFIGURATION_CONTAINER;
-import static com.android.server.am.proto.ActivityRecordProto.FRONT_OF_TASK;
-import static com.android.server.am.proto.ActivityRecordProto.IDENTIFIER;
-import static com.android.server.am.proto.ActivityRecordProto.PROC_ID;
-import static com.android.server.am.proto.ActivityRecordProto.STATE;
-import static com.android.server.am.proto.ActivityRecordProto.VISIBLE;
+import static com.android.server.am.ActivityRecordProto.CONFIGURATION_CONTAINER;
+import static com.android.server.am.ActivityRecordProto.FRONT_OF_TASK;
+import static com.android.server.am.ActivityRecordProto.IDENTIFIER;
+import static com.android.server.am.ActivityRecordProto.PROC_ID;
+import static com.android.server.am.ActivityRecordProto.STATE;
+import static com.android.server.am.ActivityRecordProto.VISIBLE;
import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_LEFT;
-import static com.android.server.wm.proto.IdentifierProto.HASH_CODE;
-import static com.android.server.wm.proto.IdentifierProto.TITLE;
-import static com.android.server.wm.proto.IdentifierProto.USER_ID;
+import static com.android.server.wm.IdentifierProto.HASH_CODE;
+import static com.android.server.wm.IdentifierProto.TITLE;
+import static com.android.server.wm.IdentifierProto.USER_ID;
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.END_TAG;
@@ -2738,11 +2738,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
} else {
service.mHandler.removeMessages(PAUSE_TIMEOUT_MSG, this);
setState(PAUSED, "relaunchActivityLocked");
- // if the app is relaunched when it's stopped, and we're not resuming,
- // put it back into stopped state.
- if (stopped) {
- getStack().addToStopping(this, true /* scheduleIdle */, false /* idleDelayed */);
- }
}
configChangeFlags = 0;
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 1f5320aa876d..20b938b32eed 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -82,13 +82,13 @@ import static com.android.server.am.ActivityStackSupervisor.FindTaskResult;
import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
-import static com.android.server.am.proto.ActivityStackProto.BOUNDS;
-import static com.android.server.am.proto.ActivityStackProto.CONFIGURATION_CONTAINER;
-import static com.android.server.am.proto.ActivityStackProto.DISPLAY_ID;
-import static com.android.server.am.proto.ActivityStackProto.FULLSCREEN;
-import static com.android.server.am.proto.ActivityStackProto.ID;
-import static com.android.server.am.proto.ActivityStackProto.RESUMED_ACTIVITY;
-import static com.android.server.am.proto.ActivityStackProto.TASKS;
+import static com.android.server.am.ActivityStackProto.BOUNDS;
+import static com.android.server.am.ActivityStackProto.CONFIGURATION_CONTAINER;
+import static com.android.server.am.ActivityStackProto.DISPLAY_ID;
+import static com.android.server.am.ActivityStackProto.FULLSCREEN;
+import static com.android.server.am.ActivityStackProto.ID;
+import static com.android.server.am.ActivityStackProto.RESUMED_ACTIVITY;
+import static com.android.server.am.ActivityStackProto.TASKS;
import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE;
import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
import static android.view.WindowManager.TRANSIT_NONE;
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 19fffbb73149..265e4fa078fc 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -90,12 +90,12 @@ import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED;
import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT;
import static com.android.server.am.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE;
import static com.android.server.am.TaskRecord.REPARENT_MOVE_STACK_TO_FRONT;
-import static com.android.server.am.proto.ActivityStackSupervisorProto.CONFIGURATION_CONTAINER;
-import static com.android.server.am.proto.ActivityStackSupervisorProto.DISPLAYS;
-import static com.android.server.am.proto.ActivityStackSupervisorProto.FOCUSED_STACK_ID;
-import static com.android.server.am.proto.ActivityStackSupervisorProto.IS_HOME_RECENTS_COMPONENT;
-import static com.android.server.am.proto.ActivityStackSupervisorProto.KEYGUARD_CONTROLLER;
-import static com.android.server.am.proto.ActivityStackSupervisorProto.RESUMED_ACTIVITY;
+import static com.android.server.am.ActivityStackSupervisorProto.CONFIGURATION_CONTAINER;
+import static com.android.server.am.ActivityStackSupervisorProto.DISPLAYS;
+import static com.android.server.am.ActivityStackSupervisorProto.FOCUSED_STACK_ID;
+import static com.android.server.am.ActivityStackSupervisorProto.IS_HOME_RECENTS_COMPONENT;
+import static com.android.server.am.ActivityStackSupervisorProto.KEYGUARD_CONTROLLER;
+import static com.android.server.am.ActivityStackSupervisorProto.RESUMED_ACTIVITY;
import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS;
import static java.lang.Integer.MAX_VALUE;
@@ -643,7 +643,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
void setWindowManager(WindowManagerService wm) {
synchronized (mService) {
mWindowManager = wm;
- mKeyguardController.setWindowManager(wm);
+ getKeyguardController().setWindowManager(wm);
mDisplayManager =
(DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
@@ -1199,6 +1199,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
for (int i = mTmpOrderedDisplayIds.size() - 1; i >= 0; --i) {
final int displayId = mTmpOrderedDisplayIds.get(i);
final ActivityDisplay display = mActivityDisplays.get(displayId);
+
+ // If WindowManagerService has encountered the display before we have, ignore as there
+ // will be no stacks present and therefore no activities.
+ if (display == null) {
+ continue;
+ }
for (int j = display.getChildCount() - 1; j >= 0; --j) {
final ActivityStack stack = display.getChildAt(j);
if (stack != focusedStack && stack.isTopStackOnDisplay() && stack.isFocusable()) {
@@ -1312,7 +1318,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
r.setProcess(app);
- if (mKeyguardController.isKeyguardLocked()) {
+ if (getKeyguardController().isKeyguardLocked()) {
r.notifyUnknownVisibilityLaunched();
}
@@ -3377,7 +3383,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
} else {
stack.awakeFromSleepingLocked();
if (isFocusedStack(stack)
- && !mKeyguardController.isKeyguardShowing(display.mDisplayId)) {
+ && !getKeyguardController().isKeyguardShowing(display.mDisplayId)) {
// If the keyguard is unlocked - resume immediately.
// It is possible that the display will not be awake at the time we
// process the keyguard going away, which can happen before the sleep token
@@ -3501,7 +3507,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges,
boolean preserveWindows) {
- mKeyguardController.beginActivityVisibilityUpdate();
+ getKeyguardController().beginActivityVisibilityUpdate();
try {
// First the front stacks. In case any are not fullscreen and are in front of home.
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
@@ -3512,7 +3518,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
}
} finally {
- mKeyguardController.endActivityVisibilityUpdate();
+ getKeyguardController().endActivityVisibilityUpdate();
}
}
@@ -3799,7 +3805,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
pw.print(prefix); pw.print("isHomeRecentsComponent=");
pw.print(mRecentTasks.isRecentsComponentHomeActivity(mCurrentUser));
- mKeyguardController.dump(pw, prefix);
+ getKeyguardController().dump(pw, prefix);
mService.mLockTaskController.dump(pw, prefix);
}
@@ -3810,7 +3816,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx);
activityDisplay.writeToProto(proto, DISPLAYS);
}
- mKeyguardController.writeToProto(proto, KEYGUARD_CONTROLLER);
+ getKeyguardController().writeToProto(proto, KEYGUARD_CONTROLLER);
if (mFocusedStack != null) {
proto.write(FOCUSED_STACK_ID, mFocusedStack.mStackId);
ActivityRecord focusedActivity = getResumedActivityLocked();
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index bd53eac7fee7..a30a944b44f1 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -1834,7 +1834,8 @@ class ActivityStarter {
mNoAnimation, mOptions, mStartActivity.appTimeTracker,
"bringToFrontInsteadOfAdjacentLaunch");
}
- mMovedToFront = true;
+ mMovedToFront = launchStack != launchStack.getDisplay()
+ .getTopStackInWindowingMode(launchStack.getWindowingMode());
} else if (launchStack.mDisplayId != mTargetStack.mDisplayId) {
// Target and computed stacks are on different displays and we've
// found a matching task - move the existing instance to that display and
@@ -2393,6 +2394,11 @@ class ActivityStarter {
return this;
}
+ @VisibleForTesting
+ Intent getIntent() {
+ return mRequest.intent;
+ }
+
ActivityStarter setReason(String reason) {
mRequest.reason = reason;
return this;
diff --git a/services/core/java/com/android/server/am/AppBindRecord.java b/services/core/java/com/android/server/am/AppBindRecord.java
index 972a692d276f..4eaebd04a8ad 100644
--- a/services/core/java/com/android/server/am/AppBindRecord.java
+++ b/services/core/java/com/android/server/am/AppBindRecord.java
@@ -19,8 +19,6 @@ package com.android.server.am;
import android.util.ArraySet;
import android.util.proto.ProtoOutputStream;
-import com.android.server.am.proto.AppBindRecordProto;
-
import java.io.PrintWriter;
/**
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index ed098795d1d8..b2872e4d7f5a 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -22,7 +22,6 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.os.ProcessCpuTracker;
import com.android.server.RescueParty;
import com.android.server.Watchdog;
-import com.android.server.am.proto.AppErrorsProto;
import android.app.ActivityManager;
import android.app.ActivityOptions;
diff --git a/services/core/java/com/android/server/am/AppTimeTracker.java b/services/core/java/com/android/server/am/AppTimeTracker.java
index d96364ade168..772865d89d3b 100644
--- a/services/core/java/com/android/server/am/AppTimeTracker.java
+++ b/services/core/java/com/android/server/am/AppTimeTracker.java
@@ -28,8 +28,6 @@ import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;
-import com.android.server.am.proto.AppTimeTrackerProto;
-
import java.io.PrintWriter;
/**
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index f5e1a317c89b..2291e44d9e06 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -283,30 +283,34 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
mUseLatestStates = true;
}
- synchronized (mWorkerLock) {
- if (DEBUG) {
- Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
- }
- try {
- updateExternalStatsLocked(reason, updateFlags, onBattery,
- onBatteryScreenOff, useLatestStates);
- } finally {
+ try {
+ synchronized (mWorkerLock) {
if (DEBUG) {
- Slog.d(TAG, "end updateExternalStatsSync");
+ Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
+ }
+ try {
+ updateExternalStatsLocked(reason, updateFlags, onBattery,
+ onBatteryScreenOff, useLatestStates);
+ } finally {
+ if (DEBUG) {
+ Slog.d(TAG, "end updateExternalStatsSync");
+ }
}
}
- }
- if ((updateFlags & UPDATE_CPU) != 0) {
- mStats.copyFromAllUidsCpuTimes();
- }
+ if ((updateFlags & UPDATE_CPU) != 0) {
+ mStats.copyFromAllUidsCpuTimes();
+ }
- // Clean up any UIDs if necessary.
- synchronized (mStats) {
- for (int uid : uidsToRemove) {
- mStats.removeIsolatedUidLocked(uid);
+ // Clean up any UIDs if necessary.
+ synchronized (mStats) {
+ for (int uid : uidsToRemove) {
+ mStats.removeIsolatedUidLocked(uid);
+ }
+ mStats.clearPendingRemovedUids();
}
- mStats.clearPendingRemovedUids();
+ } catch (Exception e) {
+ Slog.wtf(TAG, "Error updating external stats: ", e);
}
}
};
@@ -398,7 +402,7 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
if (bluetoothInfo.isValid()) {
mStats.updateBluetoothStateLocked(bluetoothInfo);
} else {
- Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo);
+ Slog.w(TAG, "bluetooth info is invalid: " + bluetoothInfo);
}
}
}
@@ -410,7 +414,7 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
if (wifiInfo.isValid()) {
mStats.updateWifiState(extractDeltaLocked(wifiInfo));
} else {
- Slog.e(TAG, "wifi info is invalid: " + wifiInfo);
+ Slog.w(TAG, "wifi info is invalid: " + wifiInfo);
}
}
@@ -418,7 +422,7 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
if (modemInfo.isValid()) {
mStats.updateMobileRadioState(modemInfo);
} else {
- Slog.e(TAG, "modem info is invalid: " + modemInfo);
+ Slog.w(TAG, "modem info is invalid: " + modemInfo);
}
}
}
diff --git a/services/core/java/com/android/server/am/BroadcastFilter.java b/services/core/java/com/android/server/am/BroadcastFilter.java
index 7ff227f56ae8..8e2ca0691277 100644
--- a/services/core/java/com/android/server/am/BroadcastFilter.java
+++ b/services/core/java/com/android/server/am/BroadcastFilter.java
@@ -21,8 +21,6 @@ import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.util.proto.ProtoOutputStream;
-import com.android.server.am.proto.BroadcastFilterProto;
-
import java.io.PrintWriter;
final class BroadcastFilter extends IntentFilter {
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 9a7634edd81b..cc3a8875c4d1 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -55,8 +55,6 @@ import android.util.proto.ProtoOutputStream;
import static com.android.server.am.ActivityManagerDebugConfig.*;
-import com.android.server.am.proto.BroadcastQueueProto;
-
/**
* BROADCASTS
*
@@ -1258,7 +1256,7 @@ public final class BroadcastQueue {
if (!skip) {
final int allowed = mService.getAppStartModeLocked(
info.activityInfo.applicationInfo.uid, info.activityInfo.packageName,
- info.activityInfo.applicationInfo.targetSdkVersion, -1, true, false);
+ info.activityInfo.applicationInfo.targetSdkVersion, -1, true, false, false);
if (allowed != ActivityManager.APP_START_MODE_NORMAL) {
// We won't allow this receiver to be launched if the app has been
// completely disabled from launches, or it was not explicitly sent
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index 5b3b2a8ed3d8..574ca4a340ee 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -32,8 +32,6 @@ import android.util.PrintWriterPrinter;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
-import com.android.server.am.proto.BroadcastRecordProto;
-
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Arrays;
diff --git a/services/core/java/com/android/server/am/ConnectionRecord.java b/services/core/java/com/android/server/am/ConnectionRecord.java
index a8e9ad9ce87b..679024ee4c94 100644
--- a/services/core/java/com/android/server/am/ConnectionRecord.java
+++ b/services/core/java/com/android/server/am/ConnectionRecord.java
@@ -22,8 +22,6 @@ import android.content.Context;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;
-import com.android.server.am.proto.ConnectionRecordProto;
-
import java.io.PrintWriter;
/**
diff --git a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java
index 690d985ef096..328426da159f 100644
--- a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java
@@ -36,14 +36,16 @@ class GlobalSettingsToPropertiesMapper {
private static final String TAG = "GlobalSettingsToPropertiesMapper";
+ // List mapping entries in the following format:
+ // {Settings.Global.SETTING_NAME, "system_property_name"}
+ // Important: Property being added should be whitelisted by SELinux policy or have one of the
+ // already whitelisted prefixes in system_server.te, e.g. sys.
private static final String[][] sGlobalSettingsMapping = new String[][] {
- // List mapping entries in the following format:
- // {Settings.Global.SETTING_NAME, "system_property_name"},
{Settings.Global.SYS_VDSO, "sys.vdso"},
{Settings.Global.FPS_DEVISOR, ThreadedRenderer.DEBUG_FPS_DIVISOR},
{Settings.Global.DISPLAY_PANEL_LPM, "sys.display_panel_lpm"},
{Settings.Global.SYS_UIDCPUPOWER, "sys.uidcpupower"},
- {Settings.Global.SYS_TRACED, "persist.traced.enable"},
+ {Settings.Global.SYS_TRACED, "sys.traced.enable_override"},
};
diff --git a/services/core/java/com/android/server/am/IntentBindRecord.java b/services/core/java/com/android/server/am/IntentBindRecord.java
index 3457a8098284..839b6e1bd634 100644
--- a/services/core/java/com/android/server/am/IntentBindRecord.java
+++ b/services/core/java/com/android/server/am/IntentBindRecord.java
@@ -23,9 +23,6 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.proto.ProtoOutputStream;
-import com.android.server.am.proto.AppBindRecordProto;
-import com.android.server.am.proto.IntentBindRecordProto;
-
import java.io.PrintWriter;
/**
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index 0d7eab626ff0..b67dd0dc479b 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -25,8 +25,8 @@ import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
-import static com.android.server.am.proto.KeyguardControllerProto.KEYGUARD_OCCLUDED;
-import static com.android.server.am.proto.KeyguardControllerProto.KEYGUARD_SHOWING;
+import static com.android.server.am.KeyguardControllerProto.KEYGUARD_OCCLUDED;
+import static com.android.server.am.KeyguardControllerProto.KEYGUARD_SHOWING;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java
index ed39329844ef..106b37f819c3 100644
--- a/services/core/java/com/android/server/am/LockTaskController.java
+++ b/services/core/java/com/android/server/am/LockTaskController.java
@@ -62,6 +62,7 @@ import android.util.SparseArray;
import android.util.SparseIntArray;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.LocalServices;
@@ -730,7 +731,29 @@ public class LockTaskController {
if (isKeyguardAllowed(userId)) {
mWindowManager.reenableKeyguard(mToken);
} else {
- mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG);
+ // If keyguard is not secure and it is locked, dismiss the keyguard before
+ // disabling it, which avoids the platform to think the keyguard is still on.
+ if (mWindowManager.isKeyguardLocked() && !mWindowManager.isKeyguardSecure()) {
+ mWindowManager.dismissKeyguard(new IKeyguardDismissCallback.Stub() {
+ @Override
+ public void onDismissError() throws RemoteException {
+ Slog.i(TAG, "setKeyguardState: failed to dismiss keyguard");
+ }
+
+ @Override
+ public void onDismissSucceeded() throws RemoteException {
+ mHandler.post(
+ () -> mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG));
+ }
+
+ @Override
+ public void onDismissCancelled() throws RemoteException {
+ Slog.i(TAG, "setKeyguardState: dismiss cancelled");
+ }
+ }, null);
+ } else {
+ mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG);
+ }
}
} else { // lockTaskModeState == LOCK_TASK_MODE_PINNED
diff --git a/services/core/java/com/android/server/am/OWNERS b/services/core/java/com/android/server/am/OWNERS
new file mode 100644
index 000000000000..99640530a49b
--- /dev/null
+++ b/services/core/java/com/android/server/am/OWNERS
@@ -0,0 +1,4 @@
+per-file GlobalSettingsToPropertiesMapper.java=fkupolov@google.com
+per-file GlobalSettingsToPropertiesMapper.java=omakoto@google.com
+per-file GlobalSettingsToPropertiesMapper.java=svetoslavganov@google.com
+per-file GlobalSettingsToPropertiesMapper.java=yamasani@google.com \ No newline at end of file
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 0bf269151f24..e348bf4bf5ae 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -27,7 +27,6 @@ import android.util.Slog;
import com.android.internal.app.procstats.ProcessStats;
import com.android.internal.app.procstats.ProcessState;
import com.android.internal.os.BatteryStatsImpl;
-import com.android.server.am.proto.ProcessRecordProto;
import android.app.ActivityManager;
import android.app.Dialog;
diff --git a/services/core/java/com/android/server/am/ReceiverList.java b/services/core/java/com/android/server/am/ReceiverList.java
index eee924f6b23f..5e31b2e3bdd1 100644
--- a/services/core/java/com/android/server/am/ReceiverList.java
+++ b/services/core/java/com/android/server/am/ReceiverList.java
@@ -25,7 +25,6 @@ import android.util.Printer;
import android.util.proto.ProtoOutputStream;
import com.android.server.IntentResolver;
-import com.android.server.am.proto.ReceiverListProto;
import java.io.PrintWriter;
import java.util.ArrayList;
diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java
index fc8b624f6b7e..1335ced6182e 100644
--- a/services/core/java/com/android/server/am/RecentTasks.java
+++ b/services/core/java/com/android/server/am/RecentTasks.java
@@ -508,6 +508,10 @@ class RecentTasks {
&& tr.userId == userId
&& tr.realActivitySuspended != suspended) {
tr.realActivitySuspended = suspended;
+ if (suspended) {
+ mService.mStackSupervisor.removeTaskByIdLocked(tr.taskId, false,
+ REMOVE_FROM_RECENTS, "suspended-package");
+ }
notifyTaskPersisterLocked(tr, false);
}
}
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index 49a55cbf8e98..f296c6045248 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -19,7 +19,6 @@ package com.android.server.am;
import com.android.internal.app.procstats.ServiceState;
import com.android.internal.os.BatteryStatsImpl;
import com.android.server.LocalServices;
-import com.android.server.am.proto.ServiceRecordProto;
import com.android.server.notification.NotificationManagerInternal;
import android.app.INotificationManager;
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index c7b89d3d47eb..034cb2e373d5 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -62,19 +62,19 @@ import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING_TO_TOP
import static com.android.server.am.ActivityStackSupervisor.ON_TOP;
import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
-import static com.android.server.am.proto.TaskRecordProto.ACTIVITIES;
-import static com.android.server.am.proto.TaskRecordProto.BOUNDS;
-import static com.android.server.am.proto.TaskRecordProto.CONFIGURATION_CONTAINER;
-import static com.android.server.am.proto.TaskRecordProto.FULLSCREEN;
-import static com.android.server.am.proto.TaskRecordProto.ID;
-import static com.android.server.am.proto.TaskRecordProto.LAST_NON_FULLSCREEN_BOUNDS;
-import static com.android.server.am.proto.TaskRecordProto.MIN_HEIGHT;
-import static com.android.server.am.proto.TaskRecordProto.MIN_WIDTH;
-import static com.android.server.am.proto.TaskRecordProto.ORIG_ACTIVITY;
-import static com.android.server.am.proto.TaskRecordProto.REAL_ACTIVITY;
-import static com.android.server.am.proto.TaskRecordProto.RESIZE_MODE;
-import static com.android.server.am.proto.TaskRecordProto.STACK_ID;
-import static com.android.server.am.proto.TaskRecordProto.ACTIVITY_TYPE;
+import static com.android.server.am.TaskRecordProto.ACTIVITIES;
+import static com.android.server.am.TaskRecordProto.BOUNDS;
+import static com.android.server.am.TaskRecordProto.CONFIGURATION_CONTAINER;
+import static com.android.server.am.TaskRecordProto.FULLSCREEN;
+import static com.android.server.am.TaskRecordProto.ID;
+import static com.android.server.am.TaskRecordProto.LAST_NON_FULLSCREEN_BOUNDS;
+import static com.android.server.am.TaskRecordProto.MIN_HEIGHT;
+import static com.android.server.am.TaskRecordProto.MIN_WIDTH;
+import static com.android.server.am.TaskRecordProto.ORIG_ACTIVITY;
+import static com.android.server.am.TaskRecordProto.REAL_ACTIVITY;
+import static com.android.server.am.TaskRecordProto.RESIZE_MODE;
+import static com.android.server.am.TaskRecordProto.STACK_ID;
+import static com.android.server.am.TaskRecordProto.ACTIVITY_TYPE;
import static java.lang.Integer.MAX_VALUE;
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index d49f3baa7bcb..3b859edd3cf9 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -28,7 +28,6 @@ import android.util.proto.ProtoUtils;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.am.proto.UidRecordProto;
/**
* Overall information about a uid that has actively running processes.
diff --git a/services/core/java/com/android/server/am/UriPermissionOwner.java b/services/core/java/com/android/server/am/UriPermissionOwner.java
index fc07c1ab8c9d..8eda38e6bd24 100644
--- a/services/core/java/com/android/server/am/UriPermissionOwner.java
+++ b/services/core/java/com/android/server/am/UriPermissionOwner.java
@@ -22,8 +22,6 @@ import android.os.IBinder;
import android.util.ArraySet;
import android.util.proto.ProtoOutputStream;
-import com.android.server.am.proto.UriPermissionOwnerProto;
-
import com.google.android.collect.Sets;
import java.io.PrintWriter;
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index af1ab83190cc..0d125e051549 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -95,7 +95,6 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemServiceManager;
-import com.android.server.am.proto.UserControllerProto;
import com.android.server.pm.UserManagerService;
import com.android.server.wm.WindowManagerService;
diff --git a/services/core/java/com/android/server/am/UserState.java b/services/core/java/com/android/server/am/UserState.java
index 00597e242d79..4f5c59ce0634 100644
--- a/services/core/java/com/android/server/am/UserState.java
+++ b/services/core/java/com/android/server/am/UserState.java
@@ -27,7 +27,6 @@ import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import com.android.internal.util.ProgressReporter;
-import com.android.server.am.proto.UserStateProto;
import java.io.PrintWriter;
import java.util.ArrayList;
diff --git a/services/core/java/com/android/server/am/VrController.java b/services/core/java/com/android/server/am/VrController.java
index 9d34a8020345..45410d79afe7 100644
--- a/services/core/java/com/android/server/am/VrController.java
+++ b/services/core/java/com/android/server/am/VrController.java
@@ -24,7 +24,6 @@ import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;
import com.android.server.LocalServices;
-import com.android.server.am.proto.ActivityManagerServiceDumpProcessesProto.VrControllerProto;
import com.android.server.vr.VrManagerInternal;
/**
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index c036549ccb49..041764f4073a 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -24,6 +24,9 @@ import static android.media.AudioManager.STREAM_ALARM;
import static android.media.AudioManager.STREAM_MUSIC;
import static android.media.AudioManager.STREAM_SYSTEM;
import static android.os.Process.FIRST_APPLICATION_UID;
+import static android.provider.Settings.Secure.VOLUME_HUSH_MUTE;
+import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
+import static android.provider.Settings.Secure.VOLUME_HUSH_VIBRATE;
import android.Manifest;
import android.annotation.NonNull;
@@ -108,6 +111,7 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManagerInternal;
import android.os.UserManagerInternal.UserRestrictionsListener;
+import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.Settings;
import android.provider.Settings.System;
@@ -124,6 +128,7 @@ import android.util.Slog;
import android.util.SparseIntArray;
import android.view.KeyEvent;
import android.view.accessibility.AccessibilityManager;
+import android.widget.Toast;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.DumpUtils;
@@ -440,6 +445,12 @@ public class AudioService extends IAudioService.Stub
// Is there a vibrator
private final boolean mHasVibrator;
+ // Used to play vibrations
+ private Vibrator mVibrator;
+ private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
+ .build();
// Broadcast receiver for device connections intent broadcasts
private final BroadcastReceiver mReceiver = new AudioServiceBroadcastReceiver();
@@ -697,8 +708,8 @@ public class AudioService extends IAudioService.Stub
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mAudioEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleAudioEvent");
- Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
- mHasVibrator = vibrator == null ? false : vibrator.hasVibrator();
+ mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
+ mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator();
// Initialize volume
int maxCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_steps", -1);
@@ -1649,7 +1660,7 @@ public class AudioService extends IAudioService.Stub
// Check if volume update should be send to Hearing Aid
if ((device & AudioSystem.DEVICE_OUT_HEARING_AID) != 0) {
- setHearingAidVolume(newIndex);
+ setHearingAidVolume(newIndex, streamType);
}
// Check if volume update should be sent to Hdmi system audio.
@@ -1898,7 +1909,7 @@ public class AudioService extends IAudioService.Stub
}
if ((device & AudioSystem.DEVICE_OUT_HEARING_AID) != 0) {
- setHearingAidVolume(index);
+ setHearingAidVolume(index, streamType);
}
if (streamTypeAlias == AudioSystem.STREAM_MUSIC) {
@@ -2423,6 +2434,54 @@ public class AudioService extends IAudioService.Stub
setRingerMode(ringerMode, caller, false /*external*/);
}
+ public void silenceRingerModeInternal(String reason) {
+ VibrationEffect effect = null;
+ int ringerMode = AudioManager.RINGER_MODE_SILENT;
+ int toastText = 0;
+
+ int silenceRingerSetting = Settings.Secure.VOLUME_HUSH_OFF;
+ if (mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_volumeHushGestureEnabled)) {
+ silenceRingerSetting = Settings.Secure.getIntForUser(mContentResolver,
+ Settings.Secure.VOLUME_HUSH_GESTURE, VOLUME_HUSH_OFF,
+ UserHandle.USER_CURRENT);
+ }
+
+ switch(silenceRingerSetting) {
+ case VOLUME_HUSH_MUTE:
+ effect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
+ ringerMode = AudioManager.RINGER_MODE_SILENT;
+ toastText = com.android.internal.R.string.volume_dialog_ringer_guidance_silent;
+ break;
+ case VOLUME_HUSH_VIBRATE:
+ effect = VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK);
+ ringerMode = AudioManager.RINGER_MODE_VIBRATE;
+ toastText = com.android.internal.R.string.volume_dialog_ringer_guidance_vibrate;
+ break;
+ }
+ maybeVibrate(effect);
+ setRingerModeInternal(ringerMode, reason);
+ Toast.makeText(mContext, toastText, Toast.LENGTH_SHORT).show();
+ }
+
+ private boolean maybeVibrate(VibrationEffect effect) {
+ if (!mHasVibrator) {
+ return false;
+ }
+ final boolean hapticsDisabled = Settings.System.getIntForUser(mContext.getContentResolver(),
+ Settings.System.HAPTIC_FEEDBACK_ENABLED, 0, UserHandle.USER_CURRENT) == 0;
+ if (hapticsDisabled) {
+ return false;
+ }
+
+ if (effect == null) {
+ return false;
+ }
+ mVibrator.vibrate(
+ Binder.getCallingUid(), mContext.getOpPackageName(), effect, VIBRATION_ATTRIBUTES);
+ return true;
+ }
+
private void setRingerMode(int ringerMode, String caller, boolean external) {
if (mUseFixedVolume || mIsSingleVolume) {
return;
@@ -2484,14 +2543,24 @@ public class AudioService extends IAudioService.Stub
mNm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
}
- final boolean ringerModeMute = mRingerMode == AudioManager.RINGER_MODE_VIBRATE
- || mRingerMode == AudioManager.RINGER_MODE_SILENT;
+ final int ringerMode = mRingerMode; // Read ringer mode as reading primitives is atomic
+ final boolean ringerModeMute = ringerMode == AudioManager.RINGER_MODE_VIBRATE
+ || ringerMode == AudioManager.RINGER_MODE_SILENT;
+ final boolean shouldRingSco = ringerMode == AudioManager.RINGER_MODE_VIBRATE
+ && isBluetoothScoOn();
+ // Ask audio policy engine to force use Bluetooth SCO channel if needed
+ final String eventSource = "muteRingerModeStreams() from u/pid:" + Binder.getCallingUid()
+ + "/" + Binder.getCallingPid();
+ sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE, AudioSystem.FOR_VIBRATE_RINGING,
+ shouldRingSco ? AudioSystem.FORCE_BT_SCO : AudioSystem.FORCE_NONE, eventSource, 0);
for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
final boolean isMuted = isStreamMutedByRingerOrZenMode(streamType);
+ final boolean muteAllowedBySco =
+ !(shouldRingSco && streamType == AudioSystem.STREAM_RING);
final boolean shouldZenMute = shouldZenMuteStream(streamType);
final boolean shouldMute = shouldZenMute || (ringerModeMute
- && isStreamAffectedByRingerMode(streamType));
+ && isStreamAffectedByRingerMode(streamType) && muteAllowedBySco);
if (isMuted == shouldMute) continue;
if (!shouldMute) {
// unmute
@@ -3132,6 +3201,8 @@ public class AudioService extends IAudioService.Stub
AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, eventSource, 0);
sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE,
AudioSystem.FOR_RECORD, mForcedUseForComm, eventSource, 0);
+ // Un-mute ringtone stream volume
+ setRingerModeInt(getRingerModeInternal(), false);
}
/** @see AudioManager#isBluetoothScoOn() */
@@ -4724,7 +4795,7 @@ public class AudioService extends IAudioService.Stub
}
public boolean setIndex(int index, int device, String caller) {
- boolean changed = false;
+ boolean changed;
int oldIndex;
synchronized (mSettingsLock) {
synchronized (VolumeStreamState.class) {
@@ -4741,7 +4812,7 @@ public class AudioService extends IAudioService.Stub
// - there is no volume index stored for this device on alias stream.
// If changing volume of current device, also change volume of current
// device on aliased stream
- final boolean currentDevice = (device == getDeviceForStream(mStreamType));
+ final boolean isCurrentDevice = (device == getDeviceForStream(mStreamType));
final int numStreamTypes = AudioSystem.getNumStreamTypes();
for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
final VolumeStreamState aliasStreamState = mStreamStates[streamType];
@@ -4750,12 +4821,22 @@ public class AudioService extends IAudioService.Stub
(changed || !aliasStreamState.hasIndexForDevice(device))) {
final int scaledIndex = rescaleIndex(index, mStreamType, streamType);
aliasStreamState.setIndex(scaledIndex, device, caller);
- if (currentDevice) {
+ if (isCurrentDevice) {
aliasStreamState.setIndex(scaledIndex,
getDeviceForStream(streamType), caller);
}
}
}
+ // Mirror changes in SPEAKER ringtone volume on SCO when
+ if (changed && mStreamType == AudioSystem.STREAM_RING
+ && device == AudioSystem.DEVICE_OUT_SPEAKER) {
+ for (int i = 0; i < mIndexMap.size(); i++) {
+ int otherDevice = mIndexMap.keyAt(i);
+ if ((otherDevice & AudioSystem.DEVICE_OUT_ALL_SCO) != 0) {
+ mIndexMap.put(otherDevice, index);
+ }
+ }
+ }
}
}
if (changed) {
@@ -5606,11 +5687,11 @@ public class AudioService extends IAudioService.Stub
makeDeviceListKey(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP, address));
}
- private void setHearingAidVolume(int index) {
+ private void setHearingAidVolume(int index, int streamType) {
synchronized (mHearingAidLock) {
if (mHearingAid != null) {
//hearing aid expect volume value in range -128dB to 0dB
- int gainDB = (int)AudioSystem.getStreamVolumeDB(AudioSystem.STREAM_MUSIC, index/10,
+ int gainDB = (int)AudioSystem.getStreamVolumeDB(streamType, index/10,
AudioSystem.DEVICE_OUT_HEARING_AID);
if (gainDB < BT_HEARING_AID_GAIN_MIN)
gainDB = BT_HEARING_AID_GAIN_MIN;
@@ -5622,7 +5703,7 @@ public class AudioService extends IAudioService.Stub
// must be called synchronized on mConnectedDevices
private void makeHearingAidDeviceAvailable(String address, String name, String eventSource) {
int index = mStreamStates[AudioSystem.STREAM_MUSIC].getIndex(AudioSystem.DEVICE_OUT_HEARING_AID);
- setHearingAidVolume(index);
+ setHearingAidVolume(index, AudioSystem.STREAM_MUSIC);
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_HEARING_AID,
AudioSystem.DEVICE_STATE_AVAILABLE, address, name);
@@ -5868,7 +5949,8 @@ public class AudioService extends IAudioService.Stub
AudioSystem.DEVICE_OUT_WIRED_HEADSET | AudioSystem.DEVICE_OUT_WIRED_HEADPHONE |
AudioSystem.DEVICE_OUT_ALL_A2DP | AudioSystem.DEVICE_OUT_HDMI |
AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET | AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET |
- AudioSystem.DEVICE_OUT_ALL_USB | AudioSystem.DEVICE_OUT_LINE;
+ AudioSystem.DEVICE_OUT_ALL_USB | AudioSystem.DEVICE_OUT_LINE |
+ AudioSystem.DEVICE_OUT_HEARING_AID;
// must be called before removing the device from mConnectedDevices
// Called synchronized on mConnectedDevices
@@ -7246,6 +7328,11 @@ public class AudioService extends IAudioService.Stub
}
@Override
+ public void silenceRingerModeInternal(String caller) {
+ AudioService.this.silenceRingerModeInternal(caller);
+ }
+
+ @Override
public void updateRingerModeAffectedStreamsInternal() {
synchronized (mSettingsLock) {
if (updateRingerAndZenModeAffectedStreams()) {
diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
index e084ff827c09..d578e959314e 100644
--- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java
+++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
@@ -19,6 +19,7 @@ package com.android.server.connectivity;
import static android.Manifest.permission.CHANGE_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
+import static android.Manifest.permission.NETWORK_STACK;
import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
@@ -27,6 +28,7 @@ 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.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -39,6 +41,8 @@ import android.os.UserManager;
import android.text.TextUtils;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -150,7 +154,14 @@ public class PermissionMonitor {
update(mUsers, mApps, true);
}
- private boolean hasPermission(PackageInfo app, String permission) {
+ @VisibleForTesting
+ boolean isPreinstalledSystemApp(PackageInfo app) {
+ int flags = app.applicationInfo != null ? app.applicationInfo.flags : 0;
+ return (flags & (FLAG_SYSTEM | FLAG_UPDATED_SYSTEM_APP)) != 0;
+ }
+
+ @VisibleForTesting
+ boolean hasPermission(PackageInfo app, String permission) {
if (app.requestedPermissions != null) {
for (String p : app.requestedPermissions) {
if (permission.equals(p)) {
@@ -166,14 +177,40 @@ public class PermissionMonitor {
}
private boolean hasRestrictedNetworkPermission(PackageInfo app) {
- int flags = app.applicationInfo != null ? app.applicationInfo.flags : 0;
- if ((flags & FLAG_SYSTEM) != 0 || (flags & FLAG_UPDATED_SYSTEM_APP) != 0) {
- return true;
- }
+ if (isPreinstalledSystemApp(app)) return true;
return hasPermission(app, CONNECTIVITY_INTERNAL)
|| hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS);
}
+ private boolean hasUseBackgroundNetworksPermission(PackageInfo app) {
+ // This function defines what it means to hold the permission to use
+ // background networks.
+ return hasPermission(app, CHANGE_NETWORK_STATE)
+ || hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS)
+ || hasPermission(app, CONNECTIVITY_INTERNAL)
+ || hasPermission(app, NETWORK_STACK)
+ // TODO : remove this check (b/31479477). Not all preinstalled apps should
+ // have access to background networks, they should just request the appropriate
+ // permission for their use case from the list above.
+ || isPreinstalledSystemApp(app);
+ }
+
+ public boolean hasUseBackgroundNetworksPermission(int uid) {
+ final String[] names = mPackageManager.getPackagesForUid(uid);
+ if (null == names || names.length == 0) return false;
+ try {
+ // Only using the first package name. There may be multiple names if multiple
+ // apps share the same UID, but in that case they also share permissions so
+ // querying with any of the names will return the same results.
+ final PackageInfo app = mPackageManager.getPackageInfo(names[0], GET_PERMISSIONS);
+ return hasUseBackgroundNetworksPermission(app);
+ } catch (NameNotFoundException e) {
+ // App not found.
+ loge("NameNotFoundException " + names[0], e);
+ return false;
+ }
+ }
+
private int[] toIntArray(List<Integer> list) {
int[] array = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
@@ -308,4 +345,8 @@ public class PermissionMonitor {
private static void loge(String s) {
Log.e(TAG, s);
}
+
+ private static void loge(String s, Throwable e) {
+ Log.e(TAG, s, e);
+ }
}
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index cb53521c5e7f..5e1afeb571de 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -282,6 +282,10 @@ class AutomaticBrightnessController {
return mBrightnessMapper.isDefaultConfig();
}
+ public BrightnessConfiguration getDefaultConfig() {
+ return mBrightnessMapper.getDefaultConfig();
+ }
+
private boolean setDisplayPolicy(int policy) {
if (mDisplayPolicy == policy) {
return false;
diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
index c0d259992a46..4313d1724214 100644
--- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
+++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
@@ -206,6 +206,8 @@ public abstract class BrightnessMappingStrategy {
/** @return true if the current brightness config is the default one */
public abstract boolean isDefaultConfig();
+ public abstract BrightnessConfiguration getDefaultConfig();
+
public abstract void dump(PrintWriter pw);
private static float normalizeAbsoluteBrightness(int brightness) {
@@ -406,6 +408,9 @@ public abstract class BrightnessMappingStrategy {
}
@Override
+ public BrightnessConfiguration getDefaultConfig() { return null; }
+
+ @Override
public void dump(PrintWriter pw) {
pw.println("SimpleMappingStrategy");
pw.println(" mSpline=" + mSpline);
@@ -533,6 +538,9 @@ public abstract class BrightnessMappingStrategy {
}
@Override
+ public BrightnessConfiguration getDefaultConfig() { return mDefaultConfig; }
+
+ @Override
public void dump(PrintWriter pw) {
pw.println("PhysicalMappingStrategy");
pw.println(" mConfig=" + mConfig);
diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java
index 171f40ed37cd..88df195e8051 100644
--- a/services/core/java/com/android/server/display/BrightnessTracker.java
+++ b/services/core/java/com/android/server/display/BrightnessTracker.java
@@ -25,12 +25,14 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ParceledListSlice;
+import android.database.ContentObserver;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.display.AmbientBrightnessDayStats;
import android.hardware.display.BrightnessChangeEvent;
+import android.net.Uri;
import android.os.BatteryManager;
import android.os.Environment;
import android.os.Handler;
@@ -110,6 +112,8 @@ public class BrightnessTracker {
private static final int MSG_BACKGROUND_START = 0;
private static final int MSG_BRIGHTNESS_CHANGED = 1;
+ private static final int MSG_STOP_SENSOR_LISTENER = 2;
+ private static final int MSG_START_SENSOR_LISTENER = 3;
// Lock held while accessing mEvents, is held while writing events to flash.
private final Object mEventsLock = new Object();
@@ -127,9 +131,14 @@ public class BrightnessTracker {
private final Context mContext;
private final ContentResolver mContentResolver;
private Handler mBgHandler;
- // mBroadcastReceiver and mSensorListener should only be used on the mBgHandler thread.
+
+ // mBroadcastReceiver, mSensorListener, mSettingsObserver and mSensorRegistered
+ // should only be used on the mBgHandler thread.
private BroadcastReceiver mBroadcastReceiver;
private SensorListener mSensorListener;
+ private SettingsObserver mSettingsObserver;
+ private boolean mSensorRegistered;
+
private @UserIdInt int mCurrentUserId = UserHandle.USER_NULL;
// Lock held while collecting data related to brightness changes.
@@ -178,10 +187,9 @@ public class BrightnessTracker {
mSensorListener = new SensorListener();
-
- if (mInjector.isInteractive(mContext)) {
- mInjector.registerSensorListener(mContext, mSensorListener, mBgHandler);
- }
+ mSettingsObserver = new SettingsObserver(mBgHandler);
+ mInjector.registerBrightnessModeObserver(mContentResolver, mSettingsObserver);
+ startSensorListener();
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SHUTDOWN);
@@ -205,10 +213,11 @@ public class BrightnessTracker {
Slog.d(TAG, "Stop");
}
mBgHandler.removeMessages(MSG_BACKGROUND_START);
+ stopSensorListener();
mInjector.unregisterSensorListener(mContext, mSensorListener);
+ mInjector.unregisterBrightnessModeObserver(mContext, mSettingsObserver);
mInjector.unregisterReceiver(mContext, mBroadcastReceiver);
mInjector.cancelIdleJob(mContext);
- mAmbientBrightnessStatsTracker.stop();
synchronized (mDataCollectionLock) {
mStarted = false;
@@ -366,6 +375,25 @@ public class BrightnessTracker {
}
}
+ private void startSensorListener() {
+ if (!mSensorRegistered
+ && mInjector.isInteractive(mContext)
+ && mInjector.isBrightnessModeAutomatic(mContentResolver)) {
+ mAmbientBrightnessStatsTracker.start();
+ mSensorRegistered = true;
+ mInjector.registerSensorListener(mContext, mSensorListener,
+ mInjector.getBackgroundHandler());
+ }
+ }
+
+ private void stopSensorListener() {
+ if (mSensorRegistered) {
+ mAmbientBrightnessStatsTracker.stop();
+ mInjector.unregisterSensorListener(mContext, mSensorListener);
+ mSensorRegistered = false;
+ }
+ }
+
private void scheduleWriteBrightnessTrackerState() {
if (!mWriteBrightnessTrackerStateScheduled) {
mBgHandler.post(() -> {
@@ -724,6 +752,24 @@ public class BrightnessTracker {
}
}
+ private final class SettingsObserver extends ContentObserver {
+ public SettingsObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ if (DEBUG) {
+ Slog.v(TAG, "settings change " + uri);
+ }
+ if (mInjector.isBrightnessModeAutomatic(mContentResolver)) {
+ mBgHandler.obtainMessage(MSG_START_SENSOR_LISTENER).sendToTarget();
+ } else {
+ mBgHandler.obtainMessage(MSG_STOP_SENSOR_LISTENER).sendToTarget();
+ }
+ }
+ }
+
private final class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@@ -741,12 +787,9 @@ public class BrightnessTracker {
batteryLevelChanged(level, scale);
}
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
- mAmbientBrightnessStatsTracker.stop();
- mInjector.unregisterSensorListener(mContext, mSensorListener);
+ mBgHandler.obtainMessage(MSG_STOP_SENSOR_LISTENER).sendToTarget();
} else if (Intent.ACTION_SCREEN_ON.equals(action)) {
- mAmbientBrightnessStatsTracker.start();
- mInjector.registerSensorListener(mContext, mSensorListener,
- mInjector.getBackgroundHandler());
+ mBgHandler.obtainMessage(MSG_START_SENSOR_LISTENER).sendToTarget();
}
}
}
@@ -767,6 +810,12 @@ public class BrightnessTracker {
values.powerBrightnessFactor, values.isUserSetBrightness,
values.isDefaultBrightnessConfig);
break;
+ case MSG_START_SENSOR_LISTENER:
+ startSensorListener();
+ break;
+ case MSG_STOP_SENSOR_LISTENER:
+ stopSensorListener();
+ break;
}
}
}
@@ -801,6 +850,18 @@ public class BrightnessTracker {
sensorManager.unregisterListener(sensorListener);
}
+ public void registerBrightnessModeObserver(ContentResolver resolver,
+ ContentObserver settingsObserver) {
+ resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.SCREEN_BRIGHTNESS_MODE),
+ false, settingsObserver, UserHandle.USER_ALL);
+ }
+
+ public void unregisterBrightnessModeObserver(Context context,
+ ContentObserver settingsObserver) {
+ context.getContentResolver().unregisterContentObserver(settingsObserver);
+ }
+
public void registerReceiver(Context context,
BroadcastReceiver receiver, IntentFilter filter) {
context.registerReceiver(receiver, filter);
@@ -815,6 +876,12 @@ public class BrightnessTracker {
return BackgroundThread.getHandler();
}
+ public boolean isBrightnessModeAutomatic(ContentResolver resolver) {
+ return Settings.System.getIntForUser(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, UserHandle.USER_CURRENT)
+ == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
+ }
+
public int getSecureIntForUser(ContentResolver resolver, String setting, int defaultValue,
int userId) {
return Settings.Secure.getIntForUser(resolver, setting, defaultValue, userId);
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 9861ea735570..c4b2b5ed3ccf 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1878,6 +1878,48 @@ public final class DisplayManagerService extends SystemService {
}
@Override // Binder call
+ public BrightnessConfiguration getBrightnessConfigurationForUser(int userId) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS,
+ "Permission required to read the display's brightness configuration");
+ if (userId != UserHandle.getCallingUserId()) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.INTERACT_ACROSS_USERS,
+ "Permission required to read the display brightness"
+ + " configuration of another user");
+ }
+ final long token = Binder.clearCallingIdentity();
+ try {
+ final int userSerial = getUserManager().getUserSerialNumber(userId);
+ synchronized (mSyncRoot) {
+ BrightnessConfiguration config =
+ mPersistentDataStore.getBrightnessConfiguration(userSerial);
+ if (config == null) {
+ config = mDisplayPowerController.getDefaultBrightnessConfiguration();
+ }
+ return config;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override // Binder call
+ public BrightnessConfiguration getDefaultBrightnessConfiguration() {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS,
+ "Permission required to read the display's default brightness configuration");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ synchronized (mSyncRoot) {
+ return mDisplayPowerController.getDefaultBrightnessConfiguration();
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override // Binder call
public void setTemporaryBrightness(int brightness) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS,
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index fa39ce4f8503..ff8b88bfa79c 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -567,6 +567,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
}
+ public BrightnessConfiguration getDefaultBrightnessConfiguration() {
+ return mAutomaticBrightnessController.getDefaultConfig();
+ }
+
private void sendUpdatePowerState() {
synchronized (mLock) {
sendUpdatePowerStateLocked();
diff --git a/services/core/java/com/android/server/fingerprint/ClientMonitor.java b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
index 3eae157c53aa..4100a9a5f71c 100644
--- a/services/core/java/com/android/server/fingerprint/ClientMonitor.java
+++ b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
+import android.media.AudioAttributes;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.VibrationEffect;
@@ -39,6 +40,11 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
protected static final int ERROR_ESRCH = 3; // Likely fingerprint HAL is dead. See errno.h.
protected static final boolean DEBUG = FingerprintService.DEBUG;
private static final long[] DEFAULT_SUCCESS_VIBRATION_PATTERN = new long[] {0, 30};
+ private static final AudioAttributes FINGERPRINT_SONFICATION_ATTRIBUTES =
+ new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
+ .build();
private final Context mContext;
private final long mHalDeviceId;
private final int mTargetUserId;
@@ -223,14 +229,14 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
public final void vibrateSuccess() {
Vibrator vibrator = mContext.getSystemService(Vibrator.class);
if (vibrator != null) {
- vibrator.vibrate(mSuccessVibrationEffect);
+ vibrator.vibrate(mSuccessVibrationEffect, FINGERPRINT_SONFICATION_ATTRIBUTES);
}
}
public final void vibrateError() {
Vibrator vibrator = mContext.getSystemService(Vibrator.class);
if (vibrator != null) {
- vibrator.vibrate(mErrorVibrationEffect);
+ vibrator.vibrate(mErrorVibrationEffect, FINGERPRINT_SONFICATION_ATTRIBUTES);
}
}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 0b1f9a65868c..66817fad4e5b 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -29,6 +29,7 @@ import android.app.IUidObserver;
import android.app.job.IJobScheduler;
import android.app.job.JobInfo;
import android.app.job.JobParameters;
+import android.app.job.JobProtoEnums;
import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.app.job.JobWorkItem;
@@ -880,7 +881,8 @@ public final class JobSchedulerService extends com.android.server.SystemService
startTrackingJobLocked(jobStatus, toCancel);
StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED,
uId, null, jobStatus.getBatteryName(),
- StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__SCHEDULED);
+ StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__SCHEDULED,
+ JobProtoEnums.STOP_REASON_CANCELLED);
// If the job is immediately ready to run, then we can just immediately
// put it in the pending list and try to schedule it. This is especially
diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java
index 578a32cc4b2e..a1e066e7264e 100644
--- a/services/core/java/com/android/server/job/controllers/JobStatus.java
+++ b/services/core/java/com/android/server/job/controllers/JobStatus.java
@@ -95,11 +95,18 @@ public final class JobStatus {
public static final long MIN_TRIGGER_MAX_DELAY = 1000;
final JobInfo job;
- /** Uid of the package requesting this job. */
+ /**
+ * Uid of the package requesting this job. This can differ from the "source"
+ * uid when the job was scheduled on the app's behalf, such as with the jobs
+ * that underly Sync Manager operation.
+ */
final int callingUid;
final int targetSdkVersion;
final String batteryName;
+ /**
+ * Identity of the app in which the job is hosted.
+ */
final String sourcePackageName;
final int sourceUserId;
final int sourceUid;
@@ -263,6 +270,31 @@ public final class JobStatus {
return callingUid;
}
+ /**
+ * Core constructor for JobStatus instances. All other ctors funnel down to this one.
+ *
+ * @param job The actual requested parameters for the job
+ * @param callingUid Identity of the app that is scheduling the job. This may not be the
+ * app in which the job is implemented; such as with sync jobs.
+ * @param targetSdkVersion The targetSdkVersion of the app in which the job will run.
+ * @param sourcePackageName The package name of the app in which the job will run.
+ * @param sourceUserId The user in which the job will run
+ * @param standbyBucket The standby bucket that the source package is currently assigned to,
+ * cached here for speed of handling during runnability evaluations (and updated when bucket
+ * assignments are changed)
+ * @param heartbeat Timestamp of when the job was created, in the standby-related
+ * timebase.
+ * @param tag A string associated with the job for debugging/logging purposes.
+ * @param numFailures Count of how many times this job has requested a reschedule because
+ * its work was not yet finished.
+ * @param earliestRunTimeElapsedMillis Milestone: earliest point in time at which the job
+ * is to be considered runnable
+ * @param latestRunTimeElapsedMillis Milestone: point in time at which the job will be
+ * considered overdue
+ * @param lastSuccessfulRunTime When did we last run this job to completion?
+ * @param lastFailedRunTime When did we last run this job only to have it stop incomplete?
+ * @param internalFlags Non-API property flags about this job
+ */
private JobStatus(JobInfo job, int callingUid, int targetSdkVersion, String sourcePackageName,
int sourceUserId, int standbyBucket, long heartbeat, String tag, int numFailures,
long earliestRunTimeElapsedMillis, long latestRunTimeElapsedMillis,
@@ -399,8 +431,8 @@ public final class JobStatus {
/**
* Create a newly scheduled job.
* @param callingUid Uid of the package that scheduled this job.
- * @param sourcePkg Package name on whose behalf this job is scheduled. Null indicates
- * the calling package is the source.
+ * @param sourcePkg Package name of the app that will actually run the job. Null indicates
+ * that the calling package is the source.
* @param sourceUserId User id for whom this job is scheduled. -1 indicates this is same as the
* caller.
*/
diff --git a/services/core/java/com/android/server/location/FlpHardwareProvider.java b/services/core/java/com/android/server/location/FlpHardwareProvider.java
deleted file mode 100644
index 5c9b0eaa29cc..000000000000
--- a/services/core/java/com/android/server/location/FlpHardwareProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.location;
-
-import android.content.Context;
-import android.hardware.location.IFusedLocationHardware;
-import android.location.IFusedGeofenceHardware;
-import android.util.Log;
-
-/**
- * This class was an interop layer for JVM types and the JNI code that interacted
- * with the FLP HAL implementation.
- *
- * Now, after Treble FLP & GNSS HAL simplification, it is a thin shell that acts like the
- * pre-existing cases where there was no FLP Hardware support, to keep legacy users of this
- * class operating.
- *
- * {@hide}
- * {@Deprecated}
- */
-public class FlpHardwareProvider {
- private static FlpHardwareProvider sSingletonInstance = null;
-
- private final static String TAG = "FlpHardwareProvider";
-
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- public static FlpHardwareProvider getInstance(Context context) {
- if (sSingletonInstance == null) {
- sSingletonInstance = new FlpHardwareProvider();
- if (DEBUG) Log.d(TAG, "getInstance() created empty provider");
- }
- return sSingletonInstance;
- }
-
- private FlpHardwareProvider() {
- }
-
- public static boolean isSupported() {
- if (DEBUG) Log.d(TAG, "isSupported() returning false");
- return false;
- }
-
- /**
- * Interface implementations for services built on top of this functionality.
- */
- public static final String LOCATION = "Location";
-
- public IFusedLocationHardware getLocationHardware() {
- return null;
- }
-
- public IFusedGeofenceHardware getGeofenceHardware() {
- return null;
- }
-
- public void cleanup() {
- if (DEBUG) Log.d(TAG, "empty cleanup()");
- }
-}
diff --git a/services/core/java/com/android/server/location/FusedLocationHardwareSecure.java b/services/core/java/com/android/server/location/FusedLocationHardwareSecure.java
deleted file mode 100644
index a08d3263be6c..000000000000
--- a/services/core/java/com/android/server/location/FusedLocationHardwareSecure.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.location;
-
-import android.content.Context;
-import android.hardware.location.IFusedLocationHardware;
-import android.hardware.location.IFusedLocationHardwareSink;
-import android.location.FusedBatchOptions;
-import android.os.RemoteException;
-
-/**
- * FusedLocationHardware decorator that adds permission checking.
- * @hide
- */
-public class FusedLocationHardwareSecure extends IFusedLocationHardware.Stub {
- private final IFusedLocationHardware mLocationHardware;
- private final Context mContext;
- private final String mPermissionId;
-
- public FusedLocationHardwareSecure(
- IFusedLocationHardware locationHardware,
- Context context,
- String permissionId) {
- mLocationHardware = locationHardware;
- mContext = context;
- mPermissionId = permissionId;
- }
-
- private void checkPermissions() {
- mContext.enforceCallingPermission(
- mPermissionId,
- String.format(
- "Permission '%s' not granted to access FusedLocationHardware",
- mPermissionId));
- }
-
- @Override
- public void registerSink(IFusedLocationHardwareSink eventSink) throws RemoteException {
- checkPermissions();
- mLocationHardware.registerSink(eventSink);
- }
-
- @Override
- public void unregisterSink(IFusedLocationHardwareSink eventSink) throws RemoteException {
- checkPermissions();
- mLocationHardware.unregisterSink(eventSink);
- }
-
- @Override
- public int getSupportedBatchSize() throws RemoteException {
- checkPermissions();
- return mLocationHardware.getSupportedBatchSize();
- }
-
- @Override
- public void startBatching(int id, FusedBatchOptions batchOptions) throws RemoteException {
- checkPermissions();
- mLocationHardware.startBatching(id, batchOptions);
- }
-
- @Override
- public void stopBatching(int id) throws RemoteException {
- checkPermissions();
- mLocationHardware.stopBatching(id);
- }
-
- @Override
- public void updateBatchingOptions(
- int id,
- FusedBatchOptions batchoOptions
- ) throws RemoteException {
- checkPermissions();
- mLocationHardware.updateBatchingOptions(id, batchoOptions);
- }
-
- @Override
- public void requestBatchOfLocations(int batchSizeRequested) throws RemoteException {
- checkPermissions();
- mLocationHardware.requestBatchOfLocations(batchSizeRequested);
- }
-
- @Override
- public boolean supportsDiagnosticDataInjection() throws RemoteException {
- checkPermissions();
- return mLocationHardware.supportsDiagnosticDataInjection();
- }
-
- @Override
- public void injectDiagnosticData(String data) throws RemoteException {
- checkPermissions();
- mLocationHardware.injectDiagnosticData(data);
- }
-
- @Override
- public boolean supportsDeviceContextInjection() throws RemoteException {
- checkPermissions();
- return mLocationHardware.supportsDeviceContextInjection();
- }
-
- @Override
- public void injectDeviceContext(int deviceEnabledContext) throws RemoteException {
- checkPermissions();
- mLocationHardware.injectDeviceContext(deviceEnabledContext);
- }
-
- @Override
- public void flushBatchedLocations() throws RemoteException {
- checkPermissions();
- mLocationHardware.flushBatchedLocations();
- }
-
- @Override
- public int getVersion() throws RemoteException {
- checkPermissions();
- return mLocationHardware.getVersion();
- }
-}
diff --git a/services/core/java/com/android/server/location/FusedProxy.java b/services/core/java/com/android/server/location/FusedProxy.java
deleted file mode 100644
index b90f037a5046..000000000000
--- a/services/core/java/com/android/server/location/FusedProxy.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (The "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.location;
-
-import com.android.server.ServiceWatcher;
-
-import android.Manifest;
-import android.content.Context;
-import android.hardware.location.IFusedLocationHardware;
-import android.location.IFusedProvider;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * Proxy that helps bind GCore FusedProvider implementations to the Fused Hardware instances.
- *
- * @hide
- */
-public final class FusedProxy {
- private final String TAG = "FusedProxy";
- private final ServiceWatcher mServiceWatcher;
- private final FusedLocationHardwareSecure mLocationHardware;
-
- /**
- * Constructor of the class.
- * This is private as the class follows a factory pattern for construction.
- *
- * @param context The context needed for construction.
- * @param handler The handler needed for construction.
- * @param locationHardware The instance of the Fused location hardware assigned to the proxy.
- */
- private FusedProxy(
- Context context,
- Handler handler,
- IFusedLocationHardware locationHardware,
- int overlaySwitchResId,
- int defaultServicePackageNameResId,
- int initialPackageNameResId) {
- mLocationHardware = new FusedLocationHardwareSecure(
- locationHardware,
- context,
- Manifest.permission.LOCATION_HARDWARE);
- Runnable newServiceWork = new Runnable() {
- @Override
- public void run() {
- bindProvider(mLocationHardware);
- }
- };
-
- // prepare the connection to the provider
- mServiceWatcher = new ServiceWatcher(
- context,
- TAG,
- "com.android.location.service.FusedProvider",
- overlaySwitchResId,
- defaultServicePackageNameResId,
- initialPackageNameResId,
- newServiceWork,
- handler);
- }
-
- /**
- * Creates an instance of the proxy and binds it to the appropriate FusedProvider.
- *
- * @param context The context needed for construction.
- * @param handler The handler needed for construction.
- * @param locationHardware The instance of the Fused location hardware assigned to the proxy.
- *
- * @return An instance of the proxy if it could be bound, null otherwise.
- */
- public static FusedProxy createAndBind(
- Context context,
- Handler handler,
- IFusedLocationHardware locationHardware,
- int overlaySwitchResId,
- int defaultServicePackageNameResId,
- int initialPackageNameResId) {
- FusedProxy fusedProxy = new FusedProxy(
- context,
- handler,
- locationHardware,
- overlaySwitchResId,
- defaultServicePackageNameResId,
- initialPackageNameResId);
-
- // try to bind the Fused provider
- if (!fusedProxy.mServiceWatcher.start()) {
- return null;
- }
-
- return fusedProxy;
- }
-
- /**
- * Helper function to bind the FusedLocationHardware to the appropriate FusedProvider instance.
- *
- * @param locationHardware The FusedLocationHardware instance to use for the binding operation.
- */
- private void bindProvider(IFusedLocationHardware locationHardware) {
- if (!mServiceWatcher.runOnBinder(new ServiceWatcher.BinderRunner() {
- @Override
- public void run(IBinder binder) {
- IFusedProvider provider = IFusedProvider.Stub.asInterface(binder);
- try {
- provider.onFusedLocationHardwareChange(locationHardware);
- } catch (RemoteException e) {
- Log.e(TAG, e.toString());
- }
- }
- })) {
- Log.e(TAG, "No instance of FusedProvider found on FusedLocationHardware connected.");
- }
- }
-}
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 729ac0c68662..3374b30448d4 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -423,8 +423,8 @@ public class GnssLocationProvider implements LocationProviderInterface {
private final GnssStatusListenerHelper mListenerHelper;
private final GnssMeasurementsProvider mGnssMeasurementsProvider;
private final GnssNavigationMessageProvider mGnssNavigationMessageProvider;
- private final FusedLocationListener mFusedLocationListener = new FusedLocationListener();
- private static int sNumFusedLocationUpdatesRequests = 0;
+ private final LocationChangeListener mNetworkLocationListener = new NetworkLocationListener();
+ private final LocationChangeListener mFusedLocationListener = new FusedLocationListener();
// Handler for processing events
private Handler mHandler;
@@ -470,7 +470,7 @@ public class GnssLocationProvider implements LocationProviderInterface {
// Volatile for simple inter-thread sync on these values.
private volatile int mHardwareYear = 0;
- private volatile String mHardwareModelName = LocationManager.GNSS_HARDWARE_MODEL_NAME_UNKNOWN;
+ private volatile String mHardwareModelName;
// Set lower than the current ITAR limit of 600m/s to allow this to trigger even if GPS HAL
// stops output right at 600m/s, depriving this of the information of a device that reaches
@@ -1097,30 +1097,31 @@ public class GnssLocationProvider implements LocationProviderInterface {
LocationManager locationManager = (LocationManager) mContext.getSystemService(
Context.LOCATION_SERVICE);
+ String provider;
+ LocationChangeListener locationListener;
if (independentFromGnss) {
// For fast GNSS TTFF
- Location networkLocation = getLastFreshLocation(locationManager,
- LocationManager.NETWORK_PROVIDER);
- if (networkLocation != null) {
- handleUpdateLocation(networkLocation);
- return;
- }
- locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,
- new NetworkLocationListener(),
- mHandler.getLooper());
+ provider = LocationManager.NETWORK_PROVIDER;
+ locationListener = mNetworkLocationListener;
} else {
// For Device-Based Hybrid (E911)
- locationManager.requestLocationUpdates(LocationManager.FUSED_PROVIDER,
- LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS, /*minDistance=*/ 0,
- mFusedLocationListener, mHandler.getLooper());
- sNumFusedLocationUpdatesRequests++;
- mHandler.postDelayed(() -> {
- if (--sNumFusedLocationUpdatesRequests == 0) {
- locationManager.removeUpdates(mFusedLocationListener);
- }
- }, LOCATION_UPDATE_DURATION_MILLIS);
+ provider = LocationManager.FUSED_PROVIDER;
+ locationListener = mFusedLocationListener;
}
+
+ Log.i(TAG,
+ String.format("GNSS HAL Requesting location updates from %s provider.", provider));
+ locationManager.requestLocationUpdates(provider,
+ LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS, /*minDistance=*/ 0,
+ locationListener, mHandler.getLooper());
+ locationListener.numLocationUpdateRequest++;
+ mHandler.postDelayed(() -> {
+ if (--locationListener.numLocationUpdateRequest == 0) {
+ Log.i(TAG, String.format("Removing location updates from %s provider.", provider));
+ locationManager.removeUpdates(locationListener);
+ }
+ }, LOCATION_UPDATE_DURATION_MILLIS);
}
private void injectBestLocation(Location location) {
@@ -1721,7 +1722,9 @@ public class GnssLocationProvider implements LocationProviderInterface {
if (mItarSpeedLimitExceeded) {
Log.i(TAG, "Hal reported a speed in excess of ITAR limit." +
" GPS/GNSS Navigation output blocked.");
- mGnssMetrics.logReceivedLocationStatus(false);
+ if (mStarted) {
+ mGnssMetrics.logReceivedLocationStatus(false);
+ }
return; // No output of location allowed
}
@@ -1738,14 +1741,16 @@ public class GnssLocationProvider implements LocationProviderInterface {
Log.e(TAG, "RemoteException calling reportLocation");
}
- mGnssMetrics.logReceivedLocationStatus(hasLatLong);
- if (hasLatLong) {
- if (location.hasAccuracy()) {
- mGnssMetrics.logPositionAccuracyMeters(location.getAccuracy());
- }
- if (mTimeToFirstFix > 0) {
- int timeBetweenFixes = (int) (SystemClock.elapsedRealtime() - mLastFixTime);
- mGnssMetrics.logMissedReports(mFixInterval, timeBetweenFixes);
+ if (mStarted) {
+ mGnssMetrics.logReceivedLocationStatus(hasLatLong);
+ if (hasLatLong) {
+ if (location.hasAccuracy()) {
+ mGnssMetrics.logPositionAccuracyMeters(location.getAccuracy());
+ }
+ if (mTimeToFirstFix > 0) {
+ int timeBetweenFixes = (int) (SystemClock.elapsedRealtime() - mLastFixTime);
+ mGnssMetrics.logMissedReports(mFixInterval, timeBetweenFixes);
+ }
}
}
@@ -1754,7 +1759,9 @@ public class GnssLocationProvider implements LocationProviderInterface {
if (mTimeToFirstFix == 0 && hasLatLong) {
mTimeToFirstFix = (int) (mLastFixTime - mFixRequestTime);
if (DEBUG) Log.d(TAG, "TTFF: " + mTimeToFirstFix);
- mGnssMetrics.logTimeToFirstFixMilliSecs(mTimeToFirstFix);
+ if (mStarted) {
+ mGnssMetrics.logTimeToFirstFixMilliSecs(mTimeToFirstFix);
+ }
// notify status listeners
mListenerHelper.onFirstFix(mTimeToFirstFix);
@@ -2597,6 +2604,8 @@ public class GnssLocationProvider implements LocationProviderInterface {
}
private abstract class LocationChangeListener implements LocationListener {
+ int numLocationUpdateRequest;
+
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@@ -2624,7 +2633,6 @@ public class GnssLocationProvider implements LocationProviderInterface {
@Override
public void onLocationChanged(Location location) {
if (LocationManager.FUSED_PROVIDER.equals(location.getProvider())) {
- Log.d(TAG, "fused location listener: " + location);
injectBestLocation(location);
}
}
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 74ebf3e44616..b5eb8bf3e2a7 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -2033,13 +2033,7 @@ public class LockSettingsService extends ILockSettings.Stub {
public int[] getPendingRecoverySecretTypes() throws RemoteException {
throw new SecurityException("Not implemented");
}
-
- @Override
- public void recoverySecretAvailable(@NonNull KeyChainProtectionParams recoverySecret)
- throws RemoteException {
- mRecoverableKeyStoreManager.recoverySecretAvailable(recoverySecret);
- }
-
+
@Override
public byte[] startRecoverySession(@NonNull String sessionId,
@NonNull byte[] verifierPublicKey, @NonNull byte[] vaultParams,
@@ -2051,11 +2045,13 @@ public class LockSettingsService extends ILockSettings.Stub {
@Override
public byte[] startRecoverySessionWithCertPath(@NonNull String sessionId,
- @NonNull RecoveryCertPath verifierCertPath, @NonNull byte[] vaultParams,
- @NonNull byte[] vaultChallenge, @NonNull List<KeyChainProtectionParams> secrets)
+ @NonNull String rootCertificateAlias, @NonNull RecoveryCertPath verifierCertPath,
+ @NonNull byte[] vaultParams, @NonNull byte[] vaultChallenge,
+ @NonNull List<KeyChainProtectionParams> secrets)
throws RemoteException {
return mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
- sessionId, verifierCertPath, vaultParams, vaultChallenge, secrets);
+ sessionId, rootCertificateAlias, verifierCertPath, vaultParams, vaultChallenge,
+ secrets);
}
public void closeSession(@NonNull String sessionId) throws RemoteException {
@@ -2063,11 +2059,19 @@ public class LockSettingsService extends ILockSettings.Stub {
}
@Override
+ public Map<String, String> recoverKeyChainSnapshot(
+ @NonNull String sessionId,
+ @NonNull byte[] recoveryKeyBlob,
+ @NonNull List<WrappedApplicationKey> applicationKeys) throws RemoteException {
+ return mRecoverableKeyStoreManager.recoverKeyChainSnapshot(
+ sessionId, recoveryKeyBlob, applicationKeys);
+ }
+
+ @Override
public Map<String, byte[]> recoverKeys(@NonNull String sessionId,
@NonNull byte[] recoveryKeyBlob, @NonNull List<WrappedApplicationKey> applicationKeys)
throws RemoteException {
- return mRecoverableKeyStoreManager.recoverKeys(
- sessionId, recoveryKeyBlob, applicationKeys);
+ return mRecoverableKeyStoreManager.recoverKeys(sessionId, recoveryKeyBlob, applicationKeys);
}
@Override
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
index f46657c15b5a..a87adbde31e6 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
@@ -255,9 +255,6 @@ public class KeySyncTask implements Runnable {
}
}
- // TODO: make sure the same counter id is used during recovery and remove temporary fix.
- counterId = 1L;
-
byte[] vaultParams = KeySyncUtils.packVaultParams(
publicKey,
counterId,
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
index a7d32ed268cd..57fb74db076a 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
@@ -61,8 +61,6 @@ public class KeySyncUtils {
private static final byte[] THM_KF_HASH_PREFIX = "THM_KF_hash".getBytes(StandardCharsets.UTF_8);
private static final int KEY_CLAIMANT_LENGTH_BYTES = 16;
- private static final int VAULT_PARAMS_LENGTH_BYTES = 94;
- private static final int VAULT_HANDLE_LENGTH_BYTES = 17;
/**
* Encrypts the recovery key using both the lock screen hash and the remote storage's public
@@ -298,8 +296,12 @@ public class KeySyncUtils {
*/
public static byte[] packVaultParams(
PublicKey thmPublicKey, long counterId, int maxAttempts, byte[] vaultHandle) {
- // TODO: Check if vaultHandle has exactly the length of VAULT_HANDLE_LENGTH_BYTES somewhere
- return ByteBuffer.allocate(VAULT_PARAMS_LENGTH_BYTES)
+ int vaultParamsLength
+ = 65 // public key
+ + 8 // counterId
+ + 4 // maxAttempts
+ + vaultHandle.length;
+ return ByteBuffer.allocate(vaultParamsLength)
.order(ByteOrder.LITTLE_ENDIAN)
.put(SecureBox.encodePublicKey(thmPublicKey))
.putLong(counterId)
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
index 20f3403c56c5..e75722af95ae 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
@@ -31,6 +31,7 @@ import android.annotation.Nullable;
import android.app.PendingIntent;
import android.content.Context;
import android.os.Binder;
+import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.os.UserHandle;
@@ -38,19 +39,21 @@ import android.security.keystore.recovery.KeyChainProtectionParams;
import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.RecoveryController;
+import android.security.keystore.recovery.TrustedRootCertificates;
import android.security.keystore.recovery.WrappedApplicationKey;
import android.security.KeyStore;
+import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.HexDump;
+import com.android.internal.util.Preconditions;
import com.android.server.locksettings.recoverablekeystore.certificate.CertUtils;
import com.android.server.locksettings.recoverablekeystore.certificate.SigXml;
import com.android.server.locksettings.recoverablekeystore.storage.ApplicationKeyStorage;
import com.android.server.locksettings.recoverablekeystore.certificate.CertParsingException;
import com.android.server.locksettings.recoverablekeystore.certificate.CertValidationException;
import com.android.server.locksettings.recoverablekeystore.certificate.CertXml;
-import com.android.server.locksettings.recoverablekeystore.certificate.TrustedRootCert;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverySessionStorage;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverySnapshotStorage;
@@ -60,10 +63,12 @@ import java.security.KeyFactory;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
+import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertPath;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
@@ -200,20 +205,25 @@ public class RecoverableKeyStoreManager {
}
Log.i(TAG, "Updating the certificate with the new serial number " + newSerial);
+ // Randomly choose and validate an endpoint certificate from the list
CertPath certPath;
+ X509Certificate rootCert = getRootCertificate(rootCertificateAlias);
try {
Log.d(TAG, "Getting and validating a random endpoint certificate");
- certPath = certXml.getRandomEndpointCert(TrustedRootCert.TRUSTED_ROOT_CERT);
+ certPath = certXml.getRandomEndpointCert(rootCert);
} catch (CertValidationException e) {
Log.e(TAG, "Invalid endpoint cert", e);
throw new ServiceSpecificException(
ERROR_INVALID_CERTIFICATE, "Failed to validate certificate.");
}
+
+ // Save the chosen and validated certificate into database
try {
Log.d(TAG, "Saving the randomly chosen endpoint certificate to database");
if (mDatabase.setRecoveryServiceCertPath(userId, uid, certPath) > 0) {
mDatabase.setRecoveryServiceCertSerial(userId, uid, newSerial);
mDatabase.setShouldCreateSnapshot(userId, uid, true);
+ mDatabase.setCounterId(userId, uid, new SecureRandom().nextLong());
}
} catch (CertificateEncodingException e) {
Log.e(TAG, "Failed to encode CertPath", e);
@@ -237,11 +247,11 @@ public class RecoverableKeyStoreManager {
@NonNull String rootCertificateAlias, @NonNull byte[] recoveryServiceCertFile,
@NonNull byte[] recoveryServiceSigFile)
throws RemoteException {
- if (recoveryServiceCertFile == null || recoveryServiceSigFile == null) {
- Log.d(TAG, "The given cert or sig file is null");
- throw new ServiceSpecificException(
- ERROR_BAD_CERTIFICATE_FORMAT, "The given cert or sig file is null.");
+ if (rootCertificateAlias == null) {
+ Log.e(TAG, "rootCertificateAlias is null");
}
+ Preconditions.checkNotNull(recoveryServiceCertFile, "recoveryServiceCertFile is null");
+ Preconditions.checkNotNull(recoveryServiceSigFile, "recoveryServiceSigFile is null");
SigXml sigXml;
try {
@@ -253,8 +263,9 @@ public class RecoverableKeyStoreManager {
ERROR_BAD_CERTIFICATE_FORMAT, "Failed to parse the sig file.");
}
+ X509Certificate rootCert = getRootCertificate(rootCertificateAlias);
try {
- sigXml.verifyFileSignature(TrustedRootCert.TRUSTED_ROOT_CERT, recoveryServiceCertFile);
+ sigXml.verifyFileSignature(rootCert, recoveryServiceCertFile);
} catch (CertValidationException e) {
Log.d(TAG, "The signature over the cert file is invalid."
+ " Cert: " + HexDump.toHexString(recoveryServiceCertFile)
@@ -283,11 +294,11 @@ public class RecoverableKeyStoreManager {
/**
* Gets all data necessary to recover application keys on new device.
*
- * @return recovery data
+ * @return KeyChain Snapshot.
+ * @throws ServiceSpecificException if no snapshot is pending.
* @hide
*/
- public @NonNull
- KeyChainSnapshot getKeyChainSnapshot()
+ public @NonNull KeyChainSnapshot getKeyChainSnapshot()
throws RemoteException {
checkRecoverKeyStorePermission();
int uid = Binder.getCallingUid();
@@ -317,7 +328,7 @@ public class RecoverableKeyStoreManager {
throw new UnsupportedOperationException();
}
- public void setServerParams(byte[] serverParams) throws RemoteException {
+ public void setServerParams(@NonNull byte[] serverParams) throws RemoteException {
checkRecoverKeyStorePermission();
int userId = UserHandle.getCallingUserId();
int uid = Binder.getCallingUid();
@@ -330,8 +341,9 @@ public class RecoverableKeyStoreManager {
/**
* Sets the recovery status of key with {@code alias} to {@code status}.
*/
- public void setRecoveryStatus(String alias, int status) throws RemoteException {
+ public void setRecoveryStatus(@NonNull String alias, int status) throws RemoteException {
checkRecoverKeyStorePermission();
+ Preconditions.checkNotNull(alias, "alias is null");
mDatabase.setRecoveryStatus(Binder.getCallingUid(), alias, status);
}
@@ -356,6 +368,7 @@ public class RecoverableKeyStoreManager {
@NonNull @KeyChainProtectionParams.UserSecretType int[] secretTypes)
throws RemoteException {
checkRecoverKeyStorePermission();
+ Preconditions.checkNotNull(secretTypes, "secretTypes is null");
int userId = UserHandle.getCallingUserId();
int uid = Binder.getCallingUid();
long updatedRows = mDatabase.setRecoverySecretTypes(userId, uid, secretTypes);
@@ -408,8 +421,8 @@ public class RecoverableKeyStoreManager {
* @param vaultChallenge Challenge issued by vault service.
* @param secrets Lock-screen hashes. For now only a single secret is supported.
* @return Encrypted bytes of recovery claim. This can then be issued to the vault service.
- * @deprecated Use {@link #startRecoverySessionWithCertPath(String, RecoveryCertPath, byte[],
- * byte[], List)} instead.
+ * @deprecated Use {@link #startRecoverySessionWithCertPath(String, String, RecoveryCertPath,
+ * byte[], byte[], List)} instead.
*
* @hide
*/
@@ -449,6 +462,7 @@ public class RecoverableKeyStoreManager {
uid,
new RecoverySessionStorage.Entry(sessionId, kfHash, keyClaimant, vaultParams));
+ Log.i(TAG, "Received VaultParams for recovery: " + HexDump.toHexString(vaultParams));
try {
byte[] thmKfHash = KeySyncUtils.calculateThmKfHash(kfHash);
return KeySyncUtils.encryptRecoveryClaim(
@@ -479,13 +493,21 @@ public class RecoverableKeyStoreManager {
*/
public @NonNull byte[] startRecoverySessionWithCertPath(
@NonNull String sessionId,
+ @NonNull String rootCertificateAlias,
@NonNull RecoveryCertPath verifierCertPath,
@NonNull byte[] vaultParams,
@NonNull byte[] vaultChallenge,
@NonNull List<KeyChainProtectionParams> secrets)
throws RemoteException {
checkRecoverKeyStorePermission();
-
+ if (rootCertificateAlias == null) {
+ Log.e(TAG, "rootCertificateAlias is null");
+ }
+ Preconditions.checkNotNull(sessionId, "invalid session");
+ Preconditions.checkNotNull(verifierCertPath, "verifierCertPath is null");
+ Preconditions.checkNotNull(vaultParams, "vaultParams is null");
+ Preconditions.checkNotNull(vaultChallenge, "vaultChallenge is null");
+ Preconditions.checkNotNull(secrets, "secrets is null");
CertPath certPath;
try {
certPath = verifierCertPath.getCertPath();
@@ -495,11 +517,10 @@ public class RecoverableKeyStoreManager {
}
try {
- CertUtils.validateCertPath(TrustedRootCert.TRUSTED_ROOT_CERT, certPath);
+ CertUtils.validateCertPath(getRootCertificate(rootCertificateAlias), certPath);
} catch (CertValidationException e) {
Log.e(TAG, "Failed to validate the given cert path", e);
- // TODO: Change this to ERROR_INVALID_CERTIFICATE once ag/3666620 is submitted
- throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, e.getMessage());
+ throw new ServiceSpecificException(ERROR_INVALID_CERTIFICATE, e.getMessage());
}
byte[] verifierPublicKey = certPath.getCertificates().get(0).getPublicKey().getEncoded();
@@ -532,6 +553,9 @@ public class RecoverableKeyStoreManager {
@NonNull List<WrappedApplicationKey> applicationKeys)
throws RemoteException {
checkRecoverKeyStorePermission();
+ Preconditions.checkNotNull(sessionId, "invalid session");
+ Preconditions.checkNotNull(encryptedRecoveryKey, "encryptedRecoveryKey is null");
+ Preconditions.checkNotNull(applicationKeys, "encryptedRecoveryKey is null");
int uid = Binder.getCallingUid();
RecoverySessionStorage.Entry sessionEntry = mRecoverySessionStorage.get(uid, sessionId);
if (sessionEntry == null) {
@@ -550,6 +574,78 @@ public class RecoverableKeyStoreManager {
}
/**
+ * Invoked by a recovery agent after a successful recovery claim is sent to the remote vault
+ * service.
+ *
+ * @param sessionId The session ID used to generate the claim. See
+ * {@link #startRecoverySession(String, byte[], byte[], byte[], List)}.
+ * @param encryptedRecoveryKey The encrypted recovery key blob returned by the remote vault
+ * service.
+ * @param applicationKeys The encrypted key blobs returned by the remote vault service. These
+ * were wrapped with the recovery key.
+ * @throws RemoteException if an error occurred recovering the keys.
+ */
+ public Map<String, String> recoverKeyChainSnapshot(
+ @NonNull String sessionId,
+ @NonNull byte[] encryptedRecoveryKey,
+ @NonNull List<WrappedApplicationKey> applicationKeys) throws RemoteException {
+ checkRecoverKeyStorePermission();
+ int userId = UserHandle.getCallingUserId();
+ int uid = Binder.getCallingUid();
+ RecoverySessionStorage.Entry sessionEntry = mRecoverySessionStorage.get(uid, sessionId);
+ if (sessionEntry == null) {
+ throw new ServiceSpecificException(ERROR_SESSION_EXPIRED,
+ String.format(Locale.US,
+ "Application uid=%d does not have pending session '%s'",
+ uid,
+ sessionId));
+ }
+
+ try {
+ byte[] recoveryKey = decryptRecoveryKey(sessionEntry, encryptedRecoveryKey);
+ Map<String, byte[]> keysByAlias = recoverApplicationKeys(recoveryKey, applicationKeys);
+ return importKeyMaterials(userId, uid, keysByAlias);
+ } catch (KeyStoreException e) {
+ throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage());
+ } finally {
+ sessionEntry.destroy();
+ mRecoverySessionStorage.remove(uid);
+ }
+ }
+
+ /**
+ * Imports the key materials, returning a map from alias to grant alias for the calling user.
+ *
+ * @param userId The calling user ID.
+ * @param uid The calling uid.
+ * @param keysByAlias The key materials, keyed by alias.
+ * @throws KeyStoreException if an error occurs importing the key or getting the grant.
+ */
+ private Map<String, String> importKeyMaterials(
+ int userId, int uid, Map<String, byte[]> keysByAlias) throws KeyStoreException {
+ ArrayMap<String, String> grantAliasesByAlias = new ArrayMap<>(keysByAlias.size());
+ for (String alias : keysByAlias.keySet()) {
+ mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, keysByAlias.get(alias));
+ String grantAlias = getAlias(userId, uid, alias);
+ Log.i(TAG, String.format(Locale.US, "Import %s -> %s", alias, grantAlias));
+ grantAliasesByAlias.put(alias, grantAlias);
+ }
+ return grantAliasesByAlias;
+ }
+
+ /**
+ * Returns an alias for the key.
+ *
+ * @param userId The user ID of the calling process.
+ * @param uid The uid of the calling process.
+ * @param alias The alias of the key.
+ * @return The alias in the calling process's keystore.
+ */
+ private String getAlias(int userId, int uid, String alias) {
+ return mApplicationKeyStorage.getGrantAlias(userId, uid, alias);
+ }
+
+ /**
* Deprecated
* Generates a key named {@code alias} in the recoverable store for the calling uid. Then
* returns the raw key material.
@@ -586,10 +682,13 @@ public class RecoverableKeyStoreManager {
* Destroys the session with the given {@code sessionId}.
*/
public void closeSession(@NonNull String sessionId) throws RemoteException {
+ checkRecoverKeyStorePermission();
+ Preconditions.checkNotNull(sessionId, "invalid session");
mRecoverySessionStorage.remove(Binder.getCallingUid(), sessionId);
}
public void removeKey(@NonNull String alias) throws RemoteException {
+ Preconditions.checkNotNull(alias, "alias is null");
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
@@ -607,6 +706,7 @@ public class RecoverableKeyStoreManager {
* @return grant alias, which caller can use to access the key.
*/
public String generateKey(@NonNull String alias) throws RemoteException {
+ Preconditions.checkNotNull(alias, "alias is null");
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
@@ -626,7 +726,7 @@ public class RecoverableKeyStoreManager {
byte[] secretKey =
mRecoverableKeyGenerator.generateAndStoreKey(encryptionKey, userId, uid, alias);
mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, secretKey);
- return mApplicationKeyStorage.getGrantAlias(userId, uid, alias);
+ return getAlias(userId, uid, alias);
} catch (KeyStoreException | InvalidKeyException | RecoverableKeyStorageException e) {
throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage());
}
@@ -645,8 +745,9 @@ public class RecoverableKeyStoreManager {
*/
public String importKey(@NonNull String alias, @NonNull byte[] keyBytes)
throws RemoteException {
- if (keyBytes == null ||
- keyBytes.length != RecoverableKeyGenerator.KEY_SIZE_BITS / Byte.SIZE) {
+ Preconditions.checkNotNull(alias, "alias is null");
+ Preconditions.checkNotNull(keyBytes, "keyBytes is null");
+ if (keyBytes.length != RecoverableKeyGenerator.KEY_SIZE_BITS / Byte.SIZE) {
Log.e(TAG, "The given key for import doesn't have the required length "
+ RecoverableKeyGenerator.KEY_SIZE_BITS);
throw new ServiceSpecificException(ERROR_INVALID_KEY_FORMAT,
@@ -677,7 +778,7 @@ public class RecoverableKeyStoreManager {
// Import the key to Android KeyStore and get grant
mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, keyBytes);
- return mApplicationKeyStorage.getGrantAlias(userId, uid, alias);
+ return getAlias(userId, uid, alias);
} catch (KeyStoreException | InvalidKeyException | RecoverableKeyStorageException e) {
throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage());
}
@@ -689,10 +790,10 @@ public class RecoverableKeyStoreManager {
* @return grant alias, which caller can use to access the key.
*/
public String getKey(@NonNull String alias) throws RemoteException {
+ Preconditions.checkNotNull(alias, "alias is null");
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
- String grantAlias = mApplicationKeyStorage.getGrantAlias(userId, uid, alias);
- return grantAlias;
+ return getAlias(userId, uid, alias);
}
private byte[] decryptRecoveryKey(
@@ -837,6 +938,21 @@ public class RecoverableKeyStoreManager {
}
}
+ private X509Certificate getRootCertificate(String rootCertificateAlias) throws RemoteException {
+ if (rootCertificateAlias == null || rootCertificateAlias.isEmpty()) {
+ // Use the default Google Key Vault Service CA certificate if the alias is not provided
+ rootCertificateAlias = TrustedRootCertificates.GOOGLE_CLOUD_KEY_VAULT_SERVICE_V1_ALIAS;
+ }
+
+ X509Certificate rootCertificate =
+ TrustedRootCertificates.getRootCertificate(rootCertificateAlias);
+ if (rootCertificate == null) {
+ throw new ServiceSpecificException(
+ ERROR_INVALID_CERTIFICATE, "The provided root certificate alias is invalid");
+ }
+ return rootCertificate;
+ }
+
private void checkRecoverKeyStorePermission() {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.RECOVER_KEYSTORE,
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/certificate/TrustedRootCert.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/certificate/TrustedRootCert.java
deleted file mode 100644
index 7195d628e4bd..000000000000
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/certificate/TrustedRootCert.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.locksettings.recoverablekeystore.certificate;
-
-import java.security.cert.X509Certificate;
-
-/**
- * Holds the X509 certificate of the trusted root CA cert for the recoverable key store service.
- *
- * TODO: Read the certificate from a PEM file directly and remove this class.
- */
-public final class TrustedRootCert {
-
- private static final String TRUSTED_ROOT_CERT_BASE64 = ""
- + "MIIFJjCCAw6gAwIBAgIJAIobXsJlzhNdMA0GCSqGSIb3DQEBDQUAMCAxHjAcBgNV"
- + "BAMMFUdvb2dsZSBDcnlwdEF1dGhWYXVsdDAeFw0xODAyMDIxOTM5MTRaFw0zODAx"
- + "MjgxOTM5MTRaMCAxHjAcBgNVBAMMFUdvb2dsZSBDcnlwdEF1dGhWYXVsdDCCAiIw"
- + "DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2OT5i40/H7LINg/lq/0G0hR65P"
- + "Q4Mud3OnuVt6UIYV2T18+v6qW1yJd5FcnND/ZKPau4aUAYklqJuSVjOXQD0BjgS2"
- + "98Xa4dSn8Ci1rUR+5tdmrxqbYUdT2ZvJIUMMR6fRoqi+LlAbKECrV+zYQTyLU68w"
- + "V66hQpAButjJKiZzkXjmKLfJ5IWrNEn17XM988rk6qAQn/BYCCQGf3rQuJeksGmA"
- + "N1lJOwNYxmWUyouVwqwZthNEWqTuEyBFMkAT+99PXW7oVDc7oU5cevuihxQWNTYq"
- + "viGB8cck6RW3cmqrDSaJF/E+N0cXFKyYC7FDcggt6k3UrxNKTuySdDEa8+2RTQqU"
- + "Y9npxBlQE+x9Ig56OI1BG3bSBsGdPgjpyHadZeh2tgk+oqlGsSsum24YxaxuSysT"
- + "Qfcu/XhyfUXavfmGrBOXerTzIl5oBh/F5aHTV85M2tYEG0qsPPvSpZAWtdJ/2rca"
- + "OxvhwOL+leZKr8McjXVR00lBsRuKXX4nTUMwya09CO3QHFPFZtZvqjy2HaMOnVLQ"
- + "I6b6dHEfmsHybzVOe3yPEoFQSU9UhUdmi71kwwoanPD3j9fJHmXTx4PzYYBRf1ZE"
- + "o+uPgMPk7CDKQFZLjnR40z1uzu3O8aZ3AKZzP+j7T4XQKJLQLmllKtPgLgNdJyib"
- + "2Glg7QhXH/jBTL6hAgMBAAGjYzBhMB0GA1UdDgQWBBSbZfrqOYH54EJpkdKMZjMc"
- + "z/Hp+DAfBgNVHSMEGDAWgBSbZfrqOYH54EJpkdKMZjMcz/Hp+DAPBgNVHRMBAf8E"
- + "BTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQ0FAAOCAgEAKh9nm/vW"
- + "glMWp3vcCwWwJW286ecREDlI+CjGh5h+f2N4QRrXd/tKE3qQJWCqGx8sFfIUjmI7"
- + "KYdsC2gyQ2cA2zl0w7pB2QkuqE6zVbnh1D17Hwl19IMyAakFaM9ad4/EoH7oQmqX"
- + "nF/f5QXGZw4kf1HcgKgoCHWXjqR8MqHOcXR8n6WFqxjzJf1jxzi6Yo2dZ7PJbnE6"
- + "+kHIJuiCpiHL75v5g1HM41gT3ddFFSrn88ThNPWItT5Z8WpFjryVzank2Yt02LLl"
- + "WqZg9IC375QULc5B58NMnaiVJIDJQ8zoNgj1yaxqtUMnJX570lotO2OXe4ec9aCQ"
- + "DIJ84YLM/qStFdeZ9416E80dchskbDG04GuVJKlzWjxAQNMRFhyaPUSBTLLg+kwP"
- + "t9+AMmc+A7xjtFQLZ9fBYHOBsndJOmeSQeYeckl+z/1WQf7DdwXn/yijon7mxz4z"
- + "cCczfKwTJTwBh3wR5SQr2vQm7qaXM87qxF8PCAZrdZaw5I80QwkgTj0WTZ2/GdSw"
- + "d3o5SyzzBAjpwtG+4bO/BD9h9wlTsHpT6yWOZs4OYAKU5ykQrncI8OyavMggArh3"
- + "/oM58v0orUWINtIc2hBlka36PhATYQiLf+AiWKnwhCaaHExoYKfQlMtXBodNvOK8"
- + "xqx69x05q/qbHKEcTHrsss630vxrp1niXvA=";
-
- /**
- * The X509 certificate of the trusted root CA cert for the recoverable key store service.
- *
- * TODO: Change it to the production certificate root CA before the final launch.
- */
- public static final X509Certificate TRUSTED_ROOT_CERT;
-
- static {
- try {
- TRUSTED_ROOT_CERT = CertUtils.decodeCert(
- CertUtils.decodeBase64(TRUSTED_ROOT_CERT_BASE64));
- } catch (CertParsingException e) {
- // Should not happen
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java
index 3d9762337312..84ddbf778c70 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java
@@ -24,6 +24,7 @@ import android.security.Credentials;
import android.security.keystore.KeyProperties;
import android.security.keystore.KeyProtection;
import android.security.KeyStore;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.locksettings.recoverablekeystore.KeyStoreProxy;
@@ -31,6 +32,8 @@ import com.android.server.locksettings.recoverablekeystore.KeyStoreProxyImpl;
import java.security.KeyStore.SecretKeyEntry;
import java.security.KeyStoreException;
+import java.util.Locale;
+
import javax.crypto.spec.SecretKeySpec;
/**
@@ -40,11 +43,13 @@ import javax.crypto.spec.SecretKeySpec;
* revealing key material
*/
public class ApplicationKeyStorage {
+ private static final String TAG = "RecoverableAppKeyStore";
+
private static final String APPLICATION_KEY_ALIAS_PREFIX =
"com.android.server.locksettings.recoverablekeystore/application/";
- KeyStoreProxy mKeyStore;
- KeyStore mKeystoreService;
+ private final KeyStoreProxy mKeyStore;
+ private final KeyStore mKeystoreService;
public static ApplicationKeyStorage getInstance(KeyStore keystoreService)
throws KeyStoreException {
@@ -65,12 +70,15 @@ public class ApplicationKeyStorage {
public @Nullable String getGrantAlias(int userId, int uid, String alias) {
// Aliases used by {@link KeyStore} are different than used by public API.
// {@code USER_PRIVATE_KEY} prefix is used secret keys.
+ Log.i(TAG, String.format(Locale.US, "Get %d/%d/%s", userId, uid, alias));
String keystoreAlias = Credentials.USER_PRIVATE_KEY + getInternalAlias(userId, uid, alias);
return mKeystoreService.grant(keystoreAlias, uid);
}
public void setSymmetricKeyEntry(int userId, int uid, String alias, byte[] secretKey)
throws KeyStoreException {
+ Log.i(TAG, String.format(Locale.US, "Set %d/%d/%s: %d bytes of key material",
+ userId, uid, alias, secretKey.length));
try {
mKeyStore.setEntry(
getInternalAlias(userId, uid, alias),
@@ -87,6 +95,7 @@ public class ApplicationKeyStorage {
}
public void deleteEntry(int userId, int uid, String alias) {
+ Log.i(TAG, String.format(Locale.US, "Del %d/%d/%s", userId, uid, alias));
try {
mKeyStore.deleteEntry(getInternalAlias(userId, uid, alias));
} catch (KeyStoreException e) {
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshot.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshot.java
deleted file mode 100644
index 52381b8f87d1..000000000000
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshot.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.locksettings.recoverablekeystore.storage;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.security.keystore.recovery.KeyChainProtectionParams;
-import android.security.keystore.recovery.KeyChainSnapshot;
-import android.security.keystore.recovery.KeyDerivationParams;
-import android.security.keystore.recovery.WrappedApplicationKey;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.ArrayUtils;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class provides helper methods serialize and deserialize {@link KeyChainSnapshot}.
- *
- * <p> It is necessary since {@link android.os.Parcelable} is not designed for persistent storage.
- *
- * <p> For every list, length is stored before the elements.
- *
- */
-public class PersistentKeyChainSnapshot {
- private static final int VERSION = 1;
- private static final int NULL_LIST_LENGTH = -1;
-
- private DataInputStream mInput;
- private DataOutputStream mOut;
- private ByteArrayOutputStream mOutStream;
-
- @VisibleForTesting
- PersistentKeyChainSnapshot() {
- }
-
- @VisibleForTesting
- void initReader(byte[] input) {
- mInput = new DataInputStream(new ByteArrayInputStream(input));
- }
-
- @VisibleForTesting
- void initWriter() {
- mOutStream = new ByteArrayOutputStream();
- mOut = new DataOutputStream(mOutStream);
- }
-
- @VisibleForTesting
- byte[] getOutput() {
- return mOutStream.toByteArray();
- }
-
- /**
- * Converts {@link KeyChainSnapshot} to its binary representation.
- *
- * @param snapshot The snapshot.
- *
- * @throws IOException if serialization failed.
- */
- public static byte[] serialize(@NonNull KeyChainSnapshot snapshot) throws IOException {
- PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
- writer.initWriter();
- writer.writeInt(VERSION);
- writer.writeKeyChainSnapshot(snapshot);
- return writer.getOutput();
- }
-
- /**
- * deserializes {@link KeyChainSnapshot}.
- *
- * @input input - byte array produced by {@link serialize} method.
- * @throws IOException if parsing failed.
- */
- public static @NonNull KeyChainSnapshot deserialize(@NonNull byte[] input)
- throws IOException {
- PersistentKeyChainSnapshot reader = new PersistentKeyChainSnapshot();
- reader.initReader(input);
- try {
- int version = reader.readInt();
- if (version != VERSION) {
- throw new IOException("Unsupported version " + version);
- }
- return reader.readKeyChainSnapshot();
- } catch (IOException e) {
- throw new IOException("Malformed KeyChainSnapshot", e);
- }
- }
-
- /**
- * Must be in sync with {@link KeyChainSnapshot.writeToParcel}
- */
- @VisibleForTesting
- void writeKeyChainSnapshot(KeyChainSnapshot snapshot) throws IOException {
- writeInt(snapshot.getSnapshotVersion());
- writeProtectionParamsList(snapshot.getKeyChainProtectionParams());
- writeBytes(snapshot.getEncryptedRecoveryKeyBlob());
- writeKeysList(snapshot.getWrappedApplicationKeys());
-
- writeInt(snapshot.getMaxAttempts());
- writeLong(snapshot.getCounterId());
- writeBytes(snapshot.getServerParams());
- writeBytes(snapshot.getTrustedHardwarePublicKey());
- }
-
- @VisibleForTesting
- KeyChainSnapshot readKeyChainSnapshot() throws IOException {
- int snapshotVersion = readInt();
- List<KeyChainProtectionParams> protectionParams = readProtectionParamsList();
- byte[] encryptedRecoveryKey = readBytes();
- List<WrappedApplicationKey> keysList = readKeysList();
-
- int maxAttempts = readInt();
- long conterId = readLong();
- byte[] serverParams = readBytes();
- byte[] trustedHardwarePublicKey = readBytes();
-
- return new KeyChainSnapshot.Builder()
- .setSnapshotVersion(snapshotVersion)
- .setKeyChainProtectionParams(protectionParams)
- .setEncryptedRecoveryKeyBlob(encryptedRecoveryKey)
- .setWrappedApplicationKeys(keysList)
- .setMaxAttempts(maxAttempts)
- .setCounterId(conterId)
- .setServerParams(serverParams)
- .setTrustedHardwarePublicKey(trustedHardwarePublicKey)
- .build();
- }
-
- @VisibleForTesting
- void writeProtectionParamsList(
- @NonNull List<KeyChainProtectionParams> ProtectionParamsList) throws IOException {
- writeInt(ProtectionParamsList.size());
- for (KeyChainProtectionParams protectionParams : ProtectionParamsList) {
- writeProtectionParams(protectionParams);
- }
- }
-
- @VisibleForTesting
- List<KeyChainProtectionParams> readProtectionParamsList() throws IOException {
- int length = readInt();
- List<KeyChainProtectionParams> result = new ArrayList<>(length);
- for (int i = 0; i < length; i++) {
- result.add(readProtectionParams());
- }
- return result;
- }
-
- /**
- * Must be in sync with {@link KeyChainProtectionParams.writeToParcel}
- */
- @VisibleForTesting
- void writeProtectionParams(@NonNull KeyChainProtectionParams protectionParams)
- throws IOException {
- if (!ArrayUtils.isEmpty(protectionParams.getSecret())) {
- // Extra security check.
- throw new RuntimeException("User generated secret should not be stored");
- }
- writeInt(protectionParams.getUserSecretType());
- writeInt(protectionParams.getLockScreenUiFormat());
- writeKeyDerivationParams(protectionParams.getKeyDerivationParams());
- writeBytes(protectionParams.getSecret());
- }
-
- @VisibleForTesting
- KeyChainProtectionParams readProtectionParams() throws IOException {
- int userSecretType = readInt();
- int lockScreenUiFormat = readInt();
- KeyDerivationParams derivationParams = readKeyDerivationParams();
- byte[] secret = readBytes();
- return new KeyChainProtectionParams.Builder()
- .setUserSecretType(userSecretType)
- .setLockScreenUiFormat(lockScreenUiFormat)
- .setKeyDerivationParams(derivationParams)
- .setSecret(secret)
- .build();
- }
-
- /**
- * Must be in sync with {@link KeyDerivationParams.writeToParcel}
- */
- @VisibleForTesting
- void writeKeyDerivationParams(@NonNull KeyDerivationParams Params) throws IOException {
- writeInt(Params.getAlgorithm());
- writeBytes(Params.getSalt());
- }
-
- @VisibleForTesting
- KeyDerivationParams readKeyDerivationParams() throws IOException {
- int algorithm = readInt();
- byte[] salt = readBytes();
- return KeyDerivationParams.createSha256Params(salt);
- }
-
- @VisibleForTesting
- void writeKeysList(@NonNull List<WrappedApplicationKey> applicationKeys) throws IOException {
- writeInt(applicationKeys.size());
- for (WrappedApplicationKey keyEntry : applicationKeys) {
- writeKeyEntry(keyEntry);
- }
- }
-
- @VisibleForTesting
- List<WrappedApplicationKey> readKeysList() throws IOException {
- int length = readInt();
- List<WrappedApplicationKey> result = new ArrayList<>(length);
- for (int i = 0; i < length; i++) {
- result.add(readKeyEntry());
- }
- return result;
- }
-
- /**
- * Must be in sync with {@link WrappedApplicationKey.writeToParcel}
- */
- @VisibleForTesting
- void writeKeyEntry(@NonNull WrappedApplicationKey keyEntry) throws IOException {
- mOut.writeUTF(keyEntry.getAlias());
- writeBytes(keyEntry.getEncryptedKeyMaterial());
- writeBytes(keyEntry.getAccount());
- }
-
- @VisibleForTesting
- WrappedApplicationKey readKeyEntry() throws IOException {
- String alias = mInput.readUTF();
- byte[] keyMaterial = readBytes();
- byte[] account = readBytes();
- return new WrappedApplicationKey.Builder()
- .setAlias(alias)
- .setEncryptedKeyMaterial(keyMaterial)
- .setAccount(account)
- .build();
- }
-
- @VisibleForTesting
- void writeInt(int value) throws IOException {
- mOut.writeInt(value);
- }
-
- @VisibleForTesting
- int readInt() throws IOException {
- return mInput.readInt();
- }
-
- @VisibleForTesting
- void writeLong(long value) throws IOException {
- mOut.writeLong(value);
- }
-
- @VisibleForTesting
- long readLong() throws IOException {
- return mInput.readLong();
- }
-
- @VisibleForTesting
- void writeBytes(@Nullable byte[] value) throws IOException {
- if (value == null) {
- writeInt(NULL_LIST_LENGTH);
- return;
- }
- writeInt(value.length);
- mOut.write(value, 0, value.length);
- }
-
- /**
- * Reads @code{byte[]} from current position. Converts {@code null} to an empty array.
- */
- @VisibleForTesting
- @NonNull byte[] readBytes() throws IOException {
- int length = readInt();
- if (length == NULL_LIST_LENGTH) {
- return new byte[]{};
- }
- byte[] result = new byte[length];
- mInput.read(result, 0, result.length);
- return result;
- }
-}
-
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java
index 8983ec369f55..2c3d3ab5be4d 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbContract.java
@@ -160,7 +160,6 @@ class RecoverableKeyStoreDbContract {
/**
* Type of secret used to generate recovery key. One of
* {@link android.security.keystore.recovery.KeyChainProtectionParams#TYPE_LOCKSCREEN} or
- * {@link android.security.keystore.recovery.KeyChainProtectionParams#TYPE_CUSTOM_PASSWORD}.
*/
static final String COLUMN_NAME_SECRET_TYPE = "secret_type";
@@ -175,7 +174,7 @@ class RecoverableKeyStoreDbContract {
/**
* The algorithm used to derive cryptographic material from the key and salt. One of
* {@link android.security.keystore.recovery.KeyDerivationParams#ALGORITHM_SHA256} or
- * {@link android.security.keystore.recovery.KeyDerivationParams#ALGORITHM_ARGON2ID}.
+ * {@link android.security.keystore.recovery.KeyDerivationParams#ALGORITHM_SCRYPT}.
*/
static final String COLUMN_NAME_KEY_DERIVATION_ALGORITHM = "key_derivation_algorithm";
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 3b5b1bf5e1e2..7348b849a041 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -608,7 +608,7 @@ public class MediaSessionService extends SystemService implements Monitor {
*/
private void enforceMediaPermissions(ComponentName compName, int pid, int uid,
int resolvedUserId) {
- if (isCurrentVolumeController(uid, pid)) return;
+ if (isCurrentVolumeController(pid, uid)) return;
if (getContext()
.checkPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid)
!= PackageManager.PERMISSION_GRANTED
@@ -618,13 +618,13 @@ public class MediaSessionService extends SystemService implements Monitor {
}
}
- private boolean isCurrentVolumeController(int uid, int pid) {
+ private boolean isCurrentVolumeController(int pid, int uid) {
return getContext().checkPermission(android.Manifest.permission.STATUS_BAR_SERVICE,
pid, uid) == PackageManager.PERMISSION_GRANTED;
}
private void enforceSystemUiPermission(String action, int pid, int uid) {
- if (!isCurrentVolumeController(uid, pid)) {
+ if (!isCurrentVolumeController(pid, uid)) {
throw new SecurityException("Only system ui may " + action);
}
}
@@ -1501,53 +1501,21 @@ public class MediaSessionService extends SystemService implements Monitor {
* Returns if the controller's package is trusted (i.e. has either MEDIA_CONTENT_CONTROL
* permission or an enabled notification listener)
*
- * @param uid uid of the controller app
- * @param packageName package name of the controller app
+ * @param controllerPackageName package name of the controller app
+ * @param controllerPid pid of the controller app
+ * @param controllerUid uid of the controller app
*/
@Override
- public boolean isTrusted(int uid, String packageName) throws RemoteException {
+ public boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid)
+ throws RemoteException {
+ final int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
- int userId = UserHandle.getUserId(uid);
- // Sanity check whether uid and packageName matches
- if (uid != mPackageManager.getPackageUid(packageName, 0, userId)) {
- throw new IllegalArgumentException("uid=" + uid + " and packageName="
- + packageName + " doesn't match");
- }
-
- // Check if it's system server or has MEDIA_CONTENT_CONTROL.
- // Note that system server doesn't have MEDIA_CONTENT_CONTROL, so we need extra
- // check here.
- if (uid == Process.SYSTEM_UID || mPackageManager.checkPermission(
- android.Manifest.permission.MEDIA_CONTENT_CONTROL, packageName, uid)
- == PackageManager.PERMISSION_GRANTED) {
- return true;
- }
- if (DEBUG) {
- Log.d(TAG, packageName + " (uid=" + uid + ") hasn't granted"
- + " MEDIA_CONTENT_CONTROL");
- }
-
- // TODO(jaewan): Add hasEnabledNotificationListener(String pkgName) for
- // optimization (Post-P)
- final List<ComponentName> enabledNotificationListeners =
- mNotificationManager.getEnabledNotificationListeners(userId);
- if (enabledNotificationListeners != null) {
- for (int i = 0; i < enabledNotificationListeners.size(); i++) {
- if (TextUtils.equals(packageName,
- enabledNotificationListeners.get(i).getPackageName())) {
- return true;
- }
- }
- }
+ return hasMediaControlPermission(UserHandle.getUserId(uid), controllerPackageName,
+ controllerPid, controllerUid);
} finally {
Binder.restoreCallingIdentity(token);
}
- if (DEBUG) {
- Log.d(TAG, packageName + " (uid=" + uid + ") doesn't have an enabled notification"
- + " listener");
- }
- return false;
}
/**
@@ -1614,60 +1582,85 @@ public class MediaSessionService extends SystemService implements Monitor {
destroySession2Internal(token);
}
- // TODO(jaewan): Protect this API with permission (b/73226436)
+ // TODO(jaewan): Make this API take userId as an argument (b/73597722)
@Override
public List<Bundle> getSessionTokens(boolean activeSessionOnly,
- boolean sessionServiceOnly) throws RemoteException {
+ boolean sessionServiceOnly, String packageName) throws RemoteException {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+
List<Bundle> tokens = new ArrayList<>();
- synchronized (mLock) {
- for (Map.Entry<SessionToken2, MediaController2> record
- : mSessionRecords.entrySet()) {
- boolean isSessionService = (record.getKey().getType() != TYPE_SESSION);
- boolean isActive = record.getValue() != null;
- if ((activeSessionOnly && !isActive)
- || (sessionServiceOnly && !isSessionService) ){
- continue;
+ try {
+ verifySessionsRequest2(UserHandle.getUserId(uid), packageName, pid, uid);
+ synchronized (mLock) {
+ for (Map.Entry<SessionToken2, MediaController2> record
+ : mSessionRecords.entrySet()) {
+ boolean isSessionService = (record.getKey().getType() != TYPE_SESSION);
+ boolean isActive = record.getValue() != null;
+ if ((activeSessionOnly && !isActive)
+ || (sessionServiceOnly && !isSessionService)) {
+ continue;
+ }
+ tokens.add(record.getKey().toBundle());
}
- tokens.add(record.getKey().toBundle());
}
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
return tokens;
}
- // TODO(jaewan): Protect this API with permission (b/73226436)
- // TODO(jaewan): "userId != calling user" needs extra protection (b/73226436)
@Override
public void addSessionTokensListener(ISessionTokensListener listener, int userId,
- String packageName) {
- synchronized (mLock) {
- final SessionTokensListenerRecord record =
- new SessionTokensListenerRecord(listener, userId);
- try {
- listener.asBinder().linkToDeath(record, 0);
- } catch (RemoteException e) {
+ String packageName) throws RemoteException {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ int resolvedUserId = verifySessionsRequest2(userId, packageName, pid, uid);
+ synchronized (mLock) {
+ final SessionTokensListenerRecord record =
+ new SessionTokensListenerRecord(listener, resolvedUserId);
+ try {
+ listener.asBinder().linkToDeath(record, 0);
+ } catch (RemoteException e) {
+ }
+ mSessionTokensListeners.add(record);
}
- mSessionTokensListeners.add(record);
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
}
- // TODO(jaewan): Protect this API with permission (b/73226436)
+ // TODO(jaewan): Make this API take userId as an argument (b/73597722)
@Override
- public void removeSessionTokensListener(ISessionTokensListener listener) {
- synchronized (mLock) {
- IBinder listenerBinder = listener.asBinder();
- for (SessionTokensListenerRecord record : mSessionTokensListeners) {
- if (listenerBinder.equals(record.mListener.asBinder())) {
- try {
- listenerBinder.unlinkToDeath(record, 0);
- } catch (NoSuchElementException e) {
+ public void removeSessionTokensListener(ISessionTokensListener listener,
+ String packageName) throws RemoteException {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ verifySessionsRequest2(UserHandle.getUserId(uid), packageName, pid, uid);
+ synchronized (mLock) {
+ IBinder listenerBinder = listener.asBinder();
+ for (SessionTokensListenerRecord record : mSessionTokensListeners) {
+ if (listenerBinder.equals(record.mListener.asBinder())) {
+ try {
+ listenerBinder.unlinkToDeath(record, 0);
+ } catch (NoSuchElementException e) {
+ }
+ mSessionTokensListeners.remove(record);
+ break;
}
- mSessionTokensListeners.remove(record);
- break;
}
}
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
}
+ // For MediaSession
private int verifySessionsRequest(ComponentName componentName, int userId, final int pid,
final int uid) {
String packageName = null;
@@ -1687,6 +1680,66 @@ public class MediaSessionService extends SystemService implements Monitor {
return resolvedUserId;
}
+ // For MediaSession2
+ private int verifySessionsRequest2(int targetUserId, String callerPackageName,
+ int callerPid, int callerUid) throws RemoteException {
+ // Check that they can make calls on behalf of the user and get the final user id.
+ int resolvedUserId = ActivityManager.handleIncomingUser(callerPid, callerUid,
+ targetUserId, true /* allowAll */, true /* requireFull */, "getSessionTokens",
+ callerPackageName);
+ // Check if they have the permissions or their component is
+ // enabled for the user they're calling from.
+ if (!hasMediaControlPermission(
+ resolvedUserId, callerPackageName, callerPid, callerUid)) {
+ throw new SecurityException("Missing permission to control media.");
+ }
+ return resolvedUserId;
+ }
+
+ // For MediaSession2
+ private boolean hasMediaControlPermission(int resolvedUserId, String packageName,
+ int pid, int uid) throws RemoteException {
+ // Allow API calls from the System UI
+ if (isCurrentVolumeController(pid, uid)) {
+ return true;
+ }
+
+ // Check if it's system server or has MEDIA_CONTENT_CONTROL.
+ // Note that system server doesn't have MEDIA_CONTENT_CONTROL, so we need extra
+ // check here.
+ if (uid == Process.SYSTEM_UID || getContext().checkPermission(
+ android.Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid)
+ == PackageManager.PERMISSION_GRANTED) {
+ return true;
+ } else if (DEBUG) {
+ Log.d(TAG, packageName + " (uid=" + uid + ") hasn't granted MEDIA_CONTENT_CONTROL");
+ }
+
+ // You may not access another user's content as an enabled listener.
+ final int userId = UserHandle.getUserId(uid);
+ if (resolvedUserId != userId) {
+ return false;
+ }
+
+ // TODO(jaewan): (Post-P) Propose NotificationManager#hasEnabledNotificationListener(
+ // String pkgName) to notification team for optimization
+ final List<ComponentName> enabledNotificationListeners =
+ mNotificationManager.getEnabledNotificationListeners(userId);
+ if (enabledNotificationListeners != null) {
+ for (int i = 0; i < enabledNotificationListeners.size(); i++) {
+ if (TextUtils.equals(packageName,
+ enabledNotificationListeners.get(i).getPackageName())) {
+ return true;
+ }
+ }
+ }
+ if (DEBUG) {
+ Log.d(TAG, packageName + " (uid=" + uid + ") doesn't have an enabled "
+ + "notification listener");
+ }
+ return false;
+ }
+
private void dispatchAdjustVolumeLocked(int suggestedStream, int direction, int flags) {
MediaSessionRecord session = isGlobalPriorityActiveLocked() ? mGlobalPrioritySession
: mCurrentFullUserRecord.mPriorityStack.getDefaultVolumeSession();
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 1db373d42b0e..27eeb93fa3f5 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -959,6 +959,8 @@ public class NotificationManagerService extends SystemService {
boolean queryRemove = false;
boolean packageChanged = false;
boolean cancelNotifications = true;
+ boolean hideNotifications = false;
+ boolean unhideNotifications = false;
int reason = REASON_PACKAGE_CHANGED;
if (action.equals(Intent.ACTION_PACKAGE_ADDED)
@@ -967,7 +969,8 @@ public class NotificationManagerService extends SystemService {
|| (packageChanged=action.equals(Intent.ACTION_PACKAGE_CHANGED))
|| (queryRestart=action.equals(Intent.ACTION_QUERY_PACKAGE_RESTART))
|| action.equals(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE)
- || action.equals(Intent.ACTION_PACKAGES_SUSPENDED)) {
+ || action.equals(Intent.ACTION_PACKAGES_SUSPENDED)
+ || action.equals(Intent.ACTION_PACKAGES_UNSUSPENDED)) {
int changeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
UserHandle.USER_ALL);
String pkgList[] = null;
@@ -980,7 +983,12 @@ public class NotificationManagerService extends SystemService {
uidList = intent.getIntArrayExtra(Intent.EXTRA_CHANGED_UID_LIST);
} else if (action.equals(Intent.ACTION_PACKAGES_SUSPENDED)) {
pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
- reason = REASON_PACKAGE_SUSPENDED;
+ cancelNotifications = false;
+ hideNotifications = true;
+ } else if (action.equals(Intent.ACTION_PACKAGES_UNSUSPENDED)) {
+ pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
+ cancelNotifications = false;
+ unhideNotifications = true;
} else if (queryRestart) {
pkgList = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
uidList = new int[] {intent.getIntExtra(Intent.EXTRA_UID, -1)};
@@ -1022,9 +1030,15 @@ public class NotificationManagerService extends SystemService {
if (cancelNotifications) {
cancelAllNotificationsInt(MY_UID, MY_PID, pkgName, null, 0, 0,
!queryRestart, changeUserId, reason, null);
+ } else if (hideNotifications) {
+ hideNotificationsForPackages(pkgList);
+ } else if (unhideNotifications) {
+ unhideNotificationsForPackages(pkgList);
}
+
}
}
+
mListeners.onPackagesChanged(removingPackage, pkgList, uidList);
mAssistants.onPackagesChanged(removingPackage, pkgList, uidList);
mConditionProviders.onPackagesChanged(removingPackage, pkgList, uidList);
@@ -1294,7 +1308,8 @@ public class NotificationManagerService extends SystemService {
NotificationAssistants notificationAssistants, ConditionProviders conditionProviders,
ICompanionDeviceManager companionManager, SnoozeHelper snoozeHelper,
NotificationUsageStats usageStats, AtomicFile policyFile,
- ActivityManager activityManager, GroupHelper groupHelper, IActivityManager am) {
+ ActivityManager activityManager, GroupHelper groupHelper, IActivityManager am,
+ UsageStatsManagerInternal appUsageStats) {
Resources resources = getContext().getResources();
mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(),
Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE,
@@ -1307,7 +1322,7 @@ public class NotificationManagerService extends SystemService {
mPackageManagerClient = packageManagerClient;
mAppOps = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
mVibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
- mAppUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
+ mAppUsageStats = appUsageStats;
mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
mCompanionManager = companionManager;
mActivityManager = activityManager;
@@ -1449,7 +1464,8 @@ public class NotificationManagerService extends SystemService {
null, snoozeHelper, new NotificationUsageStats(getContext()),
new AtomicFile(new File(systemDir, "notification_policy.xml"), "notification-policy"),
(ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE),
- getGroupHelper(), ActivityManager.getService());
+ getGroupHelper(), ActivityManager.getService(),
+ LocalServices.getService(UsageStatsManagerInternal.class));
// register for various Intents
IntentFilter filter = new IntentFilter();
@@ -1477,6 +1493,7 @@ public class NotificationManagerService extends SystemService {
IntentFilter suspendedPkgFilter = new IntentFilter();
suspendedPkgFilter.addAction(Intent.ACTION_PACKAGES_SUSPENDED);
+ suspendedPkgFilter.addAction(Intent.ACTION_PACKAGES_UNSUSPENDED);
getContext().registerReceiverAsUser(mPackageIntentReceiver, UserHandle.ALL,
suspendedPkgFilter, null, null);
@@ -2484,6 +2501,7 @@ public class NotificationManagerService extends SystemService {
try {
synchronized (mNotificationLock) {
final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
+
if (keys != null) {
final int N = keys.length;
for (int i = 0; i < N; i++) {
@@ -4269,6 +4287,14 @@ public class NotificationManagerService extends SystemService {
}
}
+ @GuardedBy("mNotificationLock")
+ private boolean isPackageSuspendedLocked(NotificationRecord r) {
+ final String pkg = r.sbn.getPackageName();
+ final int callingUid = r.sbn.getUid();
+
+ return isPackageSuspendedForUser(pkg, callingUid);
+ }
+
protected class PostNotificationRunnable implements Runnable {
private final String key;
@@ -4293,6 +4319,8 @@ public class NotificationManagerService extends SystemService {
Slog.i(TAG, "Cannot find enqueued record for key: " + key);
return;
}
+
+ r.setHidden(isPackageSuspendedLocked(r));
NotificationRecord old = mNotificationsByKey.get(key);
final StatusBarNotification n = r.sbn;
final Notification notification = n.getNotification();
@@ -4300,6 +4328,7 @@ public class NotificationManagerService extends SystemService {
if (index < 0) {
mNotificationList.add(r);
mUsageStats.registerPostedByApp(r);
+ r.setInterruptive(true);
} else {
old = mNotificationList.get(index);
mNotificationList.set(index, r);
@@ -4310,6 +4339,7 @@ public class NotificationManagerService extends SystemService {
// revoke uri permissions for changed uris
revokeUriPermissions(r, old);
r.isUpdate = true;
+ r.setInterruptive(isVisuallyInterruptive(old, r));
}
mNotificationsByKey.put(n.getKey(), r);
@@ -4343,7 +4373,7 @@ public class NotificationManagerService extends SystemService {
} else {
Slog.e(TAG, "Not posting notification without small icon: " + notification);
if (old != null && !old.isCanceled) {
- mListeners.notifyRemovedLocked(n,
+ mListeners.notifyRemovedLocked(r,
NotificationListenerService.REASON_ERROR, null);
mHandler.post(new Runnable() {
@Override
@@ -4359,7 +4389,9 @@ public class NotificationManagerService extends SystemService {
+ n.getPackageName());
}
- buzzBeepBlinkLocked(r);
+ if (!r.isHidden()) {
+ buzzBeepBlinkLocked(r);
+ }
maybeRecordInterruptionLocked(r);
} finally {
int N = mEnqueuedNotifications.size();
@@ -4376,6 +4408,52 @@ public class NotificationManagerService extends SystemService {
}
/**
+ * If the notification differs enough visually, consider it a new interruptive notification.
+ */
+ @GuardedBy("mNotificationLock")
+ @VisibleForTesting
+ protected boolean isVisuallyInterruptive(NotificationRecord old, NotificationRecord r) {
+ Notification oldN = old.sbn.getNotification();
+ Notification newN = r.sbn.getNotification();
+ if (oldN.extras == null || newN.extras == null) {
+ return false;
+ }
+ if (!Objects.equals(oldN.extras.get(Notification.EXTRA_TITLE),
+ newN.extras.get(Notification.EXTRA_TITLE))) {
+ return true;
+ }
+ if (!Objects.equals(oldN.extras.get(Notification.EXTRA_TEXT),
+ newN.extras.get(Notification.EXTRA_TEXT))) {
+ return true;
+ }
+ if (oldN.extras.containsKey(Notification.EXTRA_PROGRESS) && newN.hasCompletedProgress()) {
+ return true;
+ }
+ // Actions
+ if (Notification.areActionsVisiblyDifferent(oldN, newN)) {
+ return true;
+ }
+
+ try {
+ Notification.Builder oldB = Notification.Builder.recoverBuilder(getContext(), oldN);
+ Notification.Builder newB = Notification.Builder.recoverBuilder(getContext(), newN);
+
+ // Style based comparisons
+ if (Notification.areStyledNotificationsVisiblyDifferent(oldB, newB)) {
+ return true;
+ }
+
+ // Remote views
+ if (Notification.areRemoteViewsChanged(oldB, newB)) {
+ return true;
+ }
+ } catch (Exception e) {
+ Slog.w(TAG, "error recovering builder", e);
+ }
+ return false;
+ }
+
+ /**
* Keeps the last 5 packages that have notified, by user.
*/
@GuardedBy("mNotificationLock")
@@ -4972,7 +5050,7 @@ public class NotificationManagerService extends SystemService {
private void handleSendRankingUpdate() {
synchronized (mNotificationLock) {
- mListeners.notifyRankingUpdateLocked();
+ mListeners.notifyRankingUpdateLocked(null);
}
}
@@ -5157,7 +5235,7 @@ public class NotificationManagerService extends SystemService {
if (reason != REASON_SNOOZED) {
r.isCanceled = true;
}
- mListeners.notifyRemovedLocked(r.sbn, reason, r.getStats());
+ mListeners.notifyRemovedLocked(r, reason, r.getStats());
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -5266,6 +5344,7 @@ public class NotificationManagerService extends SystemService {
final String pkg, final String tag, final int id,
final int mustHaveFlags, final int mustNotHaveFlags, final boolean sendDelete,
final int userId, final int reason, final ManagedServiceInfo listener) {
+
// In enqueueNotificationInternal notifications are added by scheduling the
// work on the worker handler. Hence, we also schedule the cancel on this
// handler to avoid a scenario where an add notification call followed by a
@@ -5657,6 +5736,42 @@ public class NotificationManagerService extends SystemService {
return -1;
}
+ @VisibleForTesting
+ protected void hideNotificationsForPackages(String[] pkgs) {
+ synchronized (mNotificationLock) {
+ List<String> pkgList = Arrays.asList(pkgs);
+ List<NotificationRecord> changedNotifications = new ArrayList<>();
+ int numNotifications = mNotificationList.size();
+ for (int i = 0; i < numNotifications; i++) {
+ NotificationRecord rec = mNotificationList.get(i);
+ if (pkgList.contains(rec.sbn.getPackageName())) {
+ rec.setHidden(true);
+ changedNotifications.add(rec);
+ }
+ }
+
+ mListeners.notifyHiddenLocked(changedNotifications);
+ }
+ }
+
+ @VisibleForTesting
+ protected void unhideNotificationsForPackages(String[] pkgs) {
+ synchronized (mNotificationLock) {
+ List<String> pkgList = Arrays.asList(pkgs);
+ List<NotificationRecord> changedNotifications = new ArrayList<>();
+ int numNotifications = mNotificationList.size();
+ for (int i = 0; i < numNotifications; i++) {
+ NotificationRecord rec = mNotificationList.get(i);
+ if (pkgList.contains(rec.sbn.getPackageName())) {
+ rec.setHidden(false);
+ changedNotifications.add(rec);
+ }
+ }
+
+ mListeners.notifyUnhiddenLocked(changedNotifications);
+ }
+ }
+
private void updateNotificationPulse() {
synchronized (mNotificationLock) {
updateLightsLocked();
@@ -5776,6 +5891,7 @@ public class NotificationManagerService extends SystemService {
Bundle snoozeCriteria = new Bundle();
Bundle showBadge = new Bundle();
Bundle userSentiment = new Bundle();
+ Bundle hidden = new Bundle();
for (int i = 0; i < N; i++) {
NotificationRecord record = mNotificationList.get(i);
if (!isVisibleToListener(record.sbn, info)) {
@@ -5802,6 +5918,7 @@ public class NotificationManagerService extends SystemService {
snoozeCriteria.putParcelableArrayList(key, record.getSnoozeCriteria());
showBadge.putBoolean(key, record.canShowBadge());
userSentiment.putInt(key, record.getUserSentiment());
+ hidden.putBoolean(key, record.isHidden());
}
final int M = keys.size();
String[] keysAr = keys.toArray(new String[M]);
@@ -5812,7 +5929,7 @@ public class NotificationManagerService extends SystemService {
}
return new NotificationRankingUpdate(keysAr, interceptedKeysAr, visibilityOverrides,
suppressedVisualEffects, importanceAr, explanation, overrideGroupKeys,
- channels, overridePeople, snoozeCriteria, showBadge, userSentiment);
+ channels, overridePeople, snoozeCriteria, showBadge, userSentiment, hidden);
}
boolean hasCompanionDevice(ManagedServiceInfo info) {
@@ -6101,6 +6218,16 @@ public class NotificationManagerService extends SystemService {
*/
@GuardedBy("mNotificationLock")
public void notifyPostedLocked(NotificationRecord r, StatusBarNotification oldSbn) {
+ notifyPostedLocked(r, oldSbn, true);
+ }
+
+ /**
+ * @param notifyAllListeners notifies all listeners if true, else only notifies listeners
+ * targetting <= O_MR1
+ */
+ @GuardedBy("mNotificationLock")
+ private void notifyPostedLocked(NotificationRecord r, StatusBarNotification oldSbn,
+ boolean notifyAllListeners) {
// Lazily initialized snapshots of the notification.
StatusBarNotification sbn = r.sbn;
TrimCache trimCache = new TrimCache(sbn);
@@ -6114,6 +6241,21 @@ public class NotificationManagerService extends SystemService {
if (!oldSbnVisible && !sbnVisible) {
continue;
}
+
+ // If the notification is hidden, don't notifyPosted listeners targeting < P.
+ // Instead, those listeners will receive notifyPosted when the notification is
+ // unhidden.
+ if (r.isHidden() && info.targetSdkVersion < Build.VERSION_CODES.P) {
+ continue;
+ }
+
+ // If we shouldn't notify all listeners, this means the hidden state of
+ // a notification was changed. Don't notifyPosted listeners targeting >= P.
+ // Instead, those listeners will receive notifyRankingUpdate.
+ if (!notifyAllListeners && info.targetSdkVersion >= Build.VERSION_CODES.P) {
+ continue;
+ }
+
final NotificationRankingUpdate update = makeRankingUpdateLocked(info);
// This notification became invisible -> remove the old one.
@@ -6168,8 +6310,9 @@ public class NotificationManagerService extends SystemService {
* asynchronously notify all listeners about a removed notification
*/
@GuardedBy("mNotificationLock")
- public void notifyRemovedLocked(StatusBarNotification sbn, int reason,
+ public void notifyRemovedLocked(NotificationRecord r, int reason,
NotificationStats notificationStats) {
+ final StatusBarNotification sbn = r.sbn;
// make a copy in case changes are made to the underlying Notification object
// NOTE: this copy is lightweight: it doesn't include heavyweight parts of the
// notification
@@ -6178,6 +6321,21 @@ public class NotificationManagerService extends SystemService {
if (!isVisibleToListener(sbn, info)) {
continue;
}
+
+ // don't notifyRemoved for listeners targeting < P
+ // if not for reason package suspended
+ if (r.isHidden() && reason != REASON_PACKAGE_SUSPENDED
+ && info.targetSdkVersion < Build.VERSION_CODES.P) {
+ continue;
+ }
+
+ // don't notifyRemoved for listeners targeting >= P
+ // if the reason is package suspended
+ if (reason == REASON_PACKAGE_SUSPENDED
+ && info.targetSdkVersion >= Build.VERSION_CODES.P) {
+ continue;
+ }
+
// Only assistants can get stats
final NotificationStats stats = mAssistants.isServiceTokenValidLocked(info.service)
? notificationStats : null;
@@ -6192,21 +6350,44 @@ public class NotificationManagerService extends SystemService {
}
/**
- * asynchronously notify all listeners about a reordering of notifications
+ * Asynchronously notify all listeners about a reordering of notifications
+ * unless changedHiddenNotifications is populated.
+ * If changedHiddenNotifications is populated, there was a change in the hidden state
+ * of the notifications. In this case, we only send updates to listeners that
+ * target >= P.
*/
@GuardedBy("mNotificationLock")
- public void notifyRankingUpdateLocked() {
+ public void notifyRankingUpdateLocked(List<NotificationRecord> changedHiddenNotifications) {
+ boolean isHiddenRankingUpdate = changedHiddenNotifications != null
+ && changedHiddenNotifications.size() > 0;
+
for (final ManagedServiceInfo serviceInfo : getServices()) {
if (!serviceInfo.isEnabledForCurrentProfiles()) {
continue;
}
- final NotificationRankingUpdate update = makeRankingUpdateLocked(serviceInfo);
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- notifyRankingUpdate(serviceInfo, update);
+
+ boolean notifyThisListener = false;
+ if (isHiddenRankingUpdate && serviceInfo.targetSdkVersion >=
+ Build.VERSION_CODES.P) {
+ for (NotificationRecord rec : changedHiddenNotifications) {
+ if (isVisibleToListener(rec.sbn, serviceInfo)) {
+ notifyThisListener = true;
+ break;
+ }
}
- });
+ }
+
+ if (notifyThisListener || !isHiddenRankingUpdate) {
+ final NotificationRankingUpdate update = makeRankingUpdateLocked(
+ serviceInfo);
+
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ notifyRankingUpdate(serviceInfo, update);
+ }
+ });
+ }
}
}
@@ -6225,6 +6406,52 @@ public class NotificationManagerService extends SystemService {
}
}
+ /**
+ * asynchronously notify relevant listeners their notification is hidden
+ * NotificationListenerServices that target P+:
+ * NotificationListenerService#notifyRankingUpdateLocked()
+ * NotificationListenerServices that target <= P:
+ * NotificationListenerService#notifyRemovedLocked() with REASON_PACKAGE_SUSPENDED.
+ */
+ @GuardedBy("mNotificationLock")
+ public void notifyHiddenLocked(List<NotificationRecord> changedNotifications) {
+ if (changedNotifications == null || changedNotifications.size() == 0) {
+ return;
+ }
+
+ notifyRankingUpdateLocked(changedNotifications);
+
+ // for listeners that target < P, notifyRemoveLocked
+ int numChangedNotifications = changedNotifications.size();
+ for (int i = 0; i < numChangedNotifications; i++) {
+ NotificationRecord rec = changedNotifications.get(i);
+ mListeners.notifyRemovedLocked(rec, REASON_PACKAGE_SUSPENDED, rec.getStats());
+ }
+ }
+
+ /**
+ * asynchronously notify relevant listeners their notification is unhidden
+ * NotificationListenerServices that target P+:
+ * NotificationListenerService#notifyRankingUpdateLocked()
+ * NotificationListenerServices that target <= P:
+ * NotificationListeners#notifyPostedLocked()
+ */
+ @GuardedBy("mNotificationLock")
+ public void notifyUnhiddenLocked(List<NotificationRecord> changedNotifications) {
+ if (changedNotifications == null || changedNotifications.size() == 0) {
+ return;
+ }
+
+ notifyRankingUpdateLocked(changedNotifications);
+
+ // for listeners that target < P, notifyPostedLocked
+ int numChangedNotifications = changedNotifications.size();
+ for (int i = 0; i < numChangedNotifications; i++) {
+ NotificationRecord rec = changedNotifications.get(i);
+ mListeners.notifyPostedLocked(rec, rec.sbn, false);
+ }
+ }
+
public void notifyInterruptionFilterChanged(final int interruptionFilter) {
for (final ManagedServiceInfo serviceInfo : getServices()) {
if (!serviceInfo.isEnabledForCurrentProfiles()) {
@@ -6453,6 +6680,22 @@ public class NotificationManagerService extends SystemService {
}
}
+ @VisibleForTesting
+ protected void simulatePackageSuspendBroadcast(boolean suspend, String pkg) {
+ // only use for testing: mimic receive broadcast that package is (un)suspended
+ // but does not actually (un)suspend the package
+ final Bundle extras = new Bundle();
+ extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST,
+ new String[]{pkg});
+
+ final String action = suspend ? Intent.ACTION_PACKAGES_SUSPENDED
+ : Intent.ACTION_PACKAGES_UNSUSPENDED;
+ final Intent intent = new Intent(action);
+ intent.putExtras(extras);
+
+ mPackageIntentReceiver.onReceive(getContext(), intent);
+ }
+
/**
* Wrapper for a StatusBarNotification object that allows transfer across a oneway
* binder without sending large amounts of data over a oneway transaction.
@@ -6481,7 +6724,9 @@ public class NotificationManagerService extends SystemService {
+ "allow_assistant COMPONENT\n"
+ "remove_assistant COMPONENT\n"
+ "allow_dnd PACKAGE\n"
- + "disallow_dnd PACKAGE";
+ + "disallow_dnd PACKAGE\n"
+ + "suspend_package PACKAGE\n"
+ + "unsuspend_package PACKAGE";
@Override
public int onCommand(String cmd) {
@@ -6550,7 +6795,16 @@ public class NotificationManagerService extends SystemService {
getBinderService().setNotificationAssistantAccessGranted(cn, false);
}
break;
-
+ case "suspend_package": {
+ // only use for testing
+ simulatePackageSuspendBroadcast(true, getNextArgRequired());
+ }
+ break;
+ case "unsuspend_package": {
+ // only use for testing
+ simulatePackageSuspendBroadcast(false, getNextArgRequired());
+ }
+ break;
default:
return handleDefaultCommands(cmd);
}
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index f1908bff2d94..c88708551662 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -103,6 +103,9 @@ public final class NotificationRecord {
// is this notification currently being intercepted by Zen Mode?
private boolean mIntercept;
+ // is this notification hidden since the app pkg is suspended?
+ private boolean mHidden;
+
// The timestamp used for ranking.
private long mRankingTimeMs;
@@ -353,6 +356,7 @@ public final class NotificationRecord {
mPackagePriority = previous.mPackagePriority;
mPackageVisibility = previous.mPackageVisibility;
mIntercept = previous.mIntercept;
+ mHidden = previous.mHidden;
mRankingTimeMs = calculateRankingTimeMs(previous.getRankingTimeMs());
mCreationTimeMs = previous.mCreationTimeMs;
mVisibleSinceMs = previous.mVisibleSinceMs;
@@ -498,6 +502,7 @@ public final class NotificationRecord {
+ NotificationListenerService.Ranking.importanceToString(mImportance));
pw.println(prefix + "mImportanceExplanation=" + mImportanceExplanation);
pw.println(prefix + "mIntercept=" + mIntercept);
+ pw.println(prefix + "mHidden==" + mHidden);
pw.println(prefix + "mGlobalSortKey=" + mGlobalSortKey);
pw.println(prefix + "mRankingTimeMs=" + mRankingTimeMs);
pw.println(prefix + "mCreationTimeMs=" + mCreationTimeMs);
@@ -702,6 +707,15 @@ public final class NotificationRecord {
return mIntercept;
}
+ public void setHidden(boolean hidden) {
+ mHidden = hidden;
+ }
+
+ public boolean isHidden() {
+ return mHidden;
+ }
+
+
public void setSuppressedVisualEffects(int effects) {
mSuppressedVisualEffects = effects;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 052f23999f1e..03005488ecdd 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -23,7 +23,6 @@ import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.REQUEST_DELETE_PACKAGES;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
-import static android.Manifest.permission.WRITE_MEDIA_STORAGE;
import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509;
import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
@@ -98,7 +97,6 @@ import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
import static com.android.server.pm.InstructionSets.getPreferredInstructionSet;
import static com.android.server.pm.InstructionSets.getPrimaryInstructionSet;
-import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason;
import static com.android.server.pm.PackageManagerServiceCompilerMapping.getDefaultCompilerFilter;
import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures;
import static com.android.server.pm.PackageManagerServiceUtils.compressedFileExists;
@@ -214,6 +212,7 @@ import android.os.Message;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.PatternMatcher;
+import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -238,7 +237,6 @@ import android.provider.Settings.Secure;
import android.security.KeyStore;
import android.security.SystemKeyStore;
import android.service.pm.PackageServiceDumpProto;
-import android.service.textclassifier.TextClassifierService;
import android.system.ErrnoException;
import android.system.Os;
import android.text.TextUtils;
@@ -407,7 +405,7 @@ public class PackageManagerService extends IPackageManager.Stub
static final boolean DEBUG_DOMAIN_VERIFICATION = false;
private static final boolean DEBUG_BACKUP = false;
public static final boolean DEBUG_INSTALL = false;
- public static final boolean DEBUG_REMOVE = false;
+ public static final boolean DEBUG_REMOVE = true;
private static final boolean DEBUG_BROADCASTS = false;
private static final boolean DEBUG_SHOW_INFO = false;
private static final boolean DEBUG_PACKAGE_INFO = false;
@@ -10355,7 +10353,7 @@ public class PackageManagerService extends IPackageManager.Stub
if (Build.IS_DEBUGGABLE &&
pkg.isPrivileged() &&
- !SystemProperties.getBoolean("pm.dexopt.priv-apps", true)) {
+ !SystemProperties.getBoolean(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB, true)) {
PackageManagerServiceUtils.logPackageHasUncompressedCode(pkg);
}
@@ -13964,29 +13962,45 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean suspended,
+ PersistableBundle appExtras, PersistableBundle launcherExtras, String callingPackage,
int userId) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null);
+ try {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.SUSPEND_APPS, null);
+ } catch (SecurityException e) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.MANAGE_USERS,
+ "Callers need to have either " + Manifest.permission.SUSPEND_APPS + " or "
+ + Manifest.permission.MANAGE_USERS);
+ }
final int callingUid = Binder.getCallingUid();
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, true /* checkShell */,
"setPackagesSuspended for user " + userId);
+ if (callingUid != Process.ROOT_UID &&
+ !UserHandle.isSameApp(getPackageUid(callingPackage, 0, userId), callingUid)) {
+ throw new IllegalArgumentException("callingPackage " + callingPackage + " does not"
+ + " belong to calling app id " + UserHandle.getAppId(callingUid));
+ }
if (ArrayUtils.isEmpty(packageNames)) {
return packageNames;
}
// List of package names for whom the suspended state has changed.
- List<String> changedPackages = new ArrayList<>(packageNames.length);
+ final List<String> changedPackages = new ArrayList<>(packageNames.length);
// List of package names for whom the suspended state is not set as requested in this
// method.
- List<String> unactionedPackages = new ArrayList<>(packageNames.length);
- long callingId = Binder.clearCallingIdentity();
+ final List<String> unactionedPackages = new ArrayList<>(packageNames.length);
+ final long callingId = Binder.clearCallingIdentity();
try {
- for (int i = 0; i < packageNames.length; i++) {
- String packageName = packageNames[i];
- boolean changed = false;
- final int appId;
- synchronized (mPackages) {
+ synchronized (mPackages) {
+ for (int i = 0; i < packageNames.length; i++) {
+ final String packageName = packageNames[i];
+ if (packageName == callingPackage) {
+ Slog.w(TAG, "Calling package: " + callingPackage + "trying to "
+ + (suspended ? "" : "un") + "suspend itself. Ignoring");
+ unactionedPackages.add(packageName);
+ continue;
+ }
final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
if (pkgSetting == null
|| filterAppAccessLPr(pkgSetting, callingUid, userId)) {
@@ -13995,42 +14009,75 @@ public class PackageManagerService extends IPackageManager.Stub
unactionedPackages.add(packageName);
continue;
}
- appId = pkgSetting.appId;
if (pkgSetting.getSuspended(userId) != suspended) {
if (!canSuspendPackageForUserLocked(packageName, userId)) {
unactionedPackages.add(packageName);
continue;
}
- pkgSetting.setSuspended(suspended, userId);
- mSettings.writePackageRestrictionsLPr(userId);
- changed = true;
+ pkgSetting.setSuspended(suspended, callingPackage, appExtras,
+ launcherExtras, userId);
changedPackages.add(packageName);
}
}
-
- if (changed && suspended) {
- killApplication(packageName, UserHandle.getUid(userId, appId),
- "suspending package");
- }
}
} finally {
Binder.restoreCallingIdentity(callingId);
}
-
+ // TODO (b/75036698): Also send each package a broadcast when suspended state changed
if (!changedPackages.isEmpty()) {
sendPackagesSuspendedForUser(changedPackages.toArray(
new String[changedPackages.size()]), userId, suspended);
+ synchronized (mPackages) {
+ scheduleWritePackageRestrictionsLocked(userId);
+ }
}
return unactionedPackages.toArray(new String[unactionedPackages.size()]);
}
@Override
+ public PersistableBundle getPackageSuspendedAppExtras(String packageName, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ if (getPackageUid(packageName, 0, userId) != callingUid) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null);
+ }
+ synchronized (mPackages) {
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps == null || filterAppAccessLPr(ps, callingUid, userId)) {
+ throw new IllegalArgumentException("Unknown target package: " + packageName);
+ }
+ final PackageUserState packageUserState = ps.readUserState(userId);
+ return packageUserState.suspended ? packageUserState.suspendedAppExtras : null;
+ }
+ }
+
+ @Override
+ public void setSuspendedPackageAppExtras(String packageName, PersistableBundle appExtras,
+ int userId) {
+ final int callingUid = Binder.getCallingUid();
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null);
+ synchronized (mPackages) {
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps == null || filterAppAccessLPr(ps, callingUid, userId)) {
+ throw new IllegalArgumentException("Unknown target package: " + packageName);
+ }
+ final PackageUserState packageUserState = ps.readUserState(userId);
+ if (packageUserState.suspended) {
+ // TODO (b/75036698): Also send this package a broadcast with the new app extras
+ packageUserState.suspendedAppExtras = appExtras;
+ }
+ }
+ }
+
+ @Override
public boolean isPackageSuspendedForUser(String packageName, int userId) {
final int callingUid = Binder.getCallingUid();
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, false /* checkShell */,
"isPackageSuspendedForUser for user " + userId);
+ if (getPackageUid(packageName, 0, userId) != callingUid) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null);
+ }
synchronized (mPackages) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
if (ps == null || filterAppAccessLPr(ps, callingUid, userId)) {
@@ -14040,6 +14087,21 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
+ void onSuspendingPackageRemoved(String packageName, int userId) {
+ final int[] userIds = (userId == UserHandle.USER_ALL) ? sUserManager.getUserIds()
+ : new int[] {userId};
+ synchronized (mPackages) {
+ for (PackageSetting ps : mSettings.mPackages.values()) {
+ for (int user : userIds) {
+ final PackageUserState pus = ps.readUserState(user);
+ if (pus.suspended && packageName.equals(pus.suspendingPackage)) {
+ ps.setSuspended(false, null, null, null, user);
+ }
+ }
+ }
+ }
+ }
+
@GuardedBy("mPackages")
private boolean canSuspendPackageForUserLocked(String packageName, int userId) {
if (isPackageDeviceAdmin(packageName, userId)) {
@@ -14096,6 +14158,11 @@ public class PackageManagerService extends IPackageManager.Stub
return false;
}
+ if (PLATFORM_PACKAGE_NAME.equals(packageName)) {
+ Slog.w(TAG, "Cannot suspend package: " + packageName);
+ return false;
+ }
+
return true;
}
@@ -18612,6 +18679,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
final int removedUserId = (user != null) ? user.getIdentifier()
: UserHandle.USER_ALL;
+
if (!clearPackageStateForUserLIF(ps, removedUserId, outInfo)) {
return false;
}
@@ -18621,6 +18689,12 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
+ final int userId = user == null ? UserHandle.USER_ALL : user.getIdentifier();
+ if (ps.getPermissionsState().hasPermission(Manifest.permission.SUSPEND_APPS, userId)) {
+ onSuspendingPackageRemoved(packageName, userId);
+ }
+
+
if (((!isSystemApp(ps) || (flags&PackageManager.DELETE_SYSTEM_APP) != 0) && user != null
&& user.getIdentifier() != UserHandle.USER_ALL)) {
// The caller is asking that the package only be deleted for a single
@@ -18758,6 +18832,9 @@ public class PackageManagerService extends IPackageManager.Stub
true /*notLaunched*/,
false /*hidden*/,
false /*suspended*/,
+ null, /*suspendingPackage*/
+ null, /*suspendedAppExtras*/
+ null, /*suspendedLauncherExtras*/
false /*instantApp*/,
false /*virtualPreload*/,
null /*lastDisableAppCaller*/,
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index d2ef67b74fef..28e32a54090a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -57,12 +57,14 @@ import android.content.pm.dex.DexMetadataHelper;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.net.Uri;
+import android.os.BaseBundle;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.IUserManager;
import android.os.ParcelFileDescriptor;
+import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -1503,27 +1505,55 @@ class PackageManagerShellCommand extends ShellCommand {
private int runSuspend(boolean suspendedState) {
final PrintWriter pw = getOutPrintWriter();
int userId = UserHandle.USER_SYSTEM;
+ final PersistableBundle appExtras = new PersistableBundle();
+ final PersistableBundle launcherExtras = new PersistableBundle();
String opt;
while ((opt = getNextOption()) != null) {
switch (opt) {
case "--user":
userId = UserHandle.parseUserArg(getNextArgRequired());
break;
+ case "--ael":
+ case "--aes":
+ case "--aed":
+ case "--lel":
+ case "--les":
+ case "--led":
+ final String key = getNextArgRequired();
+ final String val = getNextArgRequired();
+ if (!suspendedState) {
+ break;
+ }
+ final PersistableBundle bundleToInsert =
+ opt.startsWith("--a") ? appExtras : launcherExtras;
+ switch (opt.charAt(4)) {
+ case 'l':
+ bundleToInsert.putLong(key, Long.valueOf(val));
+ break;
+ case 'd':
+ bundleToInsert.putDouble(key, Double.valueOf(val));
+ break;
+ case 's':
+ bundleToInsert.putString(key, val);
+ break;
+ }
+ break;
default:
pw.println("Error: Unknown option: " + opt);
return 1;
}
}
- String packageName = getNextArg();
+ final String packageName = getNextArg();
if (packageName == null) {
pw.println("Error: package name not specified");
return 1;
}
-
+ final String callingPackage =
+ (Binder.getCallingUid() == Process.ROOT_UID) ? "root" : "com.android.shell";
try {
mInterface.setPackagesSuspendedAsUser(new String[]{packageName}, suspendedState,
- userId);
+ appExtras, launcherExtras, callingPackage, userId);
pw.println("Package " + packageName + " new suspended state: "
+ mInterface.isPackageSuspendedForUser(packageName, userId));
return 0;
diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java
index a0ed12611e48..008a81cd9cb7 100644
--- a/services/core/java/com/android/server/pm/PackageSettingBase.java
+++ b/services/core/java/com/android/server/pm/PackageSettingBase.java
@@ -20,12 +20,16 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
+
import android.content.pm.ApplicationInfo;
import android.content.pm.IntentFilterVerificationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
import android.content.pm.PackageUserState;
import android.content.pm.Signature;
+import android.os.BaseBundle;
+import android.os.PersistableBundle;
import android.service.pm.PackageProto;
import android.util.ArraySet;
import android.util.SparseArray;
@@ -394,8 +398,13 @@ public abstract class PackageSettingBase extends SettingBase {
return readUserState(userId).suspended;
}
- void setSuspended(boolean suspended, int userId) {
- modifyUserState(userId).suspended = suspended;
+ void setSuspended(boolean suspended, String suspendingPackage, PersistableBundle appExtras,
+ PersistableBundle launcherExtras, int userId) {
+ final PackageUserState existingUserState = modifyUserState(userId);
+ existingUserState.suspended = suspended;
+ existingUserState.suspendingPackage = suspended ? suspendingPackage : null;
+ existingUserState.suspendedAppExtras = suspended ? appExtras : null;
+ existingUserState.suspendedLauncherExtras = suspended ? launcherExtras : null;
}
public boolean getInstantApp(int userId) {
@@ -415,7 +424,9 @@ public abstract class PackageSettingBase extends SettingBase {
}
void setUserState(int userId, long ceDataInode, int enabled, boolean installed, boolean stopped,
- boolean notLaunched, boolean hidden, boolean suspended, boolean instantApp,
+ boolean notLaunched, boolean hidden, boolean suspended, String suspendingPackage,
+ PersistableBundle suspendedAppExtras, PersistableBundle suspendedLauncherExtras,
+ boolean instantApp,
boolean virtualPreload, String lastDisableAppCaller,
ArraySet<String> enabledComponents, ArraySet<String> disabledComponents,
int domainVerifState, int linkGeneration, int installReason,
@@ -428,6 +439,9 @@ public abstract class PackageSettingBase extends SettingBase {
state.notLaunched = notLaunched;
state.hidden = hidden;
state.suspended = suspended;
+ state.suspendingPackage = suspendingPackage;
+ state.suspendedAppExtras = suspendedAppExtras;
+ state.suspendedLauncherExtras = suspendedLauncherExtras;
state.lastDisableAppCaller = lastDisableAppCaller;
state.enabledComponents = enabledComponents;
state.disabledComponents = disabledComponents;
@@ -594,6 +608,9 @@ public abstract class PackageSettingBase extends SettingBase {
proto.write(PackageProto.UserInfoProto.INSTALL_TYPE, installType);
proto.write(PackageProto.UserInfoProto.IS_HIDDEN, state.hidden);
proto.write(PackageProto.UserInfoProto.IS_SUSPENDED, state.suspended);
+ if (state.suspended) {
+ proto.write(PackageProto.UserInfoProto.SUSPENDING_PACKAGE, state.suspendingPackage);
+ }
proto.write(PackageProto.UserInfoProto.IS_STOPPED, state.stopped);
proto.write(PackageProto.UserInfoProto.IS_LAUNCHED, !state.notLaunched);
proto.write(PackageProto.UserInfoProto.ENABLED_STATE, state.enabled);
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index a38cbda245ca..d0e854436970 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -31,6 +31,7 @@ import static android.os.Process.PACKAGE_INFO_GID;
import static android.os.Process.SYSTEM_UID;
import static com.android.server.pm.PackageManagerService.DEBUG_DOMAIN_VERIFICATION;
+import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -58,6 +59,7 @@ import android.os.FileUtils;
import android.os.Handler;
import android.os.Message;
import android.os.PatternMatcher;
+import android.os.PersistableBundle;
import android.os.Process;
import android.os.SystemClock;
import android.os.UserHandle;
@@ -199,6 +201,8 @@ public final class Settings {
private static final String TAG_DEFAULT_BROWSER = "default-browser";
private static final String TAG_DEFAULT_DIALER = "default-dialer";
private static final String TAG_VERSION = "version";
+ private static final String TAG_SUSPENDED_APP_EXTRAS = "suspended-app-extras";
+ private static final String TAG_SUSPENDED_LAUNCHER_EXTRAS = "suspended-launcher-extras";
public static final String ATTR_NAME = "name";
public static final String ATTR_PACKAGE = "package";
@@ -217,6 +221,7 @@ public final class Settings {
// New name for the above attribute.
private static final String ATTR_HIDDEN = "hidden";
private static final String ATTR_SUSPENDED = "suspended";
+ private static final String ATTR_SUSPENDING_PACKAGE = "suspending-package";
// Legacy, uninstall blocks are stored separately.
@Deprecated
private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall";
@@ -728,6 +733,9 @@ public final class Settings {
true /*notLaunched*/,
false /*hidden*/,
false /*suspended*/,
+ null, /*suspendingPackage*/
+ null, /*suspendedAppExtras*/
+ null, /*suspendedLauncherExtras*/
instantApp,
virtualPreload,
null /*lastDisableAppCaller*/,
@@ -1619,6 +1627,9 @@ public final class Settings {
false /*notLaunched*/,
false /*hidden*/,
false /*suspended*/,
+ null, /*suspendingPackage*/
+ null, /*suspendedAppExtras*/
+ null, /*suspendedLauncherExtras*/
false /*instantApp*/,
false /*virtualPreload*/,
null /*lastDisableAppCaller*/,
@@ -1691,6 +1702,12 @@ public final class Settings {
final boolean suspended = XmlUtils.readBooleanAttribute(parser, ATTR_SUSPENDED,
false);
+ String suspendingPackage = parser.getAttributeValue(null,
+ ATTR_SUSPENDING_PACKAGE);
+ if (suspended && suspendingPackage == null) {
+ suspendingPackage = PLATFORM_PACKAGE_NAME;
+ }
+
final boolean blockUninstall = XmlUtils.readBooleanAttribute(parser,
ATTR_BLOCK_UNINSTALL, false);
final boolean instantApp = XmlUtils.readBooleanAttribute(parser,
@@ -1716,6 +1733,8 @@ public final class Settings {
ArraySet<String> enabledComponents = null;
ArraySet<String> disabledComponents = null;
+ PersistableBundle suspendedAppExtras = null;
+ PersistableBundle suspendedLauncherExtras = null;
int packageDepth = parser.getDepth();
while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
@@ -1725,11 +1744,22 @@ public final class Settings {
|| type == XmlPullParser.TEXT) {
continue;
}
- tagName = parser.getName();
- if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
- enabledComponents = readComponentsLPr(parser);
- } else if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
- disabledComponents = readComponentsLPr(parser);
+ switch (parser.getName()) {
+ case TAG_ENABLED_COMPONENTS:
+ enabledComponents = readComponentsLPr(parser);
+ break;
+ case TAG_DISABLED_COMPONENTS:
+ disabledComponents = readComponentsLPr(parser);
+ break;
+ case TAG_SUSPENDED_APP_EXTRAS:
+ suspendedAppExtras = PersistableBundle.restoreFromXml(parser);
+ break;
+ case TAG_SUSPENDED_LAUNCHER_EXTRAS:
+ suspendedLauncherExtras = PersistableBundle.restoreFromXml(parser);
+ break;
+ default:
+ Slog.wtf(TAG, "Unknown tag " + parser.getName() + " under tag "
+ + TAG_PACKAGE);
}
}
@@ -1737,7 +1767,8 @@ public final class Settings {
setBlockUninstallLPw(userId, name, true);
}
ps.setUserState(userId, ceDataInode, enabled, installed, stopped, notLaunched,
- hidden, suspended, instantApp, virtualPreload, enabledCaller,
+ hidden, suspended, suspendingPackage, suspendedAppExtras,
+ suspendedLauncherExtras, instantApp, virtualPreload, enabledCaller,
enabledComponents, disabledComponents, verifState, linkGeneration,
installReason, harmfulAppWarning);
} else if (tagName.equals("preferred-activities")) {
@@ -2046,6 +2077,27 @@ public final class Settings {
}
if (ustate.suspended) {
serializer.attribute(null, ATTR_SUSPENDED, "true");
+ serializer.attribute(null, ATTR_SUSPENDING_PACKAGE, ustate.suspendingPackage);
+ if (ustate.suspendedAppExtras != null) {
+ serializer.startTag(null, TAG_SUSPENDED_APP_EXTRAS);
+ try {
+ ustate.suspendedAppExtras.saveToXml(serializer);
+ } catch (XmlPullParserException xmle) {
+ Slog.wtf(TAG, "Exception while trying to write suspendedAppExtras for "
+ + pkg + ". Will be lost on reboot", xmle);
+ }
+ serializer.endTag(null, TAG_SUSPENDED_APP_EXTRAS);
+ }
+ if (ustate.suspendedLauncherExtras != null) {
+ serializer.startTag(null, TAG_SUSPENDED_LAUNCHER_EXTRAS);
+ try {
+ ustate.suspendedLauncherExtras.saveToXml(serializer);
+ } catch (XmlPullParserException xmle) {
+ Slog.wtf(TAG, "Exception while trying to write suspendedLauncherExtras"
+ + " for " + pkg + ". Will be lost on reboot", xmle);
+ }
+ serializer.endTag(null, TAG_SUSPENDED_LAUNCHER_EXTRAS);
+ }
}
if (ustate.instantApp) {
serializer.attribute(null, ATTR_INSTANT_APP, "true");
@@ -4697,6 +4749,10 @@ public final class Settings {
pw.print(ps.getHidden(user.id));
pw.print(" suspended=");
pw.print(ps.getSuspended(user.id));
+ if (ps.getSuspended(user.id)) {
+ pw.print(" suspendingPackage=");
+ pw.print(ps.readUserState(user.id).suspendingPackage);
+ }
pw.print(" stopped=");
pw.print(ps.getStopped(user.id));
pw.print(" notLaunched=");
diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
index 062a6b866c2b..41ed6f22ea36 100644
--- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java
+++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
@@ -198,7 +198,14 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
ParcelFileDescriptor fd = null;
try {
fd = ParcelFileDescriptor.open(snapshotProfile, ParcelFileDescriptor.MODE_READ_ONLY);
- postSuccess(packageName, fd, callback);
+ if (fd == null || !fd.getFileDescriptor().valid()) {
+ Slog.wtf(TAG,
+ "ParcelFileDescriptor.open returned an invalid descriptor for "
+ + packageName + ":" + snapshotProfile + ". isNull=" + (fd == null));
+ postError(callback, packageName, ArtManager.SNAPSHOT_FAILED_INTERNAL_ERROR);
+ } else {
+ postSuccess(packageName, fd, callback);
+ }
} catch (FileNotFoundException e) {
Slog.w(TAG, "Could not open snapshot profile for " + packageName + ":"
+ snapshotProfile, e);
@@ -264,7 +271,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
mHandler.post(() -> {
try {
callback.onError(errCode);
- } catch (RemoteException e) {
+ } catch (Exception e) {
Slog.w(TAG, "Failed to callback after profile snapshot for " + packageName, e);
}
});
@@ -277,8 +284,17 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
}
mHandler.post(() -> {
try {
- callback.onSuccess(fd);
- } catch (RemoteException e) {
+ // Double check that the descriptor is still valid.
+ // We've seen production issues (b/76028139) where this can turn invalid (there are
+ // suspicions around the finalizer behaviour).
+ if (fd.getFileDescriptor().valid()) {
+ callback.onSuccess(fd);
+ } else {
+ Slog.wtf(TAG, "The snapshot FD became invalid before posting the result for "
+ + packageName);
+ callback.onError(ArtManager.SNAPSHOT_FAILED_INTERNAL_ERROR);
+ }
+ } catch (Exception e) {
Slog.w(TAG,
"Failed to call onSuccess after profile snapshot for " + packageName, e);
} finally {
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index bf85f30d092e..ad32ed3a2b01 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -55,6 +55,7 @@ import android.provider.Telephony.Sms.Intents;
import android.security.Credentials;
import android.service.textclassifier.TextClassifierService;
import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
@@ -263,13 +264,9 @@ public final class DefaultPermissionGrantPolicy {
}
public void grantDefaultPermissions(int userId) {
- if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED, 0)) {
- grantAllRuntimePermissions(userId);
- } else {
- grantPermissionsToSysComponentsAndPrivApps(userId);
- grantDefaultSystemHandlerPermissions(userId);
- grantDefaultPermissionExceptions(userId);
- }
+ grantPermissionsToSysComponentsAndPrivApps(userId);
+ grantDefaultSystemHandlerPermissions(userId);
+ grantDefaultPermissionExceptions(userId);
}
private void grantRuntimePermissionsForPackage(int userId, PackageParser.Package pkg) {
@@ -829,13 +826,11 @@ public final class DefaultPermissionGrantPolicy {
}
// TextClassifier Service
- ComponentName textClassifierComponent =
- TextClassifierService.getServiceComponentName(mContext);
- if (textClassifierComponent != null) {
- Intent textClassifierServiceIntent = new Intent(TextClassifierService.SERVICE_INTERFACE)
- .setComponent(textClassifierComponent);
+ String textClassifierPackageName =
+ mContext.getPackageManager().getSystemTextClassifierPackageName();
+ if (!TextUtils.isEmpty(textClassifierPackageName)) {
PackageParser.Package textClassifierPackage =
- getDefaultSystemHandlerServicePackage(textClassifierServiceIntent, userId);
+ getSystemPackage(textClassifierPackageName);
if (textClassifierPackage != null
&& doesPackageSupportRuntimePermissions(textClassifierPackage)) {
grantRuntimePermissions(textClassifierPackage, PHONE_PERMISSIONS, true, userId);
@@ -1248,6 +1243,13 @@ public final class DefaultPermissionGrantPolicy {
if (dir.isDirectory() && dir.canRead()) {
Collections.addAll(ret, dir.listFiles());
}
+ // For IoT devices, we check the oem partition for default permissions for each app.
+ if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED, 0)) {
+ dir = new File(Environment.getOemDirectory(), "etc/default-permissions");
+ if (dir.isDirectory() && dir.canRead()) {
+ Collections.addAll(ret, dir.listFiles());
+ }
+ }
return ret.isEmpty() ? null : ret.toArray(new File[0]);
}
diff --git a/services/core/java/com/android/server/policy/BarController.java b/services/core/java/com/android/server/policy/BarController.java
index cf88bd5364a7..eca6f9f1ec47 100644
--- a/services/core/java/com/android/server/policy/BarController.java
+++ b/services/core/java/com/android/server/policy/BarController.java
@@ -16,8 +16,8 @@
package com.android.server.policy;
-import static com.android.server.wm.proto.BarControllerProto.STATE;
-import static com.android.server.wm.proto.BarControllerProto.TRANSIENT_STATE;
+import static com.android.server.wm.BarControllerProto.STATE;
+import static com.android.server.wm.BarControllerProto.TRANSIENT_STATE;
import android.app.StatusBarManager;
import android.graphics.Rect;
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 6cd60e6ae1f6..4dc68ac72557 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -39,6 +39,7 @@ import static android.content.res.Configuration.UI_MODE_TYPE_CAR;
import static android.content.res.Configuration.UI_MODE_TYPE_MASK;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.O;
+import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.STATE_OFF;
import static android.view.WindowManager.DOCKED_LEFT;
@@ -71,6 +72,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_ACQUIRES_SLEE
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
@@ -128,26 +130,26 @@ import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.C
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.FOCUSED_APP_TOKEN;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.FOCUSED_WINDOW;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.FORCE_STATUS_BAR;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.FORCE_STATUS_BAR_FROM_KEYGUARD;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_DELEGATE;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_DRAW_COMPLETE;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_OCCLUDED;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_OCCLUDED_CHANGED;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_OCCLUDED_PENDING;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.LAST_SYSTEM_UI_FLAGS;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.NAVIGATION_BAR;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.ORIENTATION;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.ORIENTATION_LISTENER;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.ROTATION;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.ROTATION_MODE;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.SCREEN_ON_FULLY;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.STATUS_BAR;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.TOP_FULLSCREEN_OPAQUE_OR_DIMMING_WINDOW;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.TOP_FULLSCREEN_OPAQUE_WINDOW;
-import static com.android.server.wm.proto.WindowManagerPolicyProto.WINDOW_MANAGER_DRAW_COMPLETE;
+import static com.android.server.wm.WindowManagerPolicyProto.FOCUSED_APP_TOKEN;
+import static com.android.server.wm.WindowManagerPolicyProto.FOCUSED_WINDOW;
+import static com.android.server.wm.WindowManagerPolicyProto.FORCE_STATUS_BAR;
+import static com.android.server.wm.WindowManagerPolicyProto.FORCE_STATUS_BAR_FROM_KEYGUARD;
+import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_DELEGATE;
+import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_DRAW_COMPLETE;
+import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_OCCLUDED;
+import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_OCCLUDED_CHANGED;
+import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_OCCLUDED_PENDING;
+import static com.android.server.wm.WindowManagerPolicyProto.LAST_SYSTEM_UI_FLAGS;
+import static com.android.server.wm.WindowManagerPolicyProto.NAVIGATION_BAR;
+import static com.android.server.wm.WindowManagerPolicyProto.ORIENTATION;
+import static com.android.server.wm.WindowManagerPolicyProto.ORIENTATION_LISTENER;
+import static com.android.server.wm.WindowManagerPolicyProto.ROTATION;
+import static com.android.server.wm.WindowManagerPolicyProto.ROTATION_MODE;
+import static com.android.server.wm.WindowManagerPolicyProto.SCREEN_ON_FULLY;
+import static com.android.server.wm.WindowManagerPolicyProto.STATUS_BAR;
+import static com.android.server.wm.WindowManagerPolicyProto.TOP_FULLSCREEN_OPAQUE_OR_DIMMING_WINDOW;
+import static com.android.server.wm.WindowManagerPolicyProto.TOP_FULLSCREEN_OPAQUE_WINDOW;
+import static com.android.server.wm.WindowManagerPolicyProto.WINDOW_MANAGER_DRAW_COMPLETE;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -187,6 +189,7 @@ import android.hardware.input.InputManagerInternal;
import android.hardware.power.V1_0.PowerHint;
import android.media.AudioAttributes;
import android.media.AudioManager;
+import android.media.AudioManagerInternal;
import android.media.AudioSystem;
import android.media.IAudioService;
import android.media.session.MediaSessionLegacyHelper;
@@ -455,6 +458,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
PowerManagerInternal mPowerManagerInternal;
IStatusBarService mStatusBarService;
StatusBarManagerInternal mStatusBarManagerInternal;
+ AudioManagerInternal mAudioManagerInternal;
boolean mPreloadedRecentApps;
final Object mServiceAquireLock = new Object();
Vibrator mVibrator; // Vibrator for giving feedback of orientation changes
@@ -772,6 +776,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private boolean mScreenshotChordPowerKeyTriggered;
private long mScreenshotChordPowerKeyTime;
+ // Ringer toggle should reuse timing and triggering from screenshot power and a11y vol up
+ private int mRingerToggleChord = VOLUME_HUSH_OFF;
+
private static final long BUGREPORT_TV_GESTURE_TIMEOUT_MILLIS = 1000;
private boolean mBugreportTvKey1Pressed;
@@ -836,6 +843,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private static final int MSG_LAUNCH_ASSIST_LONG_PRESS = 27;
private static final int MSG_POWER_VERY_LONG_PRESS = 28;
private static final int MSG_NOTIFY_USER_ACTIVITY = 29;
+ private static final int MSG_RINGER_TOGGLE_CHORD = 30;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1;
@@ -943,6 +951,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
android.Manifest.permission.USER_ACTIVITY);
+ case MSG_RINGER_TOGGLE_CHORD:
+ handleRingerChordGesture();
break;
}
}
@@ -996,10 +1006,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.SHOW_ROTATION_SUGGESTIONS), false, this,
UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.VOLUME_HUSH_GESTURE), false, this,
+ UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.POLICY_CONTROL), false, this,
UserHandle.USER_ALL);
- resolver.registerContentObserver(Settings.Global.getUriFor(
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED), false, this,
UserHandle.USER_ALL);
updateSettings();
@@ -1117,6 +1130,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@VisibleForTesting
SystemGesturesPointerEventListener mSystemGestures;
+ private void handleRingerChordGesture() {
+ if (mRingerToggleChord == VOLUME_HUSH_OFF) {
+ return;
+ }
+ getAudioManagerInternal();
+ mAudioManagerInternal.silenceRingerModeInternal("volume_hush");
+ }
+
IStatusBarService getStatusBarService() {
synchronized (mServiceAquireLock) {
if (mStatusBarService == null) {
@@ -1137,6 +1158,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ AudioManagerInternal getAudioManagerInternal() {
+ synchronized (mServiceAquireLock) {
+ if (mAudioManagerInternal == null) {
+ mAudioManagerInternal = LocalServices.getService(AudioManagerInternal.class);
+ }
+ return mAudioManagerInternal;
+ }
+ }
+
/*
* We always let the sensor be switched on by default except when
* the user has explicitly disabled sensor based rotation or when the
@@ -1306,6 +1336,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mScreenshotChordPowerKeyTriggered = true;
mScreenshotChordPowerKeyTime = event.getDownTime();
interceptScreenshotChord();
+ interceptRingerToggleChord();
}
// Stop ringing or end call if configured to do so when power is pressed.
@@ -1701,6 +1732,22 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ private void interceptRingerToggleChord() {
+ if (mRingerToggleChord != Settings.Secure.VOLUME_HUSH_OFF
+ && mScreenshotChordPowerKeyTriggered && mA11yShortcutChordVolumeUpKeyTriggered) {
+ final long now = SystemClock.uptimeMillis();
+ if (now <= mA11yShortcutChordVolumeUpKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS
+ && now <= mScreenshotChordPowerKeyTime
+ + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS) {
+ mA11yShortcutChordVolumeUpKeyConsumed = true;
+ cancelPendingPowerKeyAction();
+
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RINGER_TOGGLE_CHORD),
+ getRingerToggleChordDelay());
+ }
+ }
+ }
+
private long getAccessibilityShortcutTimeout() {
ViewConfiguration config = ViewConfiguration.get(mContext);
return Settings.Secure.getIntForUser(mContext.getContentResolver(),
@@ -1718,6 +1765,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout();
}
+ private long getRingerToggleChordDelay() {
+ // Always timeout like a tap
+ return ViewConfiguration.getTapTimeout();
+ }
+
private void cancelPendingScreenshotChordAction() {
mHandler.removeCallbacks(mScreenshotRunnable);
}
@@ -1726,6 +1778,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mHandler.removeMessages(MSG_ACCESSIBILITY_SHORTCUT);
}
+ private void cancelPendingRingerToggleChordAction() {
+ mHandler.removeMessages(MSG_RINGER_TOGGLE_CHORD);
+ }
+
private final Runnable mEndCallLongPress = new Runnable() {
@Override
public void run() {
@@ -2382,7 +2438,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mSystemNavigationKeysEnabled = Settings.Secure.getIntForUser(resolver,
Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED,
0, UserHandle.USER_CURRENT) == 1;
-
+ mRingerToggleChord = Settings.Secure.getIntForUser(resolver,
+ Settings.Secure.VOLUME_HUSH_GESTURE, VOLUME_HUSH_OFF,
+ UserHandle.USER_CURRENT);
+ if (!mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_volumeHushGestureEnabled)) {
+ mRingerToggleChord = Settings.Secure.VOLUME_HUSH_OFF;
+ }
// Configure rotation suggestions.
int showRotationSuggestions = Settings.Secure.getIntForUser(resolver,
Settings.Secure.SHOW_ROTATION_SUGGESTIONS,
@@ -2522,7 +2584,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
@Override
public int checkAddPermission(WindowManager.LayoutParams attrs, int[] outAppOp) {
- int type = attrs.type;
+ final int type = attrs.type;
+ final boolean isRoundedCornerOverlay =
+ (attrs.privateFlags & PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY) != 0;
+
+ if (isRoundedCornerOverlay && mContext.checkCallingOrSelfPermission(INTERNAL_SYSTEM_WINDOW)
+ != PERMISSION_GRANTED) {
+ return ADD_PERMISSION_DENIED;
+ }
outAppOp[0] = AppOpsManager.OP_NONE;
@@ -3531,6 +3600,25 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ // If a ringer toggle chord could be on the way but we're not sure, then tell the dispatcher
+ // to wait a little while and try again later before dispatching.
+ if (mRingerToggleChord != VOLUME_HUSH_OFF && (flags & KeyEvent.FLAG_FALLBACK) == 0) {
+ if (mA11yShortcutChordVolumeUpKeyTriggered && !mScreenshotChordPowerKeyTriggered) {
+ final long now = SystemClock.uptimeMillis();
+ final long timeoutTime = mA11yShortcutChordVolumeUpKeyTime
+ + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS;
+ if (now < timeoutTime) {
+ return timeoutTime - now;
+ }
+ }
+ if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mA11yShortcutChordVolumeUpKeyConsumed) {
+ if (!down) {
+ mA11yShortcutChordVolumeUpKeyConsumed = false;
+ }
+ return -1;
+ }
+ }
+
// Cancel any pending meta actions if we see any other keys being pressed between the down
// of the meta key and its corresponding up.
if (mPendingMetaAction && !KeyEvent.isMetaKey(keyCode)) {
@@ -5997,6 +6085,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case KeyEvent.KEYCODE_VOLUME_MUTE: {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
if (down) {
+ // Any activity on the vol down button stops the ringer toggle shortcut
+ cancelPendingRingerToggleChordAction();
+
if (interactive && !mScreenshotChordVolumeDownKeyTriggered
&& (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
mScreenshotChordVolumeDownKeyTriggered = true;
@@ -6020,12 +6111,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mA11yShortcutChordVolumeUpKeyConsumed = false;
cancelPendingPowerKeyAction();
cancelPendingScreenshotChordAction();
+ cancelPendingRingerToggleChordAction();
+
interceptAccessibilityShortcutChord();
+ interceptRingerToggleChord();
}
} else {
mA11yShortcutChordVolumeUpKeyTriggered = false;
cancelPendingScreenshotChordAction();
cancelPendingAccessibilityShortcutAction();
+ cancelPendingRingerToggleChordAction();
}
}
if (down) {
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 6674e185118a..ec0521dda40d 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -488,7 +488,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
boolean canAcquireSleepToken();
/**
- * Writes {@link com.android.server.wm.proto.IdentifierProto} to stream.
+ * Writes {@link com.android.server.wm.IdentifierProto} to stream.
*/
void writeIdentifierToProto(ProtoOutputStream proto, long fieldId);
}
@@ -1626,7 +1626,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
/**
* Write the WindowManagerPolicy's state into the protocol buffer.
- * The message is described in {@link com.android.server.wm.proto.WindowManagerPolicyProto}
+ * The message is described in {@link com.android.server.wm.WindowManagerPolicyProto}
*
* @param proto The protocol buffer output stream to write to.
*/
diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java
index 48a196dfcff1..1508c9ecb394 100644
--- a/services/core/java/com/android/server/policy/WindowOrientationListener.java
+++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java
@@ -16,8 +16,8 @@
package com.android.server.policy;
-import static com.android.server.wm.proto.WindowOrientationListenerProto.ENABLED;
-import static com.android.server.wm.proto.WindowOrientationListenerProto.ROTATION;
+import static com.android.server.wm.WindowOrientationListenerProto.ENABLED;
+import static com.android.server.wm.WindowOrientationListenerProto.ROTATION;
import android.content.Context;
import android.hardware.Sensor;
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 58e8f776f9dd..062b154b8c1a 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -1,11 +1,11 @@
package com.android.server.policy.keyguard;
import static android.view.Display.INVALID_DISPLAY;
-import static com.android.server.wm.proto.KeyguardServiceDelegateProto.INTERACTIVE_STATE;
-import static com.android.server.wm.proto.KeyguardServiceDelegateProto.OCCLUDED;
-import static com.android.server.wm.proto.KeyguardServiceDelegateProto.SCREEN_STATE;
-import static com.android.server.wm.proto.KeyguardServiceDelegateProto.SECURE;
-import static com.android.server.wm.proto.KeyguardServiceDelegateProto.SHOWING;
+import static com.android.server.wm.KeyguardServiceDelegateProto.INTERACTIVE_STATE;
+import static com.android.server.wm.KeyguardServiceDelegateProto.OCCLUDED;
+import static com.android.server.wm.KeyguardServiceDelegateProto.SCREEN_STATE;
+import static com.android.server.wm.KeyguardServiceDelegateProto.SECURE;
+import static com.android.server.wm.KeyguardServiceDelegateProto.SHOWING;
import android.app.ActivityManager;
import android.content.ComponentName;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 055e6ea3f4a4..dd88cd1a9266 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -69,7 +69,6 @@ import android.service.dreams.DreamManagerInternal;
import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
import android.util.KeyValueListParser;
-import android.util.MathUtils;
import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.util.SparseArray;
@@ -408,7 +407,7 @@ public final class PowerManagerService extends SystemService
private boolean mDreamsActivateOnDockSetting;
// True if doze should not be started until after the screen off transition.
- private boolean mDozeAfterScreenOffConfig;
+ private boolean mDozeAfterScreenOff;
// The minimum screen off timeout, in milliseconds.
private long mMinimumScreenOffTimeoutConfig;
@@ -896,8 +895,8 @@ public final class PowerManagerService extends SystemService
com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenNotPowered);
mDreamsBatteryLevelDrainCutoffConfig = resources.getInteger(
com.android.internal.R.integer.config_dreamsBatteryLevelDrainCutoff);
- mDozeAfterScreenOffConfig = resources.getBoolean(
- com.android.internal.R.bool.config_dozeAfterScreenOff);
+ mDozeAfterScreenOff = resources.getBoolean(
+ com.android.internal.R.bool.config_dozeAfterScreenOffByDefault);
mMinimumScreenOffTimeoutConfig = resources.getInteger(
com.android.internal.R.integer.config_minimumScreenOffTimeout);
mMaximumScreenDimDurationConfig = resources.getInteger(
@@ -1724,7 +1723,7 @@ public final class PowerManagerService extends SystemService
// Update wireless dock detection state.
final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update(
- mIsPowered, mPlugType, mBatteryLevel);
+ mIsPowered, mPlugType);
// Treat plugging and unplugging the devices as a user activity.
// Users find it disconcerting when they plug or unplug the device
@@ -2507,7 +2506,7 @@ public final class PowerManagerService extends SystemService
if ((mWakeLockSummary & WAKE_LOCK_DOZE) != 0) {
return DisplayPowerRequest.POLICY_DOZE;
}
- if (mDozeAfterScreenOffConfig) {
+ if (mDozeAfterScreenOff) {
return DisplayPowerRequest.POLICY_OFF;
}
// Fall through and preserve the current screen policy if not configured to
@@ -3094,6 +3093,12 @@ public final class PowerManagerService extends SystemService
light.setFlashing(color, Light.LIGHT_FLASH_HARDWARE, (on ? 3 : 0), 0);
}
+ private void setDozeAfterScreenOffInternal(boolean on) {
+ synchronized (mLock) {
+ mDozeAfterScreenOff = on;
+ }
+ }
+
private void boostScreenBrightnessInternal(long eventTime, int uid) {
synchronized (mLock) {
if (!mSystemReady || mWakefulness == WAKEFULNESS_ASLEEP
@@ -3372,7 +3377,7 @@ public final class PowerManagerService extends SystemService
pw.println(" mDreamsEnabledSetting=" + mDreamsEnabledSetting);
pw.println(" mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting);
pw.println(" mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting);
- pw.println(" mDozeAfterScreenOffConfig=" + mDozeAfterScreenOffConfig);
+ pw.println(" mDozeAfterScreenOff=" + mDozeAfterScreenOff);
pw.println(" mLowPowerModeSetting=" + mLowPowerModeSetting);
pw.println(" mAutoLowPowerModeConfigured=" + mAutoLowPowerModeConfigured);
pw.println(" mAutoLowPowerModeSnoozing=" + mAutoLowPowerModeSnoozing);
@@ -3656,7 +3661,7 @@ public final class PowerManagerService extends SystemService
mDreamsActivateOnDockSetting);
proto.write(
PowerServiceSettingsAndConfigurationDumpProto.IS_DOZE_AFTER_SCREEN_OFF_CONFIG,
- mDozeAfterScreenOffConfig);
+ mDozeAfterScreenOff);
proto.write(
PowerServiceSettingsAndConfigurationDumpProto.IS_LOW_POWER_MODE_SETTING,
mLowPowerModeSetting);
@@ -4603,6 +4608,19 @@ public final class PowerManagerService extends SystemService
}
@Override // Binder call
+ public void setDozeAfterScreenOff(boolean on) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.DEVICE_POWER, null);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ setDozeAfterScreenOffInternal(on);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override // Binder call
public void boostScreenBrightness(long eventTime) {
if (eventTime > SystemClock.uptimeMillis()) {
throw new IllegalArgumentException("event time must not be in the future");
diff --git a/services/core/java/com/android/server/power/WirelessChargerDetector.java b/services/core/java/com/android/server/power/WirelessChargerDetector.java
index 54487e39d82f..18e5ce465df6 100644
--- a/services/core/java/com/android/server/power/WirelessChargerDetector.java
+++ b/services/core/java/com/android/server/power/WirelessChargerDetector.java
@@ -84,10 +84,6 @@ final class WirelessChargerDetector {
// The minimum number of samples that must be collected.
private static final int MIN_SAMPLES = 3;
- // Upper bound on the battery charge percentage in order to consider turning
- // the screen on when the device starts charging wirelessly.
- private static final int WIRELESS_CHARGER_TURN_ON_BATTERY_LEVEL_LIMIT = 95;
-
// To detect movement, we compute the angle between the gravity vector
// at rest and the current gravity vector. This field specifies the
// cosine of the maximum angle variance that we tolerate while at rest.
@@ -214,11 +210,10 @@ final class WirelessChargerDetector {
*
* @param isPowered True if the device is powered.
* @param plugType The current plug type.
- * @param batteryLevel The current battery level.
* @return True if the device is determined to have just been docked on a wireless
* charger, after suppressing spurious docking or undocking signals.
*/
- public boolean update(boolean isPowered, int plugType, int batteryLevel) {
+ public boolean update(boolean isPowered, int plugType) {
synchronized (mLock) {
final boolean wasPoweredWirelessly = mPoweredWirelessly;
@@ -249,13 +244,9 @@ final class WirelessChargerDetector {
}
// Report that the device has been docked only if the device just started
- // receiving power wirelessly, has a high enough battery level that we
- // can be assured that charging was not delayed due to the battery previously
- // having been full, and the device is not known to already be at rest
+ // receiving power wirelessly and the device is not known to already be at rest
// on the wireless charger from earlier.
- return mPoweredWirelessly && !wasPoweredWirelessly
- && batteryLevel < WIRELESS_CHARGER_TURN_ON_BATTERY_LEVEL_LIMIT
- && !mAtRest;
+ return mPoweredWirelessly && !wasPoweredWirelessly && !mAtRest;
}
}
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
index a9a1456e7c12..c5275333b184 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
@@ -16,18 +16,12 @@
package com.android.server.power.batterysaver;
import android.Manifest;
-import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
-import android.app.Notification;
-import android.app.Notification.BigTextStyle;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.power.V1_0.PowerHint;
-import android.net.Uri;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.Looper;
@@ -40,10 +34,7 @@ import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Slog;
-import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
-import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import com.android.server.EventLogTags;
@@ -76,8 +67,6 @@ public class BatterySaverController implements BatterySaverPolicyListener {
private final BatterySavingStats mBatterySavingStats;
- private static final String WARNING_LINK_URL = "http://goto.google.com/extreme-battery-saver";
-
@GuardedBy("mLock")
private final ArrayList<LowPowerModeListener> mListeners = new ArrayList<>();
@@ -331,12 +320,6 @@ public class BatterySaverController implements BatterySaverPolicyListener {
}
if (sendBroadcast) {
- if (enabled) {
- // STOPSHIP Remove the toast.
- postWarningNotification();
- } else {
- cancelWarningNotification();
- }
if (DEBUG) {
Slog.i(TAG, "Sending broadcasts for mode: " + enabled);
@@ -368,53 +351,6 @@ public class BatterySaverController implements BatterySaverPolicyListener {
}
}
- private void postWarningNotification() {
- final UserHandle foregroundUser = UserHandle.of(ActivityManager.getCurrentUser());
-
- final PendingIntent pendingIntent = PendingIntent
- .getActivityAsUser(mContext, 0,
- new Intent(Intent.ACTION_VIEW, Uri.parse(WARNING_LINK_URL)),
- PendingIntent.FLAG_CANCEL_CURRENT, null,
- foregroundUser);
-
- final CharSequence title = mContext.getString
- (com.android.internal.R.string.battery_saver_warning_title);
- final CharSequence text = mContext.getString
- (com.android.internal.R.string.battery_saver_warning);
-
- final Notification notification =
- new Notification.Builder(mContext, SystemNotificationChannels.ALERTS)
- .setSmallIcon(R.drawable.stat_notify_error)
- .setTicker(title)
- .setWhen(System.currentTimeMillis())
- .setContentTitle(title)
- .setContentText(text)
- .setContentIntent(pendingIntent)
- .setStyle(new BigTextStyle().bigText(text))
- .build();
-
- final NotificationManager nm = mContext.getSystemService(NotificationManager.class);
-
- if (nm != null) {
- nm.notifyAsUser(title.toString(),
- SystemMessage.NOTE_BATTERY_SAVER_WARNING,
- notification,
- foregroundUser);
- }
- }
-
- private void cancelWarningNotification() {
- final UserHandle foregroundUser = UserHandle.of(ActivityManager.getCurrentUser());
- final CharSequence title = mContext.getString
- (com.android.internal.R.string.battery_saver_warning_title);
-
- final NotificationManager nm = mContext.getSystemService(NotificationManager.class);
- if (nm != null) {
- nm.cancelAsUser(title.toString(), SystemMessage.NOTE_BATTERY_SAVER_WARNING,
- foregroundUser);
- }
- }
-
private void updateBatterySavingStats() {
final PowerManager pm = getPowerManager();
if (pm == null) {
diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java
index a7dfd35acf1b..0b7d9d02f1cb 100644
--- a/services/core/java/com/android/server/slice/SliceManagerService.java
+++ b/services/core/java/com/android/server/slice/SliceManagerService.java
@@ -16,6 +16,8 @@
package com.android.server.slice;
+import static android.app.usage.UsageEvents.Event.SLICE_PINNED;
+import static android.app.usage.UsageEvents.Event.SLICE_PINNED_PRIV;
import static android.content.ContentProvider.getUriWithoutUserId;
import static android.content.ContentProvider.getUserIdFromUri;
import static android.content.ContentProvider.maybeAddUserId;
@@ -31,6 +33,7 @@ import android.app.IActivityManager;
import android.app.slice.ISliceManager;
import android.app.slice.SliceManager;
import android.app.slice.SliceSpec;
+import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -95,6 +98,7 @@ public class SliceManagerService extends ISliceManager.Stub {
private final AtomicFile mSliceAccessFile;
@GuardedBy("mAccessList")
private final SliceFullAccessList mAccessList;
+ private final UsageStatsManagerInternal mAppUsageStats;
public SliceManagerService(Context context) {
this(context, createHandler().getLooper());
@@ -112,6 +116,7 @@ public class SliceManagerService extends ISliceManager.Stub {
final File systemDir = new File(Environment.getDataDirectory(), "system");
mSliceAccessFile = new AtomicFile(new File(systemDir, "slice_access.xml"));
mAccessList = new SliceFullAccessList(mContext);
+ mAppUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
synchronized (mSliceAccessFile) {
if (!mSliceAccessFile.exists()) return;
@@ -166,8 +171,19 @@ public class SliceManagerService extends ISliceManager.Stub {
public void pinSlice(String pkg, Uri uri, SliceSpec[] specs, IBinder token) throws RemoteException {
verifyCaller(pkg);
enforceAccess(pkg, uri);
- uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
+ int user = Binder.getCallingUserHandle().getIdentifier();
+ uri = maybeAddUserId(uri, user);
getOrCreatePinnedSlice(uri, pkg).pin(pkg, specs, token);
+
+ Uri finalUri = uri;
+ mHandler.post(() -> {
+ String slicePkg = getProviderPkg(finalUri, user);
+ if (slicePkg != null && !Objects.equals(pkg, slicePkg)) {
+ mAppUsageStats.reportEvent(slicePkg, user,
+ isAssistant(pkg, user) || isDefaultHomeApp(pkg, user)
+ ? SLICE_PINNED_PRIV : SLICE_PINNED);
+ }
+ });
}
@Override
@@ -352,36 +368,43 @@ public class SliceManagerService extends ISliceManager.Stub {
if (getContext().checkUriPermission(uri, pid, uid,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != PERMISSION_GRANTED) {
// Last fallback (if the calling app owns the authority, then it can have access).
- long ident = Binder.clearCallingIdentity();
+ if (!Objects.equals(getProviderPkg(uri, user), pkg)) {
+ return PERMISSION_DENIED;
+ }
+ }
+ }
+ return PERMISSION_GRANTED;
+ }
+
+ private String getProviderPkg(Uri uri, int user) {
+ long ident = Binder.clearCallingIdentity();
+ try {
+ IBinder token = new Binder();
+ IActivityManager activityManager = ActivityManager.getService();
+ ContentProviderHolder holder = null;
+ String providerName = getUriWithoutUserId(uri).getAuthority();
+ try {
try {
- IBinder token = new Binder();
- IActivityManager activityManager = ActivityManager.getService();
- ContentProviderHolder holder = null;
- String providerName = getUriWithoutUserId(uri).getAuthority();
- try {
- try {
- holder = activityManager.getContentProviderExternal(
- providerName, getUserIdFromUri(uri, user), token);
- if (holder == null || holder.info == null
- || !Objects.equals(holder.info.packageName, pkg)) {
- return PERMISSION_DENIED;
- }
- } finally {
- if (holder != null && holder.provider != null) {
- activityManager.removeContentProviderExternal(providerName, token);
- }
- }
- } catch (RemoteException e) {
- // Can't happen.
- e.rethrowAsRuntimeException();
+ holder = activityManager.getContentProviderExternal(
+ providerName, getUserIdFromUri(uri, user), token);
+ if (holder != null && holder.info != null) {
+ return holder.info.packageName;
+ } else {
+ return null;
}
} finally {
- // I know, the double finally seems ugly, but seems safest for the identity.
- Binder.restoreCallingIdentity(ident);
+ if (holder != null && holder.provider != null) {
+ activityManager.removeContentProviderExternal(providerName, token);
+ }
}
+ } catch (RemoteException e) {
+ // Can't happen.
+ throw e.rethrowAsRuntimeException();
}
+ } finally {
+ // I know, the double finally seems ugly, but seems safest for the identity.
+ Binder.restoreCallingIdentity(ident);
}
- return PERMISSION_GRANTED;
}
private void enforceCrossUser(String pkg, Uri uri) {
diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
index 60535122929e..6df7092cf811 100644
--- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
+++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
@@ -16,7 +16,9 @@
package com.android.server.textclassifier;
+import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -25,12 +27,14 @@ import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
-import android.util.Slog;
-import android.service.textclassifier.ITextClassifierService;
+import android.os.UserHandle;
import android.service.textclassifier.ITextClassificationCallback;
+import android.service.textclassifier.ITextClassifierService;
import android.service.textclassifier.ITextLinksCallback;
import android.service.textclassifier.ITextSelectionCallback;
import android.service.textclassifier.TextClassifierService;
+import android.util.Slog;
+import android.util.SparseArray;
import android.view.textclassifier.SelectionEvent;
import android.view.textclassifier.TextClassification;
import android.view.textclassifier.TextClassifier;
@@ -38,12 +42,13 @@ import android.view.textclassifier.TextLinks;
import android.view.textclassifier.TextSelection;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.FunctionalUtils;
+import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
import com.android.internal.util.Preconditions;
import com.android.server.SystemService;
-import java.util.LinkedList;
+import java.util.ArrayDeque;
import java.util.Queue;
-import java.util.concurrent.Callable;
/**
* A manager for TextClassifier services.
@@ -73,58 +78,44 @@ public final class TextClassificationManagerService extends ITextClassifierServi
Slog.e(LOG_TAG, "Could not start the TextClassificationManagerService.", t);
}
}
- }
- private final Context mContext;
- private final Intent mServiceIntent;
- private final ServiceConnection mConnection;
- private final Object mLock;
- @GuardedBy("mLock")
- private final Queue<PendingRequest> mPendingRequests;
+ @Override
+ public void onStartUser(int userId) {
+ processAnyPendingWork(userId);
+ }
- @GuardedBy("mLock")
- private ITextClassifierService mService;
- @GuardedBy("mLock")
- private boolean mBinding;
+ @Override
+ public void onUnlockUser(int userId) {
+ // Rebind if we failed earlier due to locked encrypted user
+ processAnyPendingWork(userId);
+ }
- private TextClassificationManagerService(Context context) {
- mContext = Preconditions.checkNotNull(context);
- mServiceIntent = new Intent(TextClassifierService.SERVICE_INTERFACE)
- .setComponent(TextClassifierService.getServiceComponentName(mContext));
- mConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- synchronized (mLock) {
- mService = ITextClassifierService.Stub.asInterface(service);
- setBindingLocked(false);
- handlePendingRequestsLocked();
- }
+ private void processAnyPendingWork(int userId) {
+ synchronized (mManagerService.mLock) {
+ mManagerService.getUserStateLocked(userId).bindIfHasPendingRequestsLocked();
}
+ }
- @Override
- public void onServiceDisconnected(ComponentName name) {
- cleanupService();
+ @Override
+ public void onStopUser(int userId) {
+ synchronized (mManagerService.mLock) {
+ UserState userState = mManagerService.peekUserStateLocked(userId);
+ if (userState != null) {
+ userState.mConnection.cleanupService();
+ mManagerService.mUserStates.remove(userId);
+ }
}
+ }
- @Override
- public void onBindingDied(ComponentName name) {
- cleanupService();
- }
+ }
- @Override
- public void onNullBinding(ComponentName name) {
- cleanupService();
- }
+ private final Context mContext;
+ private final Object mLock;
+ @GuardedBy("mLock")
+ final SparseArray<UserState> mUserStates = new SparseArray<>();
- private void cleanupService() {
- synchronized (mLock) {
- mService = null;
- setBindingLocked(false);
- handlePendingRequestsLocked();
- }
- }
- };
- mPendingRequests = new LinkedList<>();
+ private TextClassificationManagerService(Context context) {
+ mContext = Preconditions.checkNotNull(context);
mLock = new Object();
}
@@ -133,30 +124,20 @@ public final class TextClassificationManagerService extends ITextClassifierServi
CharSequence text, int selectionStartIndex, int selectionEndIndex,
TextSelection.Options options, ITextSelectionCallback callback)
throws RemoteException {
- // TODO(b/72481438): All remote calls need to take userId.
validateInput(text, selectionStartIndex, selectionEndIndex, callback);
- if (!bind()) {
- callback.onFailure();
- return;
- }
-
synchronized (mLock) {
- if (isBoundLocked()) {
- mService.onSuggestSelection(
+ UserState userState = getCallingUserStateLocked();
+ if (!userState.bindLocked()) {
+ callback.onFailure();
+ } else if (userState.isBoundLocked()) {
+ userState.mService.onSuggestSelection(
text, selectionStartIndex, selectionEndIndex, options, callback);
} else {
- final Callable<Void> request = () -> {
- onSuggestSelection(
- text, selectionStartIndex, selectionEndIndex,
- options, callback);
- return null;
- };
- final Callable<Void> onServiceFailure = () -> {
- callback.onFailure();
- return null;
- };
- enqueueRequestLocked(request, onServiceFailure, callback.asBinder());
+ userState.mPendingRequests.add(new PendingRequest(
+ () -> onSuggestSelection(
+ text, selectionStartIndex, selectionEndIndex, options, callback),
+ callback::onFailure, callback.asBinder(), this, userState));
}
}
}
@@ -168,24 +149,16 @@ public final class TextClassificationManagerService extends ITextClassifierServi
throws RemoteException {
validateInput(text, startIndex, endIndex, callback);
- if (!bind()) {
- callback.onFailure();
- return;
- }
-
synchronized (mLock) {
- if (isBoundLocked()) {
- mService.onClassifyText(text, startIndex, endIndex, options, callback);
+ UserState userState = getCallingUserStateLocked();
+ if (!userState.bindLocked()) {
+ callback.onFailure();
+ } else if (userState.isBoundLocked()) {
+ userState.mService.onClassifyText(text, startIndex, endIndex, options, callback);
} else {
- final Callable<Void> request = () -> {
- onClassifyText(text, startIndex, endIndex, options, callback);
- return null;
- };
- final Callable<Void> onServiceFailure = () -> {
- callback.onFailure();
- return null;
- };
- enqueueRequestLocked(request, onServiceFailure, callback.asBinder());
+ userState.mPendingRequests.add(new PendingRequest(
+ () -> onClassifyText(text, startIndex, endIndex, options, callback),
+ callback::onFailure, callback.asBinder(), this, userState));
}
}
}
@@ -196,24 +169,16 @@ public final class TextClassificationManagerService extends ITextClassifierServi
throws RemoteException {
validateInput(text, callback);
- if (!bind()) {
- callback.onFailure();
- return;
- }
-
synchronized (mLock) {
- if (isBoundLocked()) {
- mService.onGenerateLinks(text, options, callback);
+ UserState userState = getCallingUserStateLocked();
+ if (!userState.bindLocked()) {
+ callback.onFailure();
+ } else if (userState.isBoundLocked()) {
+ userState.mService.onGenerateLinks(text, options, callback);
} else {
- final Callable<Void> request = () -> {
- onGenerateLinks(text, options, callback);
- return null;
- };
- final Callable<Void> onServiceFailure = () -> {
- callback.onFailure();
- return null;
- };
- enqueueRequestLocked(request, onServiceFailure, callback.asBinder());
+ userState.mPendingRequests.add(new PendingRequest(
+ () -> onGenerateLinks(text, options, callback),
+ callback::onFailure, callback.asBinder(), this, userState));
}
}
}
@@ -223,99 +188,63 @@ public final class TextClassificationManagerService extends ITextClassifierServi
validateInput(event, mContext);
synchronized (mLock) {
- if (isBoundLocked()) {
- mService.onSelectionEvent(event);
+ UserState userState = getCallingUserStateLocked();
+ if (userState.isBoundLocked()) {
+ userState.mService.onSelectionEvent(event);
} else {
- final Callable<Void> request = () -> {
- onSelectionEvent(event);
- return null;
- };
- enqueueRequestLocked(request, null /* onServiceFailure */, null /* binder */);
- }
- }
- }
-
- /**
- * @return true if the service is bound or in the process of being bound.
- * Returns false otherwise.
- */
- private boolean bind() {
- synchronized (mLock) {
- if (isBoundLocked() || isBindingLocked()) {
- return true;
- }
-
- // TODO: Handle bind timeout.
- final boolean willBind;
- final long identity = Binder.clearCallingIdentity();
- try {
- Slog.d(LOG_TAG, "Binding to " + mServiceIntent.getComponent());
- willBind = mContext.bindServiceAsUser(
- mServiceIntent, mConnection,
- Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
- Binder.getCallingUserHandle());
- setBindingLocked(willBind);
- } finally {
- Binder.restoreCallingIdentity(identity);
+ userState.mPendingRequests.add(new PendingRequest(
+ () -> onSelectionEvent(event),
+ null /* onServiceFailure */, null /* binder */, this, userState));
}
- return willBind;
}
}
- @GuardedBy("mLock")
- private boolean isBoundLocked() {
- return mService != null;
- }
-
- @GuardedBy("mLock")
- private boolean isBindingLocked() {
- return mBinding;
+ private UserState getCallingUserStateLocked() {
+ return getUserStateLocked(UserHandle.getCallingUserId());
}
- @GuardedBy("mLock")
- private void setBindingLocked(boolean binding) {
- mBinding = binding;
+ private UserState getUserStateLocked(int userId) {
+ UserState result = mUserStates.get(userId);
+ if (result == null) {
+ result = new UserState(userId, mContext, mLock);
+ mUserStates.put(userId, result);
+ }
+ return result;
}
- @GuardedBy("mLock")
- private void enqueueRequestLocked(
- Callable<Void> request, Callable<Void> onServiceFailure, IBinder binder) {
- mPendingRequests.add(new PendingRequest(request, onServiceFailure, binder));
+ UserState peekUserStateLocked(int userId) {
+ return mUserStates.get(userId);
}
- @GuardedBy("mLock")
- private void handlePendingRequestsLocked() {
- // TODO(b/72481146): Implement PendingRequest similar to that in RemoteFillService.
- final PendingRequest[] pendingRequests =
- mPendingRequests.toArray(new PendingRequest[mPendingRequests.size()]);
- for (PendingRequest pendingRequest : pendingRequests) {
- if (isBoundLocked()) {
- pendingRequest.executeLocked();
- } else {
- pendingRequest.notifyServiceFailureLocked();
- }
- }
- }
+ private static final class PendingRequest implements IBinder.DeathRecipient {
- private final class PendingRequest implements IBinder.DeathRecipient {
-
- private final Callable<Void> mRequest;
- @Nullable private final Callable<Void> mOnServiceFailure;
@Nullable private final IBinder mBinder;
+ @NonNull private final Runnable mRequest;
+ @Nullable private final Runnable mOnServiceFailure;
+ @GuardedBy("mLock")
+ @NonNull private final UserState mOwningUser;
+ @NonNull private final TextClassificationManagerService mService;
/**
* Initializes a new pending request.
- *
* @param request action to perform when the service is bound
* @param onServiceFailure action to perform when the service dies or disconnects
* @param binder binder to the process that made this pending request
+ * @param service
+ * @param owningUser
*/
PendingRequest(
- Callable<Void> request, @Nullable Callable<Void> onServiceFailure,
- @Nullable IBinder binder) {
- mRequest = Preconditions.checkNotNull(request);
- mOnServiceFailure = onServiceFailure;
+ @NonNull ThrowingRunnable request, @Nullable ThrowingRunnable onServiceFailure,
+ @Nullable IBinder binder,
+ TextClassificationManagerService service,
+ UserState owningUser) {
+ mRequest =
+ logOnFailure(Preconditions.checkNotNull(request), "handling pending request");
+ mOnServiceFailure =
+ logOnFailure(onServiceFailure, "notifying callback of service failure");
mBinder = binder;
+ mService = service;
+ mOwningUser = owningUser;
if (mBinder != null) {
try {
mBinder.linkToDeath(this, 0);
@@ -325,32 +254,9 @@ public final class TextClassificationManagerService extends ITextClassifierServi
}
}
- @GuardedBy("mLock")
- void executeLocked() {
- removeLocked();
- try {
- mRequest.call();
- } catch (Exception e) {
- Slog.d(LOG_TAG, "Error handling pending request: " + e.getMessage());
- }
- }
-
- @GuardedBy("mLock")
- void notifyServiceFailureLocked() {
- removeLocked();
- if (mOnServiceFailure != null) {
- try {
- mOnServiceFailure.call();
- } catch (Exception e) {
- Slog.d(LOG_TAG, "Error notifying callback of service failure: "
- + e.getMessage());
- }
- }
- }
-
@Override
public void binderDied() {
- synchronized (mLock) {
+ synchronized (mService.mLock) {
// No need to handle this pending request anymore. Remove.
removeLocked();
}
@@ -358,13 +264,19 @@ public final class TextClassificationManagerService extends ITextClassifierServi
@GuardedBy("mLock")
private void removeLocked() {
- mPendingRequests.remove(this);
+ mOwningUser.mPendingRequests.remove(this);
if (mBinder != null) {
mBinder.unlinkToDeath(this, 0);
}
}
}
+ private static Runnable logOnFailure(@Nullable ThrowingRunnable r, String opDesc) {
+ if (r == null) return null;
+ return FunctionalUtils.handleExceptions(r,
+ e -> Slog.d(LOG_TAG, "Error " + opDesc + ": " + e.getMessage()));
+ }
+
private static void validateInput(
CharSequence text, int startIndex, int endIndex, Object callback)
throws RemoteException {
@@ -396,4 +308,119 @@ public final class TextClassificationManagerService extends ITextClassifierServi
throw new RemoteException(e.getMessage());
}
}
+
+ private static final class UserState {
+ @UserIdInt final int mUserId;
+ final TextClassifierServiceConnection mConnection = new TextClassifierServiceConnection();
+ @GuardedBy("mLock")
+ final Queue<PendingRequest> mPendingRequests = new ArrayDeque<>();
+ @GuardedBy("mLock")
+ ITextClassifierService mService;
+ @GuardedBy("mLock")
+ boolean mBinding;
+
+ private final Context mContext;
+ private final Object mLock;
+
+ private UserState(int userId, Context context, Object lock) {
+ mUserId = userId;
+ mContext = Preconditions.checkNotNull(context);
+ mLock = Preconditions.checkNotNull(lock);
+ }
+
+ @GuardedBy("mLock")
+ boolean isBoundLocked() {
+ return mService != null;
+ }
+
+ @GuardedBy("mLock")
+ private void handlePendingRequestsLocked() {
+ // TODO(b/72481146): Implement PendingRequest similar to that in RemoteFillService.
+ PendingRequest request;
+ while ((request = mPendingRequests.poll()) != null) {
+ if (isBoundLocked()) {
+ request.mRequest.run();
+ } else {
+ if (request.mOnServiceFailure != null) {
+ request.mOnServiceFailure.run();
+ }
+ }
+
+ if (request.mBinder != null) {
+ request.mBinder.unlinkToDeath(request, 0);
+ }
+ }
+ }
+
+ private boolean bindIfHasPendingRequestsLocked() {
+ return !mPendingRequests.isEmpty() && bindLocked();
+ }
+
+ /**
+ * @return true if the service is bound or in the process of being bound.
+ * Returns false otherwise.
+ */
+ private boolean bindLocked() {
+ if (isBoundLocked() || mBinding) {
+ return true;
+ }
+
+ // TODO: Handle bind timeout.
+ final boolean willBind;
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ ComponentName componentName =
+ TextClassifierService.getServiceComponentName(mContext);
+ if (componentName == null) {
+ // Might happen if the storage is encrypted and the user is not unlocked
+ return false;
+ }
+ Intent serviceIntent = new Intent(TextClassifierService.SERVICE_INTERFACE)
+ .setComponent(componentName);
+ Slog.d(LOG_TAG, "Binding to " + serviceIntent.getComponent());
+ willBind = mContext.bindServiceAsUser(
+ serviceIntent, mConnection,
+ Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
+ UserHandle.of(mUserId));
+ mBinding = willBind;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ return willBind;
+ }
+
+ private final class TextClassifierServiceConnection implements ServiceConnection {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ init(ITextClassifierService.Stub.asInterface(service));
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ cleanupService();
+ }
+
+ @Override
+ public void onBindingDied(ComponentName name) {
+ cleanupService();
+ }
+
+ @Override
+ public void onNullBinding(ComponentName name) {
+ cleanupService();
+ }
+
+ void cleanupService() {
+ init(null);
+ }
+
+ private void init(@Nullable ITextClassifierService service) {
+ synchronized (mLock) {
+ mService = service;
+ mBinding = false;
+ handlePendingRequestsLocked();
+ }
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index c31cdec0a0fc..641a1ba68648 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -1096,10 +1096,7 @@ final class AccessibilityController {
// Add windows of certain types not covered by modal windows.
if (isReportedWindowType(windowState.mAttrs.type)) {
// Add the window to the ones to be reported.
- WindowInfo window = obtainPopulatedWindowInfo(windowState, boundsInScreen);
- window.layer = addedWindows.size();
- addedWindows.add(window.token);
- windows.add(window);
+ addPopulatedWindowInfo(windowState, boundsInScreen, windows, addedWindows);
if (windowState.isFocused()) {
focusedWindowAdded = true;
}
@@ -1150,10 +1147,8 @@ final class AccessibilityController {
computeWindowBoundsInScreen(windowState, boundsInScreen);
// Add the window to the ones to be reported.
- WindowInfo window = obtainPopulatedWindowInfo(windowState,
- boundsInScreen);
- addedWindows.add(window.token);
- windows.add(window);
+ addPopulatedWindowInfo(
+ windowState, boundsInScreen, windows, addedWindows);
break;
}
}
@@ -1244,11 +1239,14 @@ final class AccessibilityController {
(int) windowFrame.right, (int) windowFrame.bottom);
}
- private static WindowInfo obtainPopulatedWindowInfo(
- WindowState windowState, Rect boundsInScreen) {
+ private static void addPopulatedWindowInfo(
+ WindowState windowState, Rect boundsInScreen,
+ List<WindowInfo> out, Set<IBinder> tokenOut) {
final WindowInfo window = windowState.getWindowInfo();
window.boundsInScreen.set(boundsInScreen);
- return window;
+ window.layer = tokenOut.size();
+ out.add(window);
+ tokenOut.add(window.token);
}
private void cacheWindows(List<WindowInfo> windows) {
diff --git a/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java b/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java
new file mode 100644
index 000000000000..ae343da30c74
--- /dev/null
+++ b/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.wm;
+
+import android.util.ArrayMap;
+import android.util.ArraySet;
+
+import java.util.ArrayList;
+
+/**
+ * Keeps track of all {@link AppWindowToken} that are animating and makes sure all animations are
+ * finished at the same time such that we don't run into issues with z-ordering: An activity A
+ * that has a shorter animation that is above another activity B with a longer animation in the same
+ * task, the animation layer would put the B on top of A, but from the hierarchy, A needs to be on
+ * top of B. Thus, we defer reparenting A to the original hierarchy such that it stays on top of B
+ * until B finishes animating.
+ */
+class AnimatingAppWindowTokenRegistry {
+
+ private ArraySet<AppWindowToken> mAnimatingTokens = new ArraySet<>();
+ private ArrayMap<AppWindowToken, Runnable> mFinishedTokens = new ArrayMap<>();
+
+ private ArrayList<Runnable> mTmpRunnableList = new ArrayList<>();
+
+ /**
+ * Notifies that an {@link AppWindowToken} has started animating.
+ */
+ void notifyStarting(AppWindowToken token) {
+ mAnimatingTokens.add(token);
+ }
+
+ /**
+ * Notifies that an {@link AppWindowToken} has finished animating.
+ */
+ void notifyFinished(AppWindowToken token) {
+ mAnimatingTokens.remove(token);
+ mFinishedTokens.remove(token);
+ }
+
+ /**
+ * Called when an {@link AppWindowToken} is about to finish animating.
+ *
+ * @param endDeferFinishCallback Callback to run when defer finish should be ended.
+ * @return {@code true} if finishing the animation should be deferred, {@code false} otherwise.
+ */
+ boolean notifyAboutToFinish(AppWindowToken token, Runnable endDeferFinishCallback) {
+ final boolean removed = mAnimatingTokens.remove(token);
+ if (!removed) {
+ return false;
+ }
+
+ if (mAnimatingTokens.isEmpty()) {
+
+ // If no animations are animating anymore, finish all others.
+ endDeferringFinished();
+ return false;
+ } else {
+
+ // Otherwise let's put it into the pending list of to be finished animations.
+ mFinishedTokens.put(token, endDeferFinishCallback);
+ return true;
+ }
+ }
+
+ private void endDeferringFinished() {
+ // Copy it into a separate temp list to avoid modifying the collection while iterating as
+ // calling the callback may call back into notifyFinished.
+ for (int i = mFinishedTokens.size() - 1; i >= 0; i--) {
+ mTmpRunnableList.add(mFinishedTokens.valueAt(i));
+ }
+ mFinishedTokens.clear();
+ for (int i = mTmpRunnableList.size() - 1; i >= 0; i--) {
+ mTmpRunnableList.get(i).run();
+ }
+ mTmpRunnableList.clear();
+ }
+}
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 93ca4dc48319..41ae48a05c0f 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -70,8 +70,8 @@ import static com.android.server.wm.WindowManagerInternal.AppTransitionListener;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE;
-import static com.android.server.wm.proto.AppTransitionProto.APP_TRANSITION_STATE;
-import static com.android.server.wm.proto.AppTransitionProto.LAST_USED_APP_TRANSITION;
+import static com.android.server.wm.AppTransitionProto.APP_TRANSITION_STATE;
+import static com.android.server.wm.AppTransitionProto.LAST_USED_APP_TRANSITION;
import android.annotation.DrawableRes;
import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/wm/AppWindowThumbnail.java b/services/core/java/com/android/server/wm/AppWindowThumbnail.java
index 3cd3e8b0912e..ad92f81f4dde 100644
--- a/services/core/java/com/android/server/wm/AppWindowThumbnail.java
+++ b/services/core/java/com/android/server/wm/AppWindowThumbnail.java
@@ -20,9 +20,9 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
-import static com.android.server.wm.proto.AppWindowThumbnailProto.HEIGHT;
-import static com.android.server.wm.proto.AppWindowThumbnailProto.SURFACE_ANIMATOR;
-import static com.android.server.wm.proto.AppWindowThumbnailProto.WIDTH;
+import static com.android.server.wm.AppWindowThumbnailProto.HEIGHT;
+import static com.android.server.wm.AppWindowThumbnailProto.SURFACE_ANIMATOR;
+import static com.android.server.wm.AppWindowThumbnailProto.WIDTH;
import android.graphics.GraphicBuffer;
import android.graphics.PixelFormat;
@@ -119,7 +119,7 @@ class AppWindowThumbnail implements Animatable {
/**
* Write to a protocol buffer output stream. Protocol buffer message definition is at {@link
- * com.android.server.wm.proto.AppWindowThumbnailProto}.
+ * com.android.server.wm.AppWindowThumbnailProto}.
*
* @param proto Stream to write the AppWindowThumbnail object to.
* @param fieldId Field Id of the AppWindowThumbnail as defined in the parent message.
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index d2ddf551fc8d..85436da8dab7 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -51,29 +51,29 @@ import static com.android.server.wm.WindowManagerService.H.NOTIFY_ACTIVITY_DRAWN
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
import static com.android.server.wm.WindowManagerService.logWithStack;
-import static com.android.server.wm.proto.AppWindowTokenProto.ALL_DRAWN;
-import static com.android.server.wm.proto.AppWindowTokenProto.APP_STOPPED;
-import static com.android.server.wm.proto.AppWindowTokenProto.CLIENT_HIDDEN;
-import static com.android.server.wm.proto.AppWindowTokenProto.DEFER_HIDING_CLIENT;
-import static com.android.server.wm.proto.AppWindowTokenProto.FILLS_PARENT;
-import static com.android.server.wm.proto.AppWindowTokenProto.FROZEN_BOUNDS;
-import static com.android.server.wm.proto.AppWindowTokenProto.HIDDEN_REQUESTED;
-import static com.android.server.wm.proto.AppWindowTokenProto.HIDDEN_SET_FROM_TRANSFERRED_STARTING_WINDOW;
-import static com.android.server.wm.proto.AppWindowTokenProto.IS_REALLY_ANIMATING;
-import static com.android.server.wm.proto.AppWindowTokenProto.IS_WAITING_FOR_TRANSITION_START;
-import static com.android.server.wm.proto.AppWindowTokenProto.LAST_ALL_DRAWN;
-import static com.android.server.wm.proto.AppWindowTokenProto.LAST_SURFACE_SHOWING;
-import static com.android.server.wm.proto.AppWindowTokenProto.NAME;
-import static com.android.server.wm.proto.AppWindowTokenProto.NUM_DRAWN_WINDOWS;
-import static com.android.server.wm.proto.AppWindowTokenProto.NUM_INTERESTING_WINDOWS;
-import static com.android.server.wm.proto.AppWindowTokenProto.REMOVED;
-import static com.android.server.wm.proto.AppWindowTokenProto.REPORTED_DRAWN;
-import static com.android.server.wm.proto.AppWindowTokenProto.REPORTED_VISIBLE;
-import static com.android.server.wm.proto.AppWindowTokenProto.STARTING_DISPLAYED;
-import static com.android.server.wm.proto.AppWindowTokenProto.STARTING_MOVED;
-import static com.android.server.wm.proto.AppWindowTokenProto.STARTING_WINDOW;
-import static com.android.server.wm.proto.AppWindowTokenProto.THUMBNAIL;
-import static com.android.server.wm.proto.AppWindowTokenProto.WINDOW_TOKEN;
+import static com.android.server.wm.AppWindowTokenProto.ALL_DRAWN;
+import static com.android.server.wm.AppWindowTokenProto.APP_STOPPED;
+import static com.android.server.wm.AppWindowTokenProto.CLIENT_HIDDEN;
+import static com.android.server.wm.AppWindowTokenProto.DEFER_HIDING_CLIENT;
+import static com.android.server.wm.AppWindowTokenProto.FILLS_PARENT;
+import static com.android.server.wm.AppWindowTokenProto.FROZEN_BOUNDS;
+import static com.android.server.wm.AppWindowTokenProto.HIDDEN_REQUESTED;
+import static com.android.server.wm.AppWindowTokenProto.HIDDEN_SET_FROM_TRANSFERRED_STARTING_WINDOW;
+import static com.android.server.wm.AppWindowTokenProto.IS_REALLY_ANIMATING;
+import static com.android.server.wm.AppWindowTokenProto.IS_WAITING_FOR_TRANSITION_START;
+import static com.android.server.wm.AppWindowTokenProto.LAST_ALL_DRAWN;
+import static com.android.server.wm.AppWindowTokenProto.LAST_SURFACE_SHOWING;
+import static com.android.server.wm.AppWindowTokenProto.NAME;
+import static com.android.server.wm.AppWindowTokenProto.NUM_DRAWN_WINDOWS;
+import static com.android.server.wm.AppWindowTokenProto.NUM_INTERESTING_WINDOWS;
+import static com.android.server.wm.AppWindowTokenProto.REMOVED;
+import static com.android.server.wm.AppWindowTokenProto.REPORTED_DRAWN;
+import static com.android.server.wm.AppWindowTokenProto.REPORTED_VISIBLE;
+import static com.android.server.wm.AppWindowTokenProto.STARTING_DISPLAYED;
+import static com.android.server.wm.AppWindowTokenProto.STARTING_MOVED;
+import static com.android.server.wm.AppWindowTokenProto.STARTING_WINDOW;
+import static com.android.server.wm.AppWindowTokenProto.THUMBNAIL;
+import static com.android.server.wm.AppWindowTokenProto.WINDOW_TOKEN;
import android.annotation.CallSuper;
import android.app.Activity;
@@ -251,6 +251,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
private final Point mTmpPoint = new Point();
private final Rect mTmpRect = new Rect();
private RemoteAnimationDefinition mRemoteAnimationDefinition;
+ private AnimatingAppWindowTokenRegistry mAnimatingAppWindowTokenRegistry;
AppWindowToken(WindowManagerService service, IApplicationToken token, boolean voiceInteraction,
DisplayContent dc, long inputDispatchingTimeoutNanos, boolean fullscreen,
@@ -780,6 +781,16 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
task.mStack.mExitingAppTokens.remove(this);
}
}
+ final TaskStack stack = getStack();
+
+ // If we reparent, make sure to remove ourselves from the old animation registry.
+ if (mAnimatingAppWindowTokenRegistry != null) {
+ mAnimatingAppWindowTokenRegistry.notifyFinished(this);
+ }
+ mAnimatingAppWindowTokenRegistry = stack != null
+ ? stack.getAnimatingAppWindowTokenRegistry()
+ : null;
+
mLastParent = task;
}
@@ -1471,11 +1482,13 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
void layoutLetterbox(WindowState winHint) {
final WindowState w = findMainWindow();
- if (w != winHint && winHint != null && w != null) {
+ if (w == null || winHint != null && w != winHint) {
return;
}
- final boolean needsLetterbox = w != null && w.isLetterboxedAppWindow()
- && fillsParent() && w.hasDrawnLw();
+ final boolean surfaceReady = w.hasDrawnLw() // Regular case
+ || w.mWinAnimator.mSurfaceDestroyDeferred // The preserved surface is still ready.
+ || w.isDragResizeChanged(); // Waiting for relayoutWindow to call preserveSurface.
+ final boolean needsLetterbox = w.isLetterboxedAppWindow() && fillsParent() && surfaceReady;
if (needsLetterbox) {
if (mLetterbox == null) {
mLetterbox = new Letterbox(() -> makeChildSurface(null));
@@ -1685,7 +1698,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
stack.getBounds(mTmpRect);
mTmpRect.offsetTo(0, 0);
}
- if (mService.mAppTransition.getRemoteAnimationController() != null) {
+
+ // Delaying animation start isn't compatible with remote animations at all.
+ if (mService.mAppTransition.getRemoteAnimationController() != null
+ && !mSurfaceAnimator.isAnimationStartDelayed()) {
adapter = mService.mAppTransition.getRemoteAnimationController()
.createAnimationAdapter(this, mTmpPoint, mTmpRect);
} else {
@@ -1784,6 +1800,21 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
@Override
+ public boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
+ return mAnimatingAppWindowTokenRegistry != null
+ && mAnimatingAppWindowTokenRegistry.notifyAboutToFinish(
+ this, endDeferFinishCallback);
+ }
+
+ @Override
+ public void onAnimationLeashDestroyed(Transaction t) {
+ super.onAnimationLeashDestroyed(t);
+ if (mAnimatingAppWindowTokenRegistry != null) {
+ mAnimatingAppWindowTokenRegistry.notifyFinished(this);
+ }
+ }
+
+ @Override
protected void setLayer(Transaction t, int layer) {
if (!mSurfaceAnimator.hasLeash()) {
t.setLayer(mSurfaceControl, layer);
@@ -1825,6 +1856,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
final DisplayContent dc = getDisplayContent();
dc.assignStackOrdering(t);
+ if (mAnimatingAppWindowTokenRegistry != null) {
+ mAnimatingAppWindowTokenRegistry.notifyStarting(this);
+ }
}
/**
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java
index 2c2389b12577..627c6297bdd8 100644
--- a/services/core/java/com/android/server/wm/ConfigurationContainer.java
+++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java
@@ -29,9 +29,9 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.WindowConfiguration.activityTypeToString;
import static android.app.WindowConfiguration.windowingModeToString;
-import static com.android.server.wm.proto.ConfigurationContainerProto.FULL_CONFIGURATION;
-import static com.android.server.wm.proto.ConfigurationContainerProto.MERGED_OVERRIDE_CONFIGURATION;
-import static com.android.server.wm.proto.ConfigurationContainerProto.OVERRIDE_CONFIGURATION;
+import static com.android.server.wm.ConfigurationContainerProto.FULL_CONFIGURATION;
+import static com.android.server.wm.ConfigurationContainerProto.MERGED_OVERRIDE_CONFIGURATION;
+import static com.android.server.wm.ConfigurationContainerProto.OVERRIDE_CONFIGURATION;
import android.annotation.CallSuper;
import android.app.WindowConfiguration;
@@ -470,7 +470,7 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> {
/**
* Write to a protocol buffer output stream. Protocol buffer message definition is at
- * {@link com.android.server.wm.proto.ConfigurationContainerProto}.
+ * {@link com.android.server.wm.ConfigurationContainerProto}.
*
* @param proto Stream to write the ConfigurationContainer object to.
* @param fieldId Field Id of the ConfigurationContainer as defined in the parent
diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index 5c62987ec521..d000bb62ff80 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -16,10 +16,10 @@
package com.android.server.wm;
-import static com.android.server.wm.proto.AlphaAnimationSpecProto.DURATION;
-import static com.android.server.wm.proto.AlphaAnimationSpecProto.FROM;
-import static com.android.server.wm.proto.AlphaAnimationSpecProto.TO;
-import static com.android.server.wm.proto.AnimationSpecProto.ALPHA;
+import static com.android.server.wm.AlphaAnimationSpecProto.DURATION;
+import static com.android.server.wm.AlphaAnimationSpecProto.FROM;
+import static com.android.server.wm.AlphaAnimationSpecProto.TO;
+import static com.android.server.wm.AnimationSpecProto.ALPHA;
import android.graphics.Rect;
import android.util.proto.ProtoOutputStream;
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c35c05dc7212..3e47ea641123 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -101,19 +101,19 @@ import static com.android.server.wm.WindowState.RESIZE_HANDLE_WIDTH_IN_DP;
import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING;
import static com.android.server.wm.WindowStateAnimator.READY_TO_SHOW;
import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE;
-import static com.android.server.wm.proto.DisplayProto.ABOVE_APP_WINDOWS;
-import static com.android.server.wm.proto.DisplayProto.BELOW_APP_WINDOWS;
-import static com.android.server.wm.proto.DisplayProto.DISPLAY_FRAMES;
-import static com.android.server.wm.proto.DisplayProto.DISPLAY_INFO;
-import static com.android.server.wm.proto.DisplayProto.DOCKED_STACK_DIVIDER_CONTROLLER;
-import static com.android.server.wm.proto.DisplayProto.DPI;
-import static com.android.server.wm.proto.DisplayProto.ID;
-import static com.android.server.wm.proto.DisplayProto.IME_WINDOWS;
-import static com.android.server.wm.proto.DisplayProto.PINNED_STACK_CONTROLLER;
-import static com.android.server.wm.proto.DisplayProto.ROTATION;
-import static com.android.server.wm.proto.DisplayProto.SCREEN_ROTATION_ANIMATION;
-import static com.android.server.wm.proto.DisplayProto.STACKS;
-import static com.android.server.wm.proto.DisplayProto.WINDOW_CONTAINER;
+import static com.android.server.wm.DisplayProto.ABOVE_APP_WINDOWS;
+import static com.android.server.wm.DisplayProto.BELOW_APP_WINDOWS;
+import static com.android.server.wm.DisplayProto.DISPLAY_FRAMES;
+import static com.android.server.wm.DisplayProto.DISPLAY_INFO;
+import static com.android.server.wm.DisplayProto.DOCKED_STACK_DIVIDER_CONTROLLER;
+import static com.android.server.wm.DisplayProto.DPI;
+import static com.android.server.wm.DisplayProto.ID;
+import static com.android.server.wm.DisplayProto.IME_WINDOWS;
+import static com.android.server.wm.DisplayProto.PINNED_STACK_CONTROLLER;
+import static com.android.server.wm.DisplayProto.ROTATION;
+import static com.android.server.wm.DisplayProto.SCREEN_ROTATION_ANIMATION;
+import static com.android.server.wm.DisplayProto.STACKS;
+import static com.android.server.wm.DisplayProto.WINDOW_CONTAINER;
import android.annotation.CallSuper;
import android.annotation.NonNull;
@@ -305,6 +305,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
int pendingLayoutChanges;
// TODO(multi-display): remove some of the usages.
boolean isDefaultDisplay;
+ /**
+ * Flag indicating whether WindowManager should override info for this display in
+ * DisplayManager.
+ */
+ boolean mShouldOverrideDisplayConfiguration = true;
/** Window tokens that are in the process of exiting, but still on screen for animations. */
final ArrayList<WindowToken> mExitingTokens = new ArrayList<>();
@@ -1177,8 +1182,14 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
mDisplayInfo.flags &= ~Display.FLAG_SCALING_DISABLED;
}
+ // We usually set the override info in DisplayManager so that we get consistent display
+ // metrics values when displays are changing and don't send out new values until WM is aware
+ // of them. However, we don't do this for displays that serve as containers for ActivityView
+ // because we don't want letter-/pillar-boxing during resize.
+ final DisplayInfo overrideDisplayInfo = mShouldOverrideDisplayConfiguration
+ ? mDisplayInfo : null;
mService.mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(mDisplayId,
- mDisplayInfo);
+ overrideDisplayInfo);
mBaseDisplayRect.set(0, 0, dw, dh);
@@ -3796,9 +3807,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
// we use relative layering of the IME targets child windows, and place the
// IME in the non-app layer (see {@link AboveAppWindowContainers#assignChildLayers}).
//
+ // In the case the IME target is animating, the animation Z order may be different
+ // than the WindowContainer Z order, so it's difficult to be sure we have the correct
+ // IME target. In this case we just layer the IME over all transitions by placing it in the
+ // above applications layer.
+ //
// In the case where we have no IME target we assign it where it's base layer would
// place it in the AboveAppWindowContainers.
- if (imeTarget != null && !imeTarget.inSplitScreenWindowingMode()
+ if (imeTarget != null && !(imeTarget.inSplitScreenWindowingMode()
+ || imeTarget.mToken.isAppAnimating())
&& (imeTarget.getSurfaceControl() != null)) {
mImeWindowsContainers.assignRelativeLayer(t, imeTarget.getSurfaceControl(),
// TODO: We need to use an extra level on the app surface to ensure
diff --git a/services/core/java/com/android/server/wm/DisplayFrames.java b/services/core/java/com/android/server/wm/DisplayFrames.java
index 57693ac2b463..dc6b49127f7b 100644
--- a/services/core/java/com/android/server/wm/DisplayFrames.java
+++ b/services/core/java/com/android/server/wm/DisplayFrames.java
@@ -19,7 +19,7 @@ package com.android.server.wm;
import static android.view.Surface.ROTATION_180;
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
-import static com.android.server.wm.proto.DisplayFramesProto.STABLE_BOUNDS;
+import static com.android.server.wm.DisplayFramesProto.STABLE_BOUNDS;
import android.annotation.NonNull;
import android.graphics.Rect;
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index b99e85fed46b..5e2bb10fe629 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -34,7 +34,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.H.NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED;
import static com.android.server.wm.WindowManagerService.LAYER_OFFSET_DIM;
-import static com.android.server.wm.proto.DockedStackDividerControllerProto.MINIMIZED_DOCK;
+import static com.android.server.wm.DockedStackDividerControllerProto.MINIMIZED_DOCK;
import android.content.Context;
import android.content.res.Configuration;
diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java
index 3f1fde96d7b7..529aacc0f91d 100644
--- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java
+++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java
@@ -16,8 +16,8 @@
package com.android.server.wm;
-import static com.android.server.wm.proto.AnimationAdapterProto.LOCAL;
-import static com.android.server.wm.proto.LocalAnimationAdapterProto.ANIMATION_SPEC;
+import static com.android.server.wm.AnimationAdapterProto.LOCAL;
+import static com.android.server.wm.LocalAnimationAdapterProto.ANIMATION_SPEC;
import android.os.SystemClock;
import android.util.proto.ProtoOutputStream;
diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java
index 2293fb2bea4e..5f1916d4e523 100644
--- a/services/core/java/com/android/server/wm/PinnedStackController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackController.java
@@ -22,8 +22,8 @@ import static android.util.TypedValue.COMPLEX_UNIT_DIP;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.proto.PinnedStackControllerProto.DEFAULT_BOUNDS;
-import static com.android.server.wm.proto.PinnedStackControllerProto.MOVEMENT_BOUNDS;
+import static com.android.server.wm.PinnedStackControllerProto.DEFAULT_BOUNDS;
+import static com.android.server.wm.PinnedStackControllerProto.MOVEMENT_BOUNDS;
import android.app.RemoteAction;
import android.content.pm.ParceledListSlice;
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 3e72a713272a..19d66919bb7f 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -26,8 +26,8 @@ import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_W
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING;
-import static com.android.server.wm.proto.RemoteAnimationAdapterWrapperProto.TARGET;
-import static com.android.server.wm.proto.AnimationAdapterProto.REMOTE;
+import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
+import static com.android.server.wm.AnimationAdapterProto.REMOTE;
import android.app.ActivityManager.TaskSnapshot;
import android.app.WindowConfiguration;
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index d645110b6fd5..c5900677e41e 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -19,8 +19,8 @@ package com.android.server.wm;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.proto.AnimationAdapterProto.REMOTE;
-import static com.android.server.wm.proto.RemoteAnimationAdapterWrapperProto.TARGET;
+import static com.android.server.wm.AnimationAdapterProto.REMOTE;
+import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
import android.graphics.Point;
import android.graphics.Rect;
@@ -99,6 +99,10 @@ class RemoteAnimationController {
mFinishedCallback = new FinishedCallback(this);
final RemoteAnimationTarget[] animations = createAnimations();
+ if (animations.length == 0) {
+ onAnimationFinished();
+ return;
+ }
mService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
try {
mRemoteAnimationAdapter.getRunner().onAnimationStart(animations,
@@ -132,6 +136,8 @@ class RemoteAnimationController {
mPendingAnimations.get(i).createRemoteAppAnimation();
if (target != null) {
targets.add(target);
+ } else {
+ mPendingAnimations.remove(i);
}
}
return targets.toArray(new RemoteAnimationTarget[targets.size()]);
@@ -225,10 +231,8 @@ class RemoteAnimationController {
RemoteAnimationTarget createRemoteAppAnimation() {
final Task task = mAppWindowToken.getTask();
final WindowState mainWindow = mAppWindowToken.findMainWindow();
- if (task == null) {
- return null;
- }
- if (mainWindow == null) {
+ if (task == null || mainWindow == null || mCapturedFinishCallback == null
+ || mCapturedLeash == null) {
return null;
}
mTarget = new RemoteAnimationTarget(task.mTaskId, getMode(),
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 32ae52375fd5..52d81777fd52 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -84,9 +84,9 @@ import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_C
import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION;
import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_ACTION_PENDING;
import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE;
-import static com.android.server.wm.proto.RootWindowContainerProto.DISPLAYS;
-import static com.android.server.wm.proto.RootWindowContainerProto.WINDOWS;
-import static com.android.server.wm.proto.RootWindowContainerProto.WINDOW_CONTAINER;
+import static com.android.server.wm.RootWindowContainerProto.DISPLAYS;
+import static com.android.server.wm.RootWindowContainerProto.WINDOWS;
+import static com.android.server.wm.RootWindowContainerProto.WINDOW_CONTAINER;
/** Root {@link WindowContainer} for the device. */
class RootWindowContainer extends WindowContainer<DisplayContent> {
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index 235f63e6fd7f..fa8a5c66aeea 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -23,8 +23,8 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER;
import static com.android.server.wm.WindowStateAnimator.WINDOW_FREEZE_LAYER;
-import static com.android.server.wm.proto.ScreenRotationAnimationProto.ANIMATION_RUNNING;
-import static com.android.server.wm.proto.ScreenRotationAnimationProto.STARTED;
+import static com.android.server.wm.ScreenRotationAnimationProto.ANIMATION_RUNNING;
+import static com.android.server.wm.ScreenRotationAnimationProto.STARTED;
import android.content.Context;
import android.graphics.Matrix;
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index c06caaf9e900..ba3d091f4a08 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -19,9 +19,9 @@ package com.android.server.wm;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.proto.SurfaceAnimatorProto.ANIMATION_ADAPTER;
-import static com.android.server.wm.proto.SurfaceAnimatorProto.ANIMATION_START_DELAYED;
-import static com.android.server.wm.proto.SurfaceAnimatorProto.LEASH;
+import static com.android.server.wm.SurfaceAnimatorProto.ANIMATION_ADAPTER;
+import static com.android.server.wm.SurfaceAnimatorProto.ANIMATION_START_DELAYED;
+import static com.android.server.wm.SurfaceAnimatorProto.LEASH;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -81,9 +81,14 @@ class SurfaceAnimator {
if (anim != mAnimation) {
return;
}
- reset(mAnimatable.getPendingTransaction(), true /* destroyLeash */);
- if (animationFinishedCallback != null) {
- animationFinishedCallback.run();
+ final Runnable resetAndInvokeFinish = () -> {
+ reset(mAnimatable.getPendingTransaction(), true /* destroyLeash */);
+ if (animationFinishedCallback != null) {
+ animationFinishedCallback.run();
+ }
+ };
+ if (!mAnimatable.shouldDeferAnimationFinish(resetAndInvokeFinish)) {
+ resetAndInvokeFinish.run();
}
}
};
@@ -229,6 +234,10 @@ class SurfaceAnimator {
mService.mAnimationTransferMap.put(mAnimation, this);
}
+ boolean isAnimationStartDelayed() {
+ return mAnimationStartDelayed;
+ }
+
/**
* Cancels the animation, and resets the leash.
*
@@ -305,7 +314,7 @@ class SurfaceAnimator {
/**
* Write to a protocol buffer output stream. Protocol buffer message definition is at {@link
- * com.android.server.wm.proto.SurfaceAnimatorProto}.
+ * com.android.server.wm.SurfaceAnimatorProto}.
*
* @param proto Stream to write the SurfaceAnimator object to.
* @param fieldId Field Id of the SurfaceAnimator as defined in the parent message.
@@ -407,5 +416,17 @@ class SurfaceAnimator {
* @return The height of the surface to be animated.
*/
int getSurfaceHeight();
+
+ /**
+ * Gets called when the animation is about to finish and gives the client the opportunity to
+ * defer finishing the animation, i.e. it keeps the leash around until the client calls
+ * {@link #cancelAnimation}.
+ *
+ * @param endDeferFinishCallback The callback to call when defer finishing should be ended.
+ * @return Whether the client would like to defer the animation finish.
+ */
+ default boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
+ return false;
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index a403e6f2a212..e4722f956f1f 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -26,13 +26,13 @@ import static com.android.server.EventLogTags.WM_TASK_REMOVED;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.proto.TaskProto.APP_WINDOW_TOKENS;
-import static com.android.server.wm.proto.TaskProto.BOUNDS;
-import static com.android.server.wm.proto.TaskProto.DEFER_REMOVAL;
-import static com.android.server.wm.proto.TaskProto.FILLS_PARENT;
-import static com.android.server.wm.proto.TaskProto.ID;
-import static com.android.server.wm.proto.TaskProto.TEMP_INSET_BOUNDS;
-import static com.android.server.wm.proto.TaskProto.WINDOW_CONTAINER;
+import static com.android.server.wm.TaskProto.APP_WINDOW_TOKENS;
+import static com.android.server.wm.TaskProto.BOUNDS;
+import static com.android.server.wm.TaskProto.DEFER_REMOVAL;
+import static com.android.server.wm.TaskProto.FILLS_PARENT;
+import static com.android.server.wm.TaskProto.ID;
+import static com.android.server.wm.TaskProto.TEMP_INSET_BOUNDS;
+import static com.android.server.wm.TaskProto.WINDOW_CONTAINER;
import android.annotation.CallSuper;
import android.app.ActivityManager.TaskDescription;
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index b5d00a75d7e6..900e2df1258d 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -35,18 +35,18 @@ import static android.view.WindowManager.DOCKED_TOP;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.proto.StackProto.ADJUSTED_BOUNDS;
-import static com.android.server.wm.proto.StackProto.ADJUSTED_FOR_IME;
-import static com.android.server.wm.proto.StackProto.ADJUST_DIVIDER_AMOUNT;
-import static com.android.server.wm.proto.StackProto.ADJUST_IME_AMOUNT;
-import static com.android.server.wm.proto.StackProto.ANIMATION_BACKGROUND_SURFACE_IS_DIMMING;
-import static com.android.server.wm.proto.StackProto.BOUNDS;
-import static com.android.server.wm.proto.StackProto.DEFER_REMOVAL;
-import static com.android.server.wm.proto.StackProto.FILLS_PARENT;
-import static com.android.server.wm.proto.StackProto.ID;
-import static com.android.server.wm.proto.StackProto.MINIMIZE_AMOUNT;
-import static com.android.server.wm.proto.StackProto.TASKS;
-import static com.android.server.wm.proto.StackProto.WINDOW_CONTAINER;
+import static com.android.server.wm.StackProto.ADJUSTED_BOUNDS;
+import static com.android.server.wm.StackProto.ADJUSTED_FOR_IME;
+import static com.android.server.wm.StackProto.ADJUST_DIVIDER_AMOUNT;
+import static com.android.server.wm.StackProto.ADJUST_IME_AMOUNT;
+import static com.android.server.wm.StackProto.ANIMATION_BACKGROUND_SURFACE_IS_DIMMING;
+import static com.android.server.wm.StackProto.BOUNDS;
+import static com.android.server.wm.StackProto.DEFER_REMOVAL;
+import static com.android.server.wm.StackProto.FILLS_PARENT;
+import static com.android.server.wm.StackProto.ID;
+import static com.android.server.wm.StackProto.MINIMIZE_AMOUNT;
+import static com.android.server.wm.StackProto.TASKS;
+import static com.android.server.wm.StackProto.WINDOW_CONTAINER;
import android.annotation.CallSuper;
import android.content.res.Configuration;
@@ -155,6 +155,9 @@ public class TaskStack extends WindowContainer<Task> implements
final Rect mTmpDimBoundsRect = new Rect();
private final Point mLastSurfaceSize = new Point();
+ private final AnimatingAppWindowTokenRegistry mAnimatingAppWindowTokenRegistry =
+ new AnimatingAppWindowTokenRegistry();
+
TaskStack(WindowManagerService service, int stackId, StackWindowController controller) {
super(service);
mStackId = stackId;
@@ -1782,4 +1785,8 @@ public class TaskStack extends WindowContainer<Task> implements
outPos.x -= outset;
outPos.y -= outset;
}
+
+ AnimatingAppWindowTokenRegistry getAnimatingAppWindowTokenRegistry() {
+ return mAnimatingAppWindowTokenRegistry;
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
index a41eba8205f7..7b7cb30ac64d 100644
--- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java
+++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
@@ -19,8 +19,8 @@ package com.android.server.wm;
import static com.android.server.wm.AnimationAdapter.STATUS_BAR_TRANSITION_DURATION;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE;
-import static com.android.server.wm.proto.AnimationSpecProto.WINDOW;
-import static com.android.server.wm.proto.WindowAnimationSpecProto.ANIMATION;
+import static com.android.server.wm.AnimationSpecProto.WINDOW;
+import static com.android.server.wm.WindowAnimationSpecProto.ANIMATION;
import android.graphics.Point;
import android.graphics.Rect;
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 5ae4dc5636f0..28fdaaef7abb 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -23,10 +23,10 @@ import static android.view.SurfaceControl.Transaction;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.proto.WindowContainerProto.CONFIGURATION_CONTAINER;
-import static com.android.server.wm.proto.WindowContainerProto.ORIENTATION;
-import static com.android.server.wm.proto.WindowContainerProto.SURFACE_ANIMATOR;
-import static com.android.server.wm.proto.WindowContainerProto.VISIBLE;
+import static com.android.server.wm.WindowContainerProto.CONFIGURATION_CONTAINER;
+import static com.android.server.wm.WindowContainerProto.ORIENTATION;
+import static com.android.server.wm.WindowContainerProto.SURFACE_ANIMATOR;
+import static com.android.server.wm.WindowContainerProto.VISIBLE;
import android.annotation.CallSuper;
import android.content.res.Configuration;
@@ -285,7 +285,14 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
if (mSurfaceControl != null) {
- getPendingTransaction().destroy(mSurfaceControl);
+ mPendingTransaction.destroy(mSurfaceControl);
+
+ // Merge to parent transaction to ensure the transactions on this WindowContainer are
+ // applied in native even if WindowContainer is removed.
+ if (mParent != null) {
+ mParent.getPendingTransaction().merge(mPendingTransaction);
+ }
+
mSurfaceControl = null;
scheduleAnimation();
}
@@ -980,7 +987,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
/**
* Write to a protocol buffer output stream. Protocol buffer message definition is at
- * {@link com.android.server.wm.proto.WindowContainerProto}.
+ * {@link com.android.server.wm.WindowContainerProto}.
*
* @param proto Stream to write the WindowContainer object to.
* @param fieldId Field Id of the WindowContainer as defined in the parent message.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 9f8de58b16cf..56b314f18e79 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -48,6 +48,7 @@ import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
@@ -97,15 +98,15 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_VERBOSE_TRANSA
import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.proto.WindowManagerServiceDumpProto.APP_TRANSITION;
-import static com.android.server.wm.proto.WindowManagerServiceDumpProto.DISPLAY_FROZEN;
-import static com.android.server.wm.proto.WindowManagerServiceDumpProto.FOCUSED_APP;
-import static com.android.server.wm.proto.WindowManagerServiceDumpProto.FOCUSED_WINDOW;
-import static com.android.server.wm.proto.WindowManagerServiceDumpProto.INPUT_METHOD_WINDOW;
-import static com.android.server.wm.proto.WindowManagerServiceDumpProto.LAST_ORIENTATION;
-import static com.android.server.wm.proto.WindowManagerServiceDumpProto.POLICY;
-import static com.android.server.wm.proto.WindowManagerServiceDumpProto.ROOT_WINDOW_CONTAINER;
-import static com.android.server.wm.proto.WindowManagerServiceDumpProto.ROTATION;
+import static com.android.server.wm.WindowManagerServiceDumpProto.APP_TRANSITION;
+import static com.android.server.wm.WindowManagerServiceDumpProto.DISPLAY_FROZEN;
+import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_APP;
+import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_WINDOW;
+import static com.android.server.wm.WindowManagerServiceDumpProto.INPUT_METHOD_WINDOW;
+import static com.android.server.wm.WindowManagerServiceDumpProto.LAST_ORIENTATION;
+import static com.android.server.wm.WindowManagerServiceDumpProto.POLICY;
+import static com.android.server.wm.WindowManagerServiceDumpProto.ROOT_WINDOW_CONTAINER;
+import static com.android.server.wm.WindowManagerServiceDumpProto.ROTATION;
import android.Manifest;
import android.Manifest.permission;
@@ -1117,17 +1118,7 @@ public class WindowManagerService extends IWindowManager.Stub
throw new IllegalStateException("Display has not been initialialized");
}
- DisplayContent displayContent = mRoot.getDisplayContent(displayId);
-
- // Adding a window is an exception where the WindowManagerService can create the
- // display instead of waiting for the ActivityManagerService to drive creation.
- if (displayContent == null) {
- final Display display = mDisplayManager.getDisplay(displayId);
-
- if (display != null) {
- displayContent = mRoot.createDisplayContent(display, null /* controller */);
- }
- }
+ final DisplayContent displayContent = getDisplayContentOrCreate(displayId);
if (displayContent == null) {
Slog.w(TAG_WM, "Attempted to add window to a display that does not exist: "
@@ -1224,8 +1215,10 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
final IBinder binder = attrs.token != null ? attrs.token : client.asBinder();
+ final boolean isRoundedCornerOverlay =
+ (attrs.privateFlags & PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY) != 0;
token = new WindowToken(this, binder, type, false, displayContent,
- session.mCanAddInternalSystemWindow);
+ session.mCanAddInternalSystemWindow, isRoundedCornerOverlay);
} else if (rootType >= FIRST_APPLICATION_WINDOW && rootType <= LAST_APPLICATION_WINDOW) {
atoken = token.asAppWindowToken();
if (atoken == null) {
@@ -1493,6 +1486,32 @@ public class WindowManagerService extends IWindowManager.Stub
return res;
}
+ /**
+ * Get existing {@link DisplayContent} or create a new one if the display is registered in
+ * DisplayManager.
+ *
+ * NOTE: This should only be used in cases when there is a chance that a {@link DisplayContent}
+ * that corresponds to a display just added to DisplayManager has not yet been created. This
+ * usually means that the call of this method was initiated from outside of Activity or Window
+ * Manager. In most cases the regular getter should be used.
+ * @see RootWindowContainer#getDisplayContent(int)
+ */
+ private DisplayContent getDisplayContentOrCreate(int displayId) {
+ DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+
+ // Create an instance if possible instead of waiting for the ActivityManagerService to drive
+ // the creation.
+ if (displayContent == null) {
+ final Display display = mDisplayManager.getDisplay(displayId);
+
+ if (display != null) {
+ displayContent = mRoot.createDisplayContent(display, null /* controller */);
+ }
+ }
+
+ return displayContent;
+ }
+
private boolean doesAddToastWindowRequireToken(String packageName, int callingUid,
WindowState attachedWindow) {
// Try using the target SDK of the root window
@@ -6163,7 +6182,7 @@ public class WindowManagerService extends IWindowManager.Stub
/**
* Write to a protocol buffer output stream. Protocol buffer message definition is at
- * {@link com.android.server.wm.proto.WindowManagerServiceDumpProto}.
+ * {@link com.android.server.wm.WindowManagerServiceDumpProto}.
*
* @param proto Stream to write the WindowContainer object to.
* @param trim If true, reduce the amount of data written.
@@ -6987,6 +7006,24 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
+ public void dontOverrideDisplayInfo(int displayId) {
+ synchronized (mWindowMap) {
+ final DisplayContent dc = getDisplayContentOrCreate(displayId);
+ if (dc == null) {
+ throw new IllegalArgumentException(
+ "Trying to register a non existent display.");
+ }
+ // We usually set the override info in DisplayManager so that we get consistent
+ // values when displays are changing. However, we don't do this for displays that
+ // serve as containers for ActivityViews because we don't want letter-/pillar-boxing
+ // during resize.
+ dc.mShouldOverrideDisplayConfiguration = false;
+ mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(displayId,
+ null /* info */);
+ }
+ }
+
+ @Override
public void registerShortcutKey(long shortcutCode, IShortcutService shortcutKeyReceiver)
throws RemoteException {
if (!checkCallingPermission(REGISTER_WINDOW_MANAGER_LISTENERS, "registerShortcutKey")) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index c10051153ac3..993556faee7d 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -107,50 +107,50 @@ import static com.android.server.wm.WindowStateAnimator.COMMIT_DRAW_PENDING;
import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING;
import static com.android.server.wm.WindowStateAnimator.HAS_DRAWN;
import static com.android.server.wm.WindowStateAnimator.READY_TO_SHOW;
-import static com.android.server.wm.proto.IdentifierProto.HASH_CODE;
-import static com.android.server.wm.proto.IdentifierProto.TITLE;
-import static com.android.server.wm.proto.IdentifierProto.USER_ID;
-import static com.android.server.wm.proto.AnimationSpecProto.MOVE;
-import static com.android.server.wm.proto.MoveAnimationSpecProto.DURATION;
-import static com.android.server.wm.proto.MoveAnimationSpecProto.FROM;
-import static com.android.server.wm.proto.MoveAnimationSpecProto.TO;
-import static com.android.server.wm.proto.WindowStateProto.ANIMATING_EXIT;
-import static com.android.server.wm.proto.WindowStateProto.ANIMATOR;
-import static com.android.server.wm.proto.WindowStateProto.ATTRIBUTES;
-import static com.android.server.wm.proto.WindowStateProto.CHILD_WINDOWS;
-import static com.android.server.wm.proto.WindowStateProto.CONTAINING_FRAME;
-import static com.android.server.wm.proto.WindowStateProto.CONTENT_FRAME;
-import static com.android.server.wm.proto.WindowStateProto.CONTENT_INSETS;
-import static com.android.server.wm.proto.WindowStateProto.CUTOUT;
-import static com.android.server.wm.proto.WindowStateProto.DECOR_FRAME;
-import static com.android.server.wm.proto.WindowStateProto.DESTROYING;
-import static com.android.server.wm.proto.WindowStateProto.DISPLAY_FRAME;
-import static com.android.server.wm.proto.WindowStateProto.DISPLAY_ID;
-import static com.android.server.wm.proto.WindowStateProto.FRAME;
-import static com.android.server.wm.proto.WindowStateProto.GIVEN_CONTENT_INSETS;
-import static com.android.server.wm.proto.WindowStateProto.HAS_SURFACE;
-import static com.android.server.wm.proto.WindowStateProto.IDENTIFIER;
-import static com.android.server.wm.proto.WindowStateProto.IS_ON_SCREEN;
-import static com.android.server.wm.proto.WindowStateProto.IS_READY_FOR_DISPLAY;
-import static com.android.server.wm.proto.WindowStateProto.IS_VISIBLE;
-import static com.android.server.wm.proto.WindowStateProto.OUTSETS;
-import static com.android.server.wm.proto.WindowStateProto.OUTSET_FRAME;
-import static com.android.server.wm.proto.WindowStateProto.OVERSCAN_FRAME;
-import static com.android.server.wm.proto.WindowStateProto.OVERSCAN_INSETS;
-import static com.android.server.wm.proto.WindowStateProto.PARENT_FRAME;
-import static com.android.server.wm.proto.WindowStateProto.REMOVED;
-import static com.android.server.wm.proto.WindowStateProto.REMOVE_ON_EXIT;
-import static com.android.server.wm.proto.WindowStateProto.REQUESTED_HEIGHT;
-import static com.android.server.wm.proto.WindowStateProto.REQUESTED_WIDTH;
-import static com.android.server.wm.proto.WindowStateProto.STABLE_INSETS;
-import static com.android.server.wm.proto.WindowStateProto.STACK_ID;
-import static com.android.server.wm.proto.WindowStateProto.SURFACE_INSETS;
-import static com.android.server.wm.proto.WindowStateProto.SURFACE_POSITION;
-import static com.android.server.wm.proto.WindowStateProto.SYSTEM_UI_VISIBILITY;
-import static com.android.server.wm.proto.WindowStateProto.VIEW_VISIBILITY;
-import static com.android.server.wm.proto.WindowStateProto.VISIBLE_FRAME;
-import static com.android.server.wm.proto.WindowStateProto.VISIBLE_INSETS;
-import static com.android.server.wm.proto.WindowStateProto.WINDOW_CONTAINER;
+import static com.android.server.wm.IdentifierProto.HASH_CODE;
+import static com.android.server.wm.IdentifierProto.TITLE;
+import static com.android.server.wm.IdentifierProto.USER_ID;
+import static com.android.server.wm.AnimationSpecProto.MOVE;
+import static com.android.server.wm.MoveAnimationSpecProto.DURATION;
+import static com.android.server.wm.MoveAnimationSpecProto.FROM;
+import static com.android.server.wm.MoveAnimationSpecProto.TO;
+import static com.android.server.wm.WindowStateProto.ANIMATING_EXIT;
+import static com.android.server.wm.WindowStateProto.ANIMATOR;
+import static com.android.server.wm.WindowStateProto.ATTRIBUTES;
+import static com.android.server.wm.WindowStateProto.CHILD_WINDOWS;
+import static com.android.server.wm.WindowStateProto.CONTAINING_FRAME;
+import static com.android.server.wm.WindowStateProto.CONTENT_FRAME;
+import static com.android.server.wm.WindowStateProto.CONTENT_INSETS;
+import static com.android.server.wm.WindowStateProto.CUTOUT;
+import static com.android.server.wm.WindowStateProto.DECOR_FRAME;
+import static com.android.server.wm.WindowStateProto.DESTROYING;
+import static com.android.server.wm.WindowStateProto.DISPLAY_FRAME;
+import static com.android.server.wm.WindowStateProto.DISPLAY_ID;
+import static com.android.server.wm.WindowStateProto.FRAME;
+import static com.android.server.wm.WindowStateProto.GIVEN_CONTENT_INSETS;
+import static com.android.server.wm.WindowStateProto.HAS_SURFACE;
+import static com.android.server.wm.WindowStateProto.IDENTIFIER;
+import static com.android.server.wm.WindowStateProto.IS_ON_SCREEN;
+import static com.android.server.wm.WindowStateProto.IS_READY_FOR_DISPLAY;
+import static com.android.server.wm.WindowStateProto.IS_VISIBLE;
+import static com.android.server.wm.WindowStateProto.OUTSETS;
+import static com.android.server.wm.WindowStateProto.OUTSET_FRAME;
+import static com.android.server.wm.WindowStateProto.OVERSCAN_FRAME;
+import static com.android.server.wm.WindowStateProto.OVERSCAN_INSETS;
+import static com.android.server.wm.WindowStateProto.PARENT_FRAME;
+import static com.android.server.wm.WindowStateProto.REMOVED;
+import static com.android.server.wm.WindowStateProto.REMOVE_ON_EXIT;
+import static com.android.server.wm.WindowStateProto.REQUESTED_HEIGHT;
+import static com.android.server.wm.WindowStateProto.REQUESTED_WIDTH;
+import static com.android.server.wm.WindowStateProto.STABLE_INSETS;
+import static com.android.server.wm.WindowStateProto.STACK_ID;
+import static com.android.server.wm.WindowStateProto.SURFACE_INSETS;
+import static com.android.server.wm.WindowStateProto.SURFACE_POSITION;
+import static com.android.server.wm.WindowStateProto.SYSTEM_UI_VISIBILITY;
+import static com.android.server.wm.WindowStateProto.VIEW_VISIBILITY;
+import static com.android.server.wm.WindowStateProto.VISIBLE_FRAME;
+import static com.android.server.wm.WindowStateProto.VISIBLE_INSETS;
+import static com.android.server.wm.WindowStateProto.WINDOW_CONTAINER;
import android.annotation.CallSuper;
import android.app.AppOpsManager;
@@ -859,10 +859,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// If the task has temp inset bounds set, we have to make sure all its windows uses
// the temp inset frame. Otherwise different display frames get applied to the main
// window and the child window, making them misaligned.
- if (inFullscreenContainer || isLetterboxedAppWindow()) {
- mInsetFrame.setEmpty();
- } else if (task != null && isInMultiWindowMode()) {
+ // Otherwise we need to clear the inset frame, to avoid using a stale frame after leaving
+ // multi window mode.
+ if (task != null && isInMultiWindowMode()) {
task.getTempInsetBounds(mInsetFrame);
+ } else {
+ mInsetFrame.setEmpty();
}
// Denotes the actual frame used to calculate the insets and to perform the layout. When
@@ -1032,15 +1034,21 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
if (mAttrs.type == TYPE_DOCK_DIVIDER) {
// For the docked divider, we calculate the stable insets like a full-screen window
// so it can use it to calculate the snap positions.
- mStableInsets.set(Math.max(mStableFrame.left - mDisplayFrame.left, 0),
- Math.max(mStableFrame.top - mDisplayFrame.top, 0),
- Math.max(mDisplayFrame.right - mStableFrame.right, 0),
- Math.max(mDisplayFrame.bottom - mStableFrame.bottom, 0));
+ final WmDisplayCutout c = displayCutout.calculateRelativeTo(mDisplayFrame);
+ mTmpRect.set(mDisplayFrame);
+ mTmpRect.inset(c.getDisplayCutout().getSafeInsets());
+ mTmpRect.intersectUnchecked(mStableFrame);
+
+ mStableInsets.set(Math.max(mTmpRect.left - mDisplayFrame.left, 0),
+ Math.max(mTmpRect.top - mDisplayFrame.top, 0),
+ Math.max(mDisplayFrame.right - mTmpRect.right, 0),
+ Math.max(mDisplayFrame.bottom - mTmpRect.bottom, 0));
// The divider doesn't care about insets in any case, so set it to empty so we don't
// trigger a relayout when moving it.
mContentInsets.setEmpty();
mVisibleInsets.setEmpty();
+ displayCutout = WmDisplayCutout.NO_CUTOUT;
} else {
getDisplayContent().getBounds(mTmpRect);
// Override right and/or bottom insets in case if the frame doesn't fit the screen in
@@ -4525,8 +4533,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mAttrs.type == TYPE_NAVIGATION_BAR ||
// It's tempting to wonder: Have we forgotten the rounded corners overlay?
// worry not: it's a fake TYPE_NAVIGATION_BAR_PANEL
- mAttrs.type == TYPE_NAVIGATION_BAR_PANEL ||
- mAttrs.type == TYPE_STATUS_BAR) {
+ mAttrs.type == TYPE_NAVIGATION_BAR_PANEL) {
return false;
}
return true;
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 410eddfeb71b..e92d460f2ec6 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -41,10 +41,10 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER;
import static com.android.server.wm.WindowManagerService.logWithStack;
import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE;
-import static com.android.server.wm.proto.WindowStateAnimatorProto.DRAW_STATE;
-import static com.android.server.wm.proto.WindowStateAnimatorProto.LAST_CLIP_RECT;
-import static com.android.server.wm.proto.WindowStateAnimatorProto.SURFACE;
-import static com.android.server.wm.proto.WindowStateAnimatorProto.SYSTEM_DECOR_RECT;
+import static com.android.server.wm.WindowStateAnimatorProto.DRAW_STATE;
+import static com.android.server.wm.WindowStateAnimatorProto.LAST_CLIP_RECT;
+import static com.android.server.wm.WindowStateAnimatorProto.SURFACE;
+import static com.android.server.wm.WindowStateAnimatorProto.SYSTEM_DECOR_RECT;
import android.content.Context;
import android.graphics.Matrix;
@@ -225,6 +225,11 @@ class WindowStateAnimator {
// case we need to give the client a new Surface if it lays back out to a visible state.
boolean mChildrenDetached = false;
+ // Set to true after the first frame of the Pinned stack animation
+ // and reset after the last to ensure we only reset mForceScaleUntilResize
+ // once per animation.
+ boolean mPipAnimationStarted = false;
+
WindowStateAnimator(final WindowState win) {
final WindowManagerService service = win.mService;
@@ -512,7 +517,7 @@ class WindowStateAnimator {
mDrawState = NO_SURFACE;
return null;
} catch (Exception e) {
- Slog.e(TAG, "Exception creating surface", e);
+ Slog.e(TAG, "Exception creating surface (parent dead?)", e);
mDrawState = NO_SURFACE;
return null;
}
@@ -983,8 +988,13 @@ class WindowStateAnimator {
// As we are in SCALING_MODE_SCALE_TO_WINDOW, SurfaceFlinger will
// then take over the scaling until the new buffer arrives, and things
// will be seamless.
- mForceScaleUntilResize = true;
+ if (mPipAnimationStarted == false) {
+ mForceScaleUntilResize = true;
+ mPipAnimationStarted = true;
+ }
} else {
+ mPipAnimationStarted = false;
+
if (!w.mSeamlesslyRotated) {
mSurfaceController.setPositionInTransaction(mXOffset, mYOffset, recoveringMemory);
}
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index f6c0a54c74ca..66c8cca8f0e0 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -25,8 +25,8 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACT
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.proto.WindowSurfaceControllerProto.LAYER;
-import static com.android.server.wm.proto.WindowSurfaceControllerProto.SHOWN;
+import static com.android.server.wm.WindowSurfaceControllerProto.LAYER;
+import static com.android.server.wm.WindowSurfaceControllerProto.SHOWN;
import android.graphics.Point;
import android.graphics.PointF;
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index 172efdcb22ac..14680d94f63a 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -17,18 +17,19 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
-import static com.android.server.wm.proto.WindowTokenProto.HASH_CODE;
-import static com.android.server.wm.proto.WindowTokenProto.HIDDEN;
-import static com.android.server.wm.proto.WindowTokenProto.PAUSED;
-import static com.android.server.wm.proto.WindowTokenProto.WAITING_TO_SHOW;
-import static com.android.server.wm.proto.WindowTokenProto.WINDOWS;
-import static com.android.server.wm.proto.WindowTokenProto.WINDOW_CONTAINER;
+import static com.android.server.wm.WindowTokenProto.HASH_CODE;
+import static com.android.server.wm.WindowTokenProto.HIDDEN;
+import static com.android.server.wm.WindowTokenProto.PAUSED;
+import static com.android.server.wm.WindowTokenProto.WAITING_TO_SHOW;
+import static com.android.server.wm.WindowTokenProto.WINDOWS;
+import static com.android.server.wm.WindowTokenProto.WINDOW_CONTAINER;
import android.annotation.CallSuper;
import android.os.Debug;
@@ -53,6 +54,9 @@ class WindowToken extends WindowContainer<WindowState> {
// The type of window this token is for, as per WindowManager.LayoutParams.
final int windowType;
+ /** {@code true} if this holds the rounded corner overlay */
+ final boolean mRoundedCornerOverlay;
+
// Set if this token was explicitly added by a client, so should
// persist (not be removed) when all windows are removed.
boolean mPersistOnEmpty;
@@ -105,11 +109,18 @@ class WindowToken extends WindowContainer<WindowState> {
WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty,
DisplayContent dc, boolean ownerCanManageAppTokens) {
+ this(service, _token, type, persistOnEmpty, dc, ownerCanManageAppTokens,
+ false /* roundedCornersOverlay */);
+ }
+
+ WindowToken(WindowManagerService service, IBinder _token, int type, boolean persistOnEmpty,
+ DisplayContent dc, boolean ownerCanManageAppTokens, boolean roundedCornerOverlay) {
super(service);
token = _token;
windowType = type;
mPersistOnEmpty = persistOnEmpty;
mOwnerCanManageAppTokens = ownerCanManageAppTokens;
+ mRoundedCornerOverlay = roundedCornerOverlay;
onDisplayChanged(dc);
}
@@ -259,6 +270,12 @@ class WindowToken extends WindowContainer<WindowState> {
dc.reParentWindowToken(this);
mDisplayContent = dc;
+ // The rounded corner overlay should not be rotated. We ensure that by moving it outside
+ // the windowing layer.
+ if (mRoundedCornerOverlay) {
+ mDisplayContent.reparentToOverlay(mPendingTransaction, mSurfaceControl);
+ }
+
// TODO(b/36740756): One day this should perhaps be hooked
// up with goodToGo, so we don't move a window
// to another display before the window behind
diff --git a/services/core/java/com/android/server/wm/WindowTracing.java b/services/core/java/com/android/server/wm/WindowTracing.java
index a29978154a92..8fa56bb065c6 100644
--- a/services/core/java/com/android/server/wm/WindowTracing.java
+++ b/services/core/java/com/android/server/wm/WindowTracing.java
@@ -17,13 +17,13 @@
package com.android.server.wm;
import static android.os.Build.IS_USER;
-import static com.android.server.wm.proto.WindowManagerTraceFileProto.ENTRY;
-import static com.android.server.wm.proto.WindowManagerTraceFileProto.MAGIC_NUMBER;
-import static com.android.server.wm.proto.WindowManagerTraceFileProto.MAGIC_NUMBER_H;
-import static com.android.server.wm.proto.WindowManagerTraceFileProto.MAGIC_NUMBER_L;
-import static com.android.server.wm.proto.WindowManagerTraceProto.ELAPSED_REALTIME_NANOS;
-import static com.android.server.wm.proto.WindowManagerTraceProto.WHERE;
-import static com.android.server.wm.proto.WindowManagerTraceProto.WINDOW_MANAGER_SERVICE;
+import static com.android.server.wm.WindowManagerTraceFileProto.ENTRY;
+import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER;
+import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_H;
+import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_L;
+import static com.android.server.wm.WindowManagerTraceProto.ELAPSED_REALTIME_NANOS;
+import static com.android.server.wm.WindowManagerTraceProto.WHERE;
+import static com.android.server.wm.WindowManagerTraceProto.WINDOW_MANAGER_SERVICE;
import android.content.Context;
import android.os.ShellCommand;
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index cf42c0cd00ef..dcee15106f8a 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -125,6 +125,9 @@ struct GnssDeathRecipient : virtual public hidl_death_recipient
}
};
+// Must match the value from GnssMeasurement.java
+static const uint32_t ADR_STATE_HALF_CYCLE_REPORTED = (1<<4);
+
sp<GnssDeathRecipient> gnssHalDeathRecipient = nullptr;
sp<IGnss_V1_0> gnssHal = nullptr;
sp<IGnss_V1_1> gnssHal_V1_1 = nullptr;
@@ -807,7 +810,8 @@ void GnssMeasurementCallback::translateGnssMeasurement_V1_0(
SET(PseudorangeRateUncertaintyMetersPerSecond,
measurement->pseudorangeRateUncertaintyMps);
SET(AccumulatedDeltaRangeState,
- (static_cast<int32_t>(measurement->accumulatedDeltaRangeState)));
+ (static_cast<int32_t>(measurement->accumulatedDeltaRangeState) &
+ !ADR_STATE_HALF_CYCLE_REPORTED)); // Half Cycle state not reported from Hardware in V1_0
SET(AccumulatedDeltaRangeMeters, measurement->accumulatedDeltaRangeM);
SET(AccumulatedDeltaRangeUncertaintyMeters,
measurement->accumulatedDeltaRangeUncertaintyM);
@@ -888,9 +892,10 @@ jobjectArray GnssMeasurementCallback::translateGnssMeasurements(JNIEnv* env,
if (measurements_v1_1 != NULL) {
translateGnssMeasurement_V1_0(env, &(measurements_v1_1[i].v1_0), object);
- // Set the V1_1 flag
+ // Set the V1_1 flag, and mark that new field has valid information for Java Layer
SET(AccumulatedDeltaRangeState,
- static_cast<int32_t>(measurements_v1_1[i].accumulatedDeltaRangeState));
+ (static_cast<int32_t>(measurements_v1_1[i].accumulatedDeltaRangeState) |
+ ADR_STATE_HALF_CYCLE_REPORTED));
} else {
translateGnssMeasurement_V1_0(env, &(measurements_v1_0[i]), object);
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 6a9b862743f9..2e07703020e8 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -107,7 +107,9 @@ import android.app.admin.SecurityLog;
import android.app.admin.SecurityLog.SecurityEvent;
import android.app.admin.SystemUpdateInfo;
import android.app.admin.SystemUpdatePolicy;
+import android.app.backup.BackupManager;
import android.app.backup.IBackupManager;
+import android.app.backup.ISelectBackupTransportCallback;
import android.app.trust.TrustManager;
import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver;
@@ -252,6 +254,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
@@ -9249,7 +9252,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
long id = mInjector.binderClearCallingIdentity();
try {
return mIPackageManager.setPackagesSuspendedAsUser(
- packageNames, suspended, callingUserId);
+ packageNames, suspended, null, null, "android", callingUserId);
} catch (RemoteException re) {
// Shouldn't happen.
Slog.e(LOG_TAG, "Failed talking to the package manager", re);
@@ -11997,20 +12000,32 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
@Override
- public void setMandatoryBackupTransport(
- ComponentName admin, ComponentName backupTransportComponent) {
+ public boolean setMandatoryBackupTransport(
+ ComponentName admin,
+ ComponentName backupTransportComponent) {
if (!mHasFeature) {
- return;
+ return false;
}
Preconditions.checkNotNull(admin);
synchronized (this) {
- ActiveAdmin activeAdmin =
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- if (!Objects.equals(backupTransportComponent, activeAdmin.mandatoryBackupTransport)) {
- activeAdmin.mandatoryBackupTransport = backupTransportComponent;
- saveSettingsLocked(UserHandle.USER_SYSTEM);
- }
+ getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
}
+
+ final int callingUid = mInjector.binderGetCallingUid();
+ final AtomicBoolean success = new AtomicBoolean(false);
+ final CountDownLatch countDownLatch = new CountDownLatch(1);
+ final ISelectBackupTransportCallback selectBackupTransportCallbackInternal =
+ new ISelectBackupTransportCallback.Stub() {
+ public void onSuccess(String transportName) {
+ saveMandatoryBackupTransport(admin, callingUid, backupTransportComponent);
+ success.set(true);
+ countDownLatch.countDown();
+ }
+
+ public void onFailure(int reason) {
+ countDownLatch.countDown();
+ }
+ };
final long identity = mInjector.binderClearCallingIdentity();
try {
IBackupManager ibm = mInjector.getIBackupManager();
@@ -12018,14 +12033,39 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (!ibm.isBackupServiceActive(UserHandle.USER_SYSTEM)) {
ibm.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
}
- ibm.selectBackupTransportAsync(backupTransportComponent, null);
- ibm.setBackupEnabled(true);
+ ibm.selectBackupTransportAsync(
+ backupTransportComponent, selectBackupTransportCallbackInternal);
+ countDownLatch.await();
+ if (success.get()) {
+ ibm.setBackupEnabled(true);
+ }
+ } else if (backupTransportComponent == null) {
+ saveMandatoryBackupTransport(admin, callingUid, backupTransportComponent);
+ success.set(true);
}
} catch (RemoteException e) {
throw new IllegalStateException("Failed to set mandatory backup transport.", e);
+ } catch (InterruptedException e) {
+ throw new IllegalStateException("Failed to set mandatory backup transport.", e);
} finally {
mInjector.binderRestoreCallingIdentity(identity);
}
+ return success.get();
+ }
+
+ synchronized private void saveMandatoryBackupTransport(
+ ComponentName admin, int callingUid, ComponentName backupTransportComponent) {
+ ActiveAdmin activeAdmin =
+ getActiveAdminWithPolicyForUidLocked(
+ admin,
+ DeviceAdminInfo.USES_POLICY_DEVICE_OWNER,
+ callingUid);
+ if (!Objects.equals(backupTransportComponent,
+ activeAdmin.mandatoryBackupTransport)) {
+ activeAdmin.mandatoryBackupTransport =
+ backupTransportComponent;
+ saveSettingsLocked(UserHandle.USER_SYSTEM);
+ }
}
@Override
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 70abf8054dbb..6f50ee27d134 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -196,6 +196,8 @@ public final class SystemServer {
"com.android.server.search.SearchManagerService$Lifecycle";
private static final String THERMAL_OBSERVER_CLASS =
"com.google.android.clockwork.ThermalObserver";
+ private static final String WEAR_CONFIG_SERVICE_CLASS =
+ "com.google.android.clockwork.WearConfigManagerService";
private static final String WEAR_CONNECTIVITY_SERVICE_CLASS =
"com.android.clockwork.connectivity.WearConnectivityService";
private static final String WEAR_SIDEKICK_SERVICE_CLASS =
@@ -703,6 +705,11 @@ public final class SystemServer {
mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
traceEnd();
}
+
+ // Tracks cpu time spent in binder calls
+ traceBeginAndSlog("StartBinderCallsStatsService");
+ BinderCallsStatsService.start();
+ traceEnd();
}
/**
@@ -1543,6 +1550,10 @@ public final class SystemServer {
}
if (isWatch) {
+ traceBeginAndSlog("StartWearConfigService");
+ mSystemServiceManager.startService(WEAR_CONFIG_SERVICE_CLASS);
+ traceEnd();
+
traceBeginAndSlog("StartWearConnectivityService");
mSystemServiceManager.startService(WEAR_CONNECTIVITY_SERVICE_CLASS);
traceEnd();
diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk
index 0ca0a1a104c8..cdb339ae4b92 100644
--- a/services/tests/servicestests/Android.mk
+++ b/services/tests/servicestests/Android.mk
@@ -36,6 +36,7 @@ LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl
LOCAL_SRC_FILES += aidl/com/android/servicestests/aidl/INetworkStateObserver.aidl \
aidl/com/android/servicestests/aidl/ICmdReceiverService.aidl
LOCAL_SRC_FILES += $(call all-java-files-under, test-apps/JobTestApp/src)
+LOCAL_SRC_FILES += $(call all-java-files-under, test-apps/SuspendTestApp/src)
LOCAL_JAVA_LIBRARIES := \
android.hidl.manager-V1.0-java \
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index 372b8ccbdd7b..ce98d658d329 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -62,6 +62,7 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WATCH_APPOPS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
+ <uses-permission android:name="android.permission.SUSPEND_APPS"/>
<!-- Uses API introduced in O (26) -->
<uses-sdk android:minSdkVersion="1"
diff --git a/services/tests/servicestests/AndroidTest.xml b/services/tests/servicestests/AndroidTest.xml
index 23e5072654e7..082827c23b53 100644
--- a/services/tests/servicestests/AndroidTest.xml
+++ b/services/tests/servicestests/AndroidTest.xml
@@ -15,9 +15,11 @@
-->
<configuration description="Runs Frameworks Services Tests.">
<target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="cleanup-apks" value="true" />
<option name="test-file-name" value="FrameworksServicesTests.apk" />
<option name="test-file-name" value="JobTestApp.apk" />
<option name="test-file-name" value="ConnTestApp.apk" />
+ <option name="test-file-name" value="SuspendTestApp.apk" />
</target_preparer>
<option name="test-suite-tag" value="apct" />
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
index 2378e6d49b88..b452ea506095 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
@@ -22,23 +22,39 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+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 static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.ArgumentMatchers.any;
import android.app.ActivityManager;
import android.app.WaitResult;
import android.content.ComponentName;
+import android.content.res.Configuration;
import android.graphics.Rect;
+import android.hardware.display.DisplayManager;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
+import android.util.SparseIntArray;
import org.junit.runner.RunWith;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -180,4 +196,73 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
assertEquals(deliverToTopWait.who, firstActivity.realActivity);
}
}
+
+ @Test
+ public void testApplySleepTokensLocked() throws Exception {
+ final ActivityDisplay display = mSupervisor.getDefaultDisplay();
+ final KeyguardController keyguard = mSupervisor.getKeyguardController();
+ final ActivityStack stack = mock(ActivityStack.class);
+ display.addChild(stack, 0 /* position */);
+
+ // Make sure we wake and resume in the case the display is turning on and the keyguard is
+ // not showing.
+ verifySleepTokenBehavior(display, keyguard, stack, true /*displaySleeping*/,
+ false /* displayShouldSleep */, true /* isFocusedStack */,
+ false /* keyguardShowing */, true /* expectWakeFromSleep */,
+ true /* expectResumeTopActivity */);
+
+ // Make sure we wake and don't resume when the display is turning on and the keyguard is
+ // showing.
+ verifySleepTokenBehavior(display, keyguard, stack, true /*displaySleeping*/,
+ false /* displayShouldSleep */, true /* isFocusedStack */,
+ true /* keyguardShowing */, true /* expectWakeFromSleep */,
+ false /* expectResumeTopActivity */);
+
+ // Make sure we wake and don't resume when the display is turning on and the keyguard is
+ // not showing as unfocused.
+ verifySleepTokenBehavior(display, keyguard, stack, true /*displaySleeping*/,
+ false /* displayShouldSleep */, false /* isFocusedStack */,
+ false /* keyguardShowing */, true /* expectWakeFromSleep */,
+ false /* expectResumeTopActivity */);
+
+ // Should not do anything if the display state hasn't changed.
+ verifySleepTokenBehavior(display, keyguard, stack, false /*displaySleeping*/,
+ false /* displayShouldSleep */, true /* isFocusedStack */,
+ false /* keyguardShowing */, false /* expectWakeFromSleep */,
+ false /* expectResumeTopActivity */);
+ }
+
+ private void verifySleepTokenBehavior(ActivityDisplay display, KeyguardController keyguard,
+ ActivityStack stack, boolean displaySleeping, boolean displayShouldSleep,
+ boolean isFocusedStack, boolean keyguardShowing, boolean expectWakeFromSleep,
+ boolean expectResumeTopActivity) {
+ reset(stack);
+
+ doReturn(displayShouldSleep).when(display).shouldSleep();
+ doReturn(displaySleeping).when(display).isSleeping();
+ doReturn(keyguardShowing).when(keyguard).isKeyguardShowing(anyInt());
+
+ mSupervisor.mFocusedStack = isFocusedStack ? stack : null;
+ mSupervisor.applySleepTokensLocked(true);
+ verify(stack, times(expectWakeFromSleep ? 1 : 0)).awakeFromSleepingLocked();
+ verify(stack, times(expectResumeTopActivity ? 1 : 0)).resumeTopActivityUncheckedLocked(
+ null /* target */, null /* targetOptions */);
+ }
+
+ @Test
+ public void testTopRunningActivityLockedWithNonExistentDisplay() throws Exception {
+ // Create display that ActivityManagerService does not know about
+ final int unknownDisplayId = 100;
+
+ doAnswer((InvocationOnMock invocationOnMock) -> {
+ final SparseIntArray displayIds = invocationOnMock.<SparseIntArray>getArgument(0);
+ displayIds.put(0, unknownDisplayId);
+ return null;
+ }).when(mSupervisor.mWindowManager).getDisplaysInFocusOrder(any());
+
+ mSupervisor.mFocusedStack = mock(ActivityStack.class);
+
+ // Supervisor should skip over the non-existent display.
+ assertEquals(null, mSupervisor.topRunningActivityLocked());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
index 5906db306f11..8ff3e4587d00 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
@@ -18,13 +18,19 @@ package com.android.server.am;
import static android.app.ActivityManager.START_ABORTED;
import static android.app.ActivityManager.START_CLASS_NOT_FOUND;
+import static android.app.ActivityManager.START_DELIVERED_TO_TOP;
import static android.app.ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
+import static android.app.ActivityManager.START_INTENT_NOT_RESOLVED;
import static android.app.ActivityManager.START_NOT_VOICE_COMPATIBLE;
+import static android.app.ActivityManager.START_PERMISSION_DENIED;
import static android.app.ActivityManager.START_SUCCESS;
import static android.app.ActivityManager.START_SWITCHES_CANCELED;
+import static android.app.ActivityManager.START_TASK_TO_FRONT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import android.app.ActivityOptions;
import android.app.IApplicationThread;
@@ -45,6 +51,7 @@ import android.view.Gravity;
import org.junit.runner.RunWith;
import org.junit.Test;
+import static android.content.Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
import static com.android.server.am.ActivityManagerService.ANIMATE;
import static org.junit.Assert.assertEquals;
@@ -62,9 +69,6 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
-import static android.app.ActivityManager.START_PERMISSION_DENIED;
-import static android.app.ActivityManager.START_INTENT_NOT_RESOLVED;
-
import com.android.internal.os.BatteryStatsImpl;
import com.android.server.am.ActivityStarter.Factory;
import com.android.server.am.LaunchParamsController.LaunchParamsModifier;
@@ -290,7 +294,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
}
}
- private ActivityStarter prepareStarter() {
+ private ActivityStarter prepareStarter(int launchFlags) {
// always allow test to start activity.
doReturn(true).when(mService.mStackSupervisor).checkStartAnyActivityPermission(
any(), any(), any(), anyInt(), anyInt(), anyInt(), any(),
@@ -325,8 +329,20 @@ public class ActivityStarterTests extends ActivityTestsBase {
// ignore requests to create window container.
doNothing().when(task).createWindowContainer(anyBoolean(), anyBoolean());
+
+ final Intent intent = new Intent();
+ intent.addFlags(launchFlags);
+ intent.setComponent(ActivityBuilder.getDefaultComponent());
+
+ final ActivityInfo info = new ActivityInfo();
+
+ info.applicationInfo = new ApplicationInfo();
+ info.applicationInfo.packageName = ActivityBuilder.getDefaultComponent().getPackageName();
+
return new ActivityStarter(mController, mService,
- mService.mStackSupervisor, mock(ActivityStartInterceptor.class));
+ mService.mStackSupervisor, mock(ActivityStartInterceptor.class))
+ .setIntent(intent)
+ .setActivityInfo(info);
}
/**
@@ -342,9 +358,6 @@ public class ActivityStarterTests extends ActivityTestsBase {
// add custom values to activity info to make unique.
final ActivityInfo info = new ActivityInfo();
final Rect launchBounds = new Rect(0, 0, 20, 30);
- final Intent intent = new Intent();
-
- intent.setComponent(ActivityBuilder.getDefaultComponent());
final WindowLayout windowLayout =
new WindowLayout(10, .5f, 20, 1.0f, Gravity.NO_GRAVITY, 1, 1);
@@ -354,14 +367,13 @@ public class ActivityStarterTests extends ActivityTestsBase {
info.applicationInfo.packageName = ActivityBuilder.getDefaultComponent().getPackageName();
// create starter.
- final ActivityStarter optionStarter = prepareStarter();
+ final ActivityStarter optionStarter = prepareStarter(0 /* launchFlags */);
final ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchBounds(launchBounds);
// run starter.
optionStarter
- .setIntent(intent)
.setReason("testCreateTaskLayout")
.setActivityInfo(info)
.setActivityOptions(new SafeActivityOptions(options))
@@ -371,4 +383,69 @@ public class ActivityStarterTests extends ActivityTestsBase {
verify(modifier, times(1)).onCalculate(any(), eq(windowLayout), any(), any(), eq(options),
any(), any());
}
+
+ /**
+ * This test ensures that if the intent is being delivered to a
+ */
+ @Test
+ public void testSplitScreenDeliverToTop() {
+ final ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+
+ final ActivityRecord focusActivity = new ActivityBuilder(mService)
+ .setCreateTask(true)
+ .build();
+
+ focusActivity.getStack().setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+
+ final ActivityRecord reusableActivity = new ActivityBuilder(mService)
+ .setCreateTask(true)
+ .build();
+
+ // Create reusable activity after entering split-screen so that it is the top secondary
+ // stack.
+ reusableActivity.getStack().setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+
+ // Set focus back to primary.
+ mService.mStackSupervisor.setFocusStackUnchecked("testSplitScreenDeliverToTop",
+ focusActivity.getStack());
+
+ doReturn(reusableActivity).when(mService.mStackSupervisor).findTaskLocked(any(), anyInt());
+
+ final int result = starter.setReason("testSplitScreenDeliverToTop").execute();
+
+ // Ensure result is delivering intent to top.
+ assertEquals(result, START_DELIVERED_TO_TOP);
+ }
+
+ /**
+ * This test ensures that if the intent is being delivered to a split-screen unfocused task
+ * reports it is brought to front instead of delivering to top.
+ */
+ @Test
+ public void testSplitScreenTaskToFront() {
+ final ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+
+ // Create reusable activity here first. Setting the windowing mode of the primary stack
+ // will move the existing standard full screen stack to secondary, putting this one on the
+ // bottom.
+ final ActivityRecord reusableActivity = new ActivityBuilder(mService)
+ .setCreateTask(true)
+ .build();
+
+ reusableActivity.getStack().setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+
+ final ActivityRecord focusActivity = new ActivityBuilder(mService)
+ .setCreateTask(true)
+ .build();
+
+ // Enter split-screen. Primary stack should have focus.
+ focusActivity.getStack().setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+
+ doReturn(reusableActivity).when(mService.mStackSupervisor).findTaskLocked(any(), anyInt());
+
+ final int result = starter.setReason("testSplitScreenMoveToFront").execute();
+
+ // Ensure result is moving task to front.
+ assertEquals(result, START_TASK_TO_FRONT);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index c130592b4cd3..6fb1b2e21c47 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -353,22 +353,29 @@ public class ActivityTestsBase {
*/
protected static class TestActivityStackSupervisor extends ActivityStackSupervisor {
private ActivityDisplay mDisplay;
+ private KeyguardController mKeyguardController;
public TestActivityStackSupervisor(ActivityManagerService service, Looper looper) {
super(service, looper);
mDisplayManager =
(DisplayManager) mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
mWindowManager = prepareMockWindowManager();
+ mKeyguardController = mock(KeyguardController.class);
}
@Override
public void initialize() {
super.initialize();
- mDisplay = new TestActivityDisplay(this, DEFAULT_DISPLAY);
+ mDisplay = spy(new TestActivityDisplay(this, DEFAULT_DISPLAY));
attachDisplay(mDisplay);
}
@Override
+ public KeyguardController getKeyguardController() {
+ return mKeyguardController;
+ }
+
+ @Override
ActivityDisplay getDefaultDisplay() {
return mDisplay;
}
diff --git a/services/tests/servicestests/src/com/android/server/autofill/AutofillManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/autofill/AutofillManagerServiceTest.java
index c348e70bb375..d5a28f6b1d76 100644
--- a/services/tests/servicestests/src/com/android/server/autofill/AutofillManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/autofill/AutofillManagerServiceTest.java
@@ -27,8 +27,6 @@ import java.util.Map;
@RunWith(JUnit4.class)
public class AutofillManagerServiceTest {
- // TODO(b/74445943): temporary work around until P Development Preview 3 is branched
- private static final boolean ADDS_DEFAULT_BUTTON = true;
@Test
public void testGetWhitelistedCompatModePackages_null() {
@@ -42,16 +40,8 @@ public class AutofillManagerServiceTest {
@Test
public void testGetWhitelistedCompatModePackages_onePackageNoUrls() {
- if (ADDS_DEFAULT_BUTTON) {
- final Map<String, String[]> result =
- getWhitelistedCompatModePackages("one_is_the_loniest_package");
- assertThat(result).hasSize(1);
- assertThat(result.get("one_is_the_loniest_package")).asList()
- .containsExactly("url_bar", "location_bar_edit_text");
- } else {
- assertThat(getWhitelistedCompatModePackages("one_is_the_loniest_package"))
- .containsExactly("one_is_the_loniest_package", null);
- }
+ assertThat(getWhitelistedCompatModePackages("one_is_the_loniest_package"))
+ .containsExactly("one_is_the_loniest_package", null);
}
@Test
@@ -80,12 +70,7 @@ public class AutofillManagerServiceTest {
public void testGetWhitelistedCompatModePackages_multiplePackagesOneInvalid() {
final Map<String, String[]> result = getWhitelistedCompatModePackages("one:two[");
assertThat(result).hasSize(1);
- if (ADDS_DEFAULT_BUTTON) {
- assertThat(result.get("one")).asList()
- .containsExactly("url_bar", "location_bar_edit_text");
- } else {
- assertThat(result.get("one")).isNull();
- }
+ assertThat(result.get("one")).isNull();
}
@Test
@@ -94,12 +79,7 @@ public class AutofillManagerServiceTest {
getWhitelistedCompatModePackages("p1[p1u1]:p2:p3[p3u1,p3u2]");
assertThat(result).hasSize(3);
assertThat(result.get("p1")).asList().containsExactly("p1u1");
- if (ADDS_DEFAULT_BUTTON) {
- assertThat(result.get("p2")).asList()
- .containsExactly("url_bar", "location_bar_edit_text");
- } else {
- assertThat(result.get("p2")).isNull();
- }
+ assertThat(result.get("p2")).isNull();
assertThat(result.get("p3")).asList().containsExactly("p3u1", "p3u2");
}
diff --git a/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java b/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java
index 613d0afea183..2d5afadbf9f8 100644
--- a/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java
+++ b/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java
@@ -32,6 +32,7 @@ import android.content.res.XmlResourceParser;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Handler;
+import android.os.PersistableBundle;
import android.os.UserHandle;
import android.os.storage.VolumeInfo;
@@ -437,6 +438,11 @@ public class PackageManagerStub extends PackageManager {
}
@Override
+ public ResolveInfo resolveServiceAsUser(Intent intent, int flags, int userId) {
+ return null;
+ }
+
+ @Override
public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
return null;
}
@@ -869,8 +875,8 @@ public class PackageManagerStub extends PackageManager {
}
@Override
- public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean suspended,
- int userId) {
+ public String[] setPackagesSuspended(String[] packageNames, boolean suspended,
+ PersistableBundle appExtras, PersistableBundle launcherExtras, String dialogMessage) {
return new String[0];
}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index e8170ee4ad39..43490d312dbc 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -57,6 +57,7 @@ import android.app.admin.DeviceAdminReceiver;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.admin.PasswordMetrics;
+import android.app.backup.ISelectBackupTransportCallback;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Intent;
@@ -2264,6 +2265,21 @@ public class DevicePolicyManagerTest extends DpmTestBase {
assertEquals(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE,
intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
+ // Make the backup transport selection succeed
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ ISelectBackupTransportCallback callback =
+ (ISelectBackupTransportCallback) invocation.getArguments()[1];
+ if (callback != null) {
+ callback.onSuccess("");
+ }
+ return null;
+ }
+ }).when(getServices().ibackupManager).selectBackupTransportAsync(
+ any(ComponentName.class), any(ISelectBackupTransportCallback.class));
+
+
// Backups are not mandatory
intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_MANDATORY_BACKUPS);
assertNull(intent);
@@ -4738,7 +4754,11 @@ public class DevicePolicyManagerTest extends DpmTestBase {
public void testOverrideApnAPIsFailWithPO() throws Exception {
setupProfileOwner();
- ApnSetting apn = (new ApnSetting.Builder()).build();
+ ApnSetting apn = (new ApnSetting.Builder())
+ .setApnName("test")
+ .setEntryName("test")
+ .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
+ .build();
assertExpectException(SecurityException.class, null, () ->
dpm.addOverrideApn(admin1, apn));
assertExpectException(SecurityException.class, null, () ->
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
index 9213268b2ec8..e3e61ac29cce 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
@@ -16,9 +16,8 @@
package com.android.server.devicepolicy;
-import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_DEVICE_OWNER;
-
-
+import static com.android.server.devicepolicy.TransferOwnershipMetadataManager
+ .ADMIN_TYPE_DEVICE_OWNER;
import static com.android.server.devicepolicy.TransferOwnershipMetadataManager
.OWNER_TRANSFER_METADATA_XML;
import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_ADMIN_TYPE;
@@ -32,6 +31,7 @@ import static org.junit.Assert.assertTrue;
import android.os.Environment;
import android.support.test.runner.AndroidJUnit4;
+import android.util.Log;
import com.android.server.devicepolicy.TransferOwnershipMetadataManager.Injector;
import com.android.server.devicepolicy.TransferOwnershipMetadataManager.Metadata;
@@ -57,6 +57,7 @@ import java.nio.file.Paths;
@RunWith(AndroidJUnit4.class)
public class TransferOwnershipMetadataManagerTest {
+ private final static String TAG = TransferOwnershipMetadataManagerTest.class.getName();
private final static String SOURCE_COMPONENT =
"com.dummy.admin.package/com.dummy.admin.package.SourceClassName";
private final static String TARGET_COMPONENT =
@@ -106,6 +107,22 @@ public class TransferOwnershipMetadataManagerTest {
@Test
public void testLoad() {
TransferOwnershipMetadataManager paramsManager = getOwnerTransferParams();
+ final File transferOwnershipMetadataFile =
+ new File(mMockInjector.getOwnerTransferMetadataDir(), OWNER_TRANSFER_METADATA_XML);
+ Log.d(TAG, "testLoad: file path is " + transferOwnershipMetadataFile.getAbsolutePath());
+ Log.d(TAG, "testLoad: file exists? " + transferOwnershipMetadataFile.exists());
+ Log.d(TAG, "testLoad: file mkdir?" + transferOwnershipMetadataFile.mkdir());
+ try {
+ File canonicalFile = transferOwnershipMetadataFile.getCanonicalFile();
+ File parentFile = canonicalFile.getParentFile();
+ Log.d(TAG, "testLoad: file getCanonicalFile?" + canonicalFile);
+ Log.d(TAG, "testLoad: getCanonicalFile.getParentFile " + parentFile);
+ Log.d(TAG, "testLoad: parent mkdirs? " + parentFile.mkdirs());
+ Log.d(TAG, "testLoad: parent exists? " + parentFile.exists());
+ Log.d(TAG, "testLoad: canonical file.mkdir()? " + canonicalFile.mkdir());
+ } catch (IOException e) {
+ Log.d(TAG, "testLoad: failed to get canonical file");
+ }
paramsManager.saveMetadataFile(TEST_PARAMS);
assertEquals(TEST_PARAMS, paramsManager.loadMetadataFile());
}
diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
index b4f84742301d..92cc537ada6d 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
@@ -30,6 +30,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.database.ContentObserver;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.display.BrightnessChangeEvent;
@@ -101,20 +102,24 @@ public class BrightnessTrackerTest {
assertNull(mInjector.mSensorListener);
assertNotNull(mInjector.mBroadcastReceiver);
assertTrue(mInjector.mIdleScheduled);
- Intent onIntent = new Intent();
- onIntent.setAction(Intent.ACTION_SCREEN_ON);
- mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(),
- onIntent);
+ mInjector.sendScreenChange(/*screen on */ true);
assertNotNull(mInjector.mSensorListener);
- Intent offIntent = new Intent();
- offIntent.setAction(Intent.ACTION_SCREEN_OFF);
- mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(),
- offIntent);
+ mInjector.sendScreenChange(/*screen on */ false);
assertNull(mInjector.mSensorListener);
- mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(),
- onIntent);
+ // Turn screen on while brightness mode is manual
+ mInjector.setBrightnessMode(/* isBrightnessModeAutomatic */ false);
+ mInjector.sendScreenChange(/*screen on */ true);
+ assertNull(mInjector.mSensorListener);
+
+ // Set brightness mode to automatic while screen is off.
+ mInjector.sendScreenChange(/*screen on */ false);
+ mInjector.setBrightnessMode(/* isBrightnessModeAutomatic */ true);
+ assertNull(mInjector.mSensorListener);
+
+ // Turn on screen while brightness mode is automatic.
+ mInjector.sendScreenChange(/*screen on */ true);
assertNotNull(mInjector.mSensorListener);
mTracker.stop();
@@ -124,6 +129,37 @@ public class BrightnessTrackerTest {
}
@Test
+ public void testAdaptiveOnOff() {
+ mInjector.mInteractive = true;
+ mInjector.mIsBrightnessModeAutomatic = false;
+ startTracker(mTracker);
+ assertNull(mInjector.mSensorListener);
+ assertNotNull(mInjector.mBroadcastReceiver);
+ assertNotNull(mInjector.mContentObserver);
+ assertTrue(mInjector.mIdleScheduled);
+
+ mInjector.setBrightnessMode(/*isBrightnessModeAutomatic*/ true);
+ assertNotNull(mInjector.mSensorListener);
+
+ SensorEventListener listener = mInjector.mSensorListener;
+ mInjector.mSensorListener = null;
+ // Duplicate notification
+ mInjector.setBrightnessMode(/*isBrightnessModeAutomatic*/ true);
+ // Sensor shouldn't have been registered as it was already registered.
+ assertNull(mInjector.mSensorListener);
+ mInjector.mSensorListener = listener;
+
+ mInjector.setBrightnessMode(/*isBrightnessModeAutomatic*/ false);
+ assertNull(mInjector.mSensorListener);
+
+ mTracker.stop();
+ assertNull(mInjector.mSensorListener);
+ assertNull(mInjector.mBroadcastReceiver);
+ assertNull(mInjector.mContentObserver);
+ assertFalse(mInjector.mIdleScheduled);
+ }
+
+ @Test
public void testBrightnessEvent() {
final int brightness = 20;
@@ -618,16 +654,39 @@ public class BrightnessTrackerTest {
boolean mIdleScheduled;
boolean mInteractive = true;
int[] mProfiles;
+ ContentObserver mContentObserver;
+ boolean mIsBrightnessModeAutomatic = true;
public TestInjector(Handler handler) {
mHandler = handler;
}
- public void incrementTime(long timeMillis) {
+ void incrementTime(long timeMillis) {
mCurrentTimeMillis += timeMillis;
mElapsedRealtimeNanos += TimeUnit.MILLISECONDS.toNanos(timeMillis);
}
+ void setBrightnessMode(boolean isBrightnessModeAutomatic) {
+ mIsBrightnessModeAutomatic = isBrightnessModeAutomatic;
+ mContentObserver.dispatchChange(false, null);
+ waitForHandler();
+ }
+
+ void sendScreenChange(boolean screenOn) {
+ mInteractive = screenOn;
+ Intent intent = new Intent();
+ intent.setAction(screenOn ? Intent.ACTION_SCREEN_ON : Intent.ACTION_SCREEN_OFF);
+ mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(), intent);
+ waitForHandler();
+ }
+
+ void waitForHandler() {
+ Idle idle = new Idle();
+ mHandler.getLooper().getQueue().addIdleHandler(idle);
+ mHandler.post(() -> {});
+ idle.waitForIdle();
+ }
+
@Override
public void registerSensorListener(Context context,
SensorEventListener sensorListener, Handler handler) {
@@ -641,6 +700,18 @@ public class BrightnessTrackerTest {
}
@Override
+ public void registerBrightnessModeObserver(ContentResolver resolver,
+ ContentObserver settingsObserver) {
+ mContentObserver = settingsObserver;
+ }
+
+ @Override
+ public void unregisterBrightnessModeObserver(Context context,
+ ContentObserver settingsObserver) {
+ mContentObserver = null;
+ }
+
+ @Override
public void registerReceiver(Context context,
BroadcastReceiver shutdownReceiver, IntentFilter shutdownFilter) {
mBroadcastReceiver = shutdownReceiver;
@@ -658,11 +729,9 @@ public class BrightnessTrackerTest {
return mHandler;
}
- public void waitForHandler() {
- Idle idle = new Idle();
- mHandler.getLooper().getQueue().addIdleHandler(idle);
- mHandler.post(() -> {});
- idle.waitForIdle();
+ @Override
+ public boolean isBrightnessModeAutomatic(ContentResolver resolver) {
+ return mIsBrightnessModeAutomatic;
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
index 69796b33c2eb..0ea231773aaf 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
@@ -62,7 +62,6 @@ import org.mockito.MockitoAnnotations;
import java.io.File;
import java.nio.charset.StandardCharsets;
-import java.security.KeyPair;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
@@ -95,7 +94,6 @@ public class KeySyncTaskTest {
private RecoverySnapshotStorage mRecoverySnapshotStorage;
private RecoverableKeyStoreDb mRecoverableKeyStoreDb;
private File mDatabaseFile;
- private KeyPair mKeyPair;
private AndroidKeyStoreSecretKey mWrappingKey;
private PlatformEncryptionKey mEncryptKey;
@@ -108,7 +106,6 @@ public class KeySyncTaskTest {
Context context = InstrumentationRegistry.getTargetContext();
mDatabaseFile = context.getDatabasePath(DATABASE_FILE_NAME);
mRecoverableKeyStoreDb = RecoverableKeyStoreDb.newInstance(context);
- mKeyPair = SecureBox.genKeyPair();
mRecoverableKeyStoreDb.setRecoverySecretTypes(TEST_USER_ID, TEST_RECOVERY_AGENT_UID,
new int[] {TYPE_LOCKSCREEN});
@@ -249,8 +246,8 @@ public class KeySyncTaskTest {
TEST_RECOVERY_AGENT_UID,
TEST_APP_KEY_ALIAS,
WrappedKey.fromSecretKey(mEncryptKey, applicationKey));
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
mKeySyncTask.run();
@@ -265,8 +262,8 @@ public class KeySyncTaskTest {
TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
mKeySyncTask.run();
@@ -275,8 +272,8 @@ public class KeySyncTaskTest {
@Test
public void run_sendsEncryptedKeysIfAvailableToSync_withRawPublicKey() throws Exception {
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
mRecoverableKeyStoreDb.setServerParams(
TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
@@ -296,13 +293,12 @@ public class KeySyncTaskTest {
keyDerivationParams.getSalt(),
TEST_CREDENTIAL);
Long counterId = mRecoverableKeyStoreDb.getCounterId(TEST_USER_ID, TEST_RECOVERY_AGENT_UID);
- counterId = 1L; // TODO: use value from the database.
assertThat(counterId).isNotNull();
byte[] recoveryKey = decryptThmEncryptedKey(
lockScreenHash,
keyChainSnapshot.getEncryptedRecoveryKeyBlob(),
/*vaultParams=*/ KeySyncUtils.packVaultParams(
- mKeyPair.getPublic(),
+ TestData.CERT_1_PUBLIC_KEY,
counterId,
/*maxAttempts=*/ 10,
TEST_VAULT_HANDLE));
@@ -310,8 +306,8 @@ public class KeySyncTaskTest {
assertThat(applicationKeys).hasSize(1);
assertThat(keyChainSnapshot.getCounterId()).isEqualTo(counterId);
assertThat(keyChainSnapshot.getMaxAttempts()).isEqualTo(10);
- assertThat(keyChainSnapshot.getTrustedHardwarePublicKey())
- .isEqualTo(SecureBox.encodePublicKey(mKeyPair.getPublic()));
+ assertThat(keyChainSnapshot.getTrustedHardwareCertPath())
+ .isEqualTo(TestData.CERT_PATH_1);
assertThat(keyChainSnapshot.getServerParams()).isEqualTo(TEST_VAULT_HANDLE);
WrappedApplicationKey keyData = applicationKeys.get(0);
assertEquals(TEST_APP_KEY_ALIAS, keyData.getAlias());
@@ -336,15 +332,14 @@ public class KeySyncTaskTest {
verify(mSnapshotListenersStorage).recoverySnapshotAvailable(TEST_RECOVERY_AGENT_UID);
List<WrappedApplicationKey> applicationKeys = keyChainSnapshot.getWrappedApplicationKeys();
assertThat(applicationKeys).hasSize(1);
- assertThat(keyChainSnapshot.getTrustedHardwarePublicKey())
- .isEqualTo(SecureBox.encodePublicKey(
- TestData.CERT_PATH_1.getCertificates().get(0).getPublicKey()));
+ assertThat(keyChainSnapshot.getTrustedHardwareCertPath())
+ .isEqualTo(TestData.CERT_PATH_1);
}
@Test
public void run_setsCorrectSnapshotVersion() throws Exception {
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -362,8 +357,8 @@ public class KeySyncTaskTest {
@Test
public void run_recreatesMissingSnapshot() throws Exception {
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -392,8 +387,8 @@ public class KeySyncTaskTest {
/*credentialUpdated=*/ false,
mPlatformKeyManager);
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
SecretKey applicationKey =
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -418,8 +413,8 @@ public class KeySyncTaskTest {
/*credentialUpdated=*/ false,
mPlatformKeyManager);
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
SecretKey applicationKey =
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -445,8 +440,8 @@ public class KeySyncTaskTest {
/*credentialUpdated=*/ false,
mPlatformKeyManager);
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
SecretKey applicationKey =
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -461,10 +456,10 @@ public class KeySyncTaskTest {
@Test
public void run_sendsEncryptedKeysWithTwoRegisteredAgents() throws Exception {
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID2)).thenReturn(true);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -483,10 +478,10 @@ public class KeySyncTaskTest {
mRecoverableKeyStoreDb.setRecoverySecretTypes(TEST_USER_ID, TEST_RECOVERY_AGENT_UID2,
new int[] {1000});
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID2)).thenReturn(true);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -500,10 +495,10 @@ public class KeySyncTaskTest {
@Test
public void run_notifiesNonregisteredAgent() throws Exception {
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID, mKeyPair.getPublic());
- mRecoverableKeyStoreDb.setRecoveryServicePublicKey(
- TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, mKeyPair.getPublic());
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TestData.CERT_PATH_1);
+ mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+ TEST_USER_ID, TEST_RECOVERY_AGENT_UID2, TestData.CERT_PATH_1);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID)).thenReturn(true);
when(mSnapshotListenersStorage.hasListener(TEST_RECOVERY_AGENT_UID2)).thenReturn(false);
addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
@@ -563,7 +558,7 @@ public class KeySyncTaskTest {
private byte[] decryptThmEncryptedKey(
byte[] lockScreenHash, byte[] encryptedKey, byte[] vaultParams) throws Exception {
byte[] locallyEncryptedKey = SecureBox.decrypt(
- mKeyPair.getPrivate(),
+ TestData.CERT_1_PRIVATE_KEY,
/*sharedSecret=*/ KeySyncUtils.calculateThmKfHash(lockScreenHash),
/*header=*/ KeySyncUtils.concat(THM_ENCRYPTED_RECOVERY_KEY_HEADER, vaultParams),
encryptedKey
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
index a251c9d7898e..fae48c68b8db 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
@@ -52,6 +52,8 @@ public class KeySyncUtilsTest {
private static final int KEY_CLAIMANT_LENGTH_BYTES = 16;
private static final byte[] TEST_VAULT_HANDLE =
new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
+ private static final int VAULT_PARAMS_LENGTH_BYTES = 94;
+ private static final int VAULT_HANDLE_LENGTH_BYTES = 17;
private static final String SHA_256_ALGORITHM = "SHA-256";
private static final String APPLICATION_KEY_ALGORITHM = "AES";
private static final byte[] LOCK_SCREEN_HASH_1 =
@@ -63,8 +65,7 @@ public class KeySyncUtilsTest {
private static final byte[] RECOVERY_RESPONSE_HEADER =
"V1 reencrypted_recovery_key".getBytes(StandardCharsets.UTF_8);
private static final int PUBLIC_KEY_LENGTH_BYTES = 65;
- private static final int VAULT_PARAMS_LENGTH_BYTES = 94;
- private static final int VAULT_HANDLE_LENGTH_BYTES = 17;
+
@Test
public void calculateThmKfHash_isShaOfLockScreenHashWithPrefix() throws Exception {
@@ -345,7 +346,7 @@ public class KeySyncUtilsTest {
}
@Test
- public void packVaultParams_returns94Bytes() throws Exception {
+ public void packVaultParams_returnsCorrectSize() throws Exception {
PublicKey thmPublicKey = SecureBox.genKeyPair().getPublic();
byte[] packedForm = KeySyncUtils.packVaultParams(
@@ -420,6 +421,24 @@ public class KeySyncUtilsTest {
assertArrayEquals(TEST_VAULT_HANDLE, vaultHandle);
}
+ @Test
+ public void packVaultParams_encodesVaultHandleWithLength8AsLastParam() throws Exception {
+ byte[] vaultHandleWithLenght8 = new byte[] {1, 2, 3, 4, 1, 2, 3, 4};
+ byte[] packedForm = KeySyncUtils.packVaultParams(
+ SecureBox.genKeyPair().getPublic(),
+ /*counterId=*/ 10021L,
+ /*maxAttempts=*/ 10,
+ vaultHandleWithLenght8);
+
+ ByteBuffer byteBuffer = ByteBuffer.wrap(packedForm)
+ .order(ByteOrder.LITTLE_ENDIAN);
+ assertEquals(PUBLIC_KEY_LENGTH_BYTES + Long.BYTES + Integer.BYTES + 8, packedForm.length);
+ byteBuffer.position(PUBLIC_KEY_LENGTH_BYTES + Long.BYTES + Integer.BYTES);
+ byte[] vaultHandle = new byte[8];
+ byteBuffer.get(vaultHandle);
+ assertArrayEquals(vaultHandleWithLenght8, vaultHandle);
+ }
+
private static byte[] randomBytes(int n) {
byte[] bytes = new byte[n];
new Random().nextBytes(bytes);
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
index 0ceb55862738..0d6d525b7fc6 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
@@ -40,6 +40,7 @@ import android.os.Binder;
import android.os.ServiceSpecificException;
import android.os.UserHandle;
import android.security.KeyStore;
+import android.security.keystore.AndroidKeyStoreProvider;
import android.security.keystore.AndroidKeyStoreSecretKey;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
@@ -68,6 +69,7 @@ import org.mockito.MockitoAnnotations;
import java.io.File;
import java.nio.charset.StandardCharsets;
+import java.security.UnrecoverableKeyException;
import java.security.cert.CertPath;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
@@ -76,8 +78,10 @@ import java.util.concurrent.Executors;
import java.util.Map;
import java.util.Random;
+import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
+import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
@SmallTest
@@ -85,7 +89,7 @@ import javax.crypto.spec.SecretKeySpec;
public class RecoverableKeyStoreManagerTest {
private static final String DATABASE_FILE_NAME = "recoverablekeystore.db";
- private static final String ROOT_CERTIFICATE_ALIAS = "put_default_alias_here";
+ private static final String ROOT_CERTIFICATE_ALIAS = "";
private static final String TEST_SESSION_ID = "karlin";
private static final byte[] TEST_PUBLIC_KEY = new byte[] {
(byte) 0x30, (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a,
@@ -139,12 +143,12 @@ public class RecoverableKeyStoreManagerTest {
private static final String KEY_ALGORITHM = "AES";
private static final String ANDROID_KEY_STORE_PROVIDER = "AndroidKeyStore";
private static final String WRAPPING_KEY_ALIAS = "RecoverableKeyStoreManagerTest/WrappingKey";
+ private static final String TEST_ROOT_CERT_ALIAS = "";
@Mock private Context mMockContext;
@Mock private RecoverySnapshotListenersStorage mMockListenersStorage;
@Mock private KeyguardManager mKeyguardManager;
@Mock private PlatformKeyManager mPlatformKeyManager;
- @Mock private KeyStore mKeyStore;
@Mock private ApplicationKeyStorage mApplicationKeyStorage;
private RecoverableKeyStoreDb mRecoverableKeyStoreDb;
@@ -175,7 +179,7 @@ public class RecoverableKeyStoreManagerTest {
mRecoverableKeyStoreManager = new RecoverableKeyStoreManager(
mMockContext,
- mKeyStore,
+ KeyStore.getInstance(),
mRecoverableKeyStoreDb,
mRecoverySessionStorage,
Executors.newSingleThreadExecutor(),
@@ -219,6 +223,7 @@ public class RecoverableKeyStoreManagerTest {
assertThat(mRecoverableKeyStoreDb.getKey(uid, TEST_ALIAS)).isNotNull();
assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
+ // TODO(76083050) Test the grant mechanism for the keys.
}
@Test
@@ -237,8 +242,8 @@ public class RecoverableKeyStoreManagerTest {
try {
mRecoverableKeyStoreManager.importKey(TEST_ALIAS, /*keyBytes=*/ null);
fail("should have thrown");
- } catch (ServiceSpecificException e) {
- assertThat(e.getMessage()).contains("not contain 256 bits");
+ } catch (NullPointerException e) {
+ assertThat(e.getMessage()).contains("is null");
}
}
@@ -295,6 +300,23 @@ public class RecoverableKeyStoreManagerTest {
}
@Test
+ public void initRecoveryService_regeneratesCounterId() throws Exception {
+ int uid = Binder.getCallingUid();
+ int userId = UserHandle.getCallingUserId();
+ long certSerial = 1000L;
+
+ Long counterId0 = mRecoverableKeyStoreDb.getCounterId(userId, uid);
+ mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
+ TestData.getCertXmlWithSerial(certSerial));
+ Long counterId1 = mRecoverableKeyStoreDb.getCounterId(userId, uid);
+ mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
+ TestData.getCertXmlWithSerial(certSerial + 1));
+ Long counterId2 = mRecoverableKeyStoreDb.getCounterId(userId, uid);
+
+ assertThat(!counterId1.equals(counterId0) || !counterId2.equals(counterId1)).isTrue();
+ }
+
+ @Test
public void initRecoveryService_throwsIfInvalidCert() throws Exception {
byte[] modifiedCertXml = TestData.getCertXml();
modifiedCertXml[modifiedCertXml.length - 50] ^= 1; // Flip a bit in the certificate
@@ -388,7 +410,7 @@ public class RecoverableKeyStoreManagerTest {
ROOT_CERTIFICATE_ALIAS, /*recoveryServiceCertFile=*/ null,
TestData.getSigXml());
fail("should have thrown");
- } catch (ServiceSpecificException e) {
+ } catch (NullPointerException e) {
assertThat(e.getMessage()).contains("is null");
}
}
@@ -400,7 +422,7 @@ public class RecoverableKeyStoreManagerTest {
ROOT_CERTIFICATE_ALIAS, TestData.getCertXml(),
/*recoveryServiceSigFile=*/ null);
fail("should have thrown");
- } catch (ServiceSpecificException e) {
+ } catch (NullPointerException e) {
assertThat(e.getMessage()).contains("is null");
}
}
@@ -449,10 +471,13 @@ public class RecoverableKeyStoreManagerTest {
eq(Manifest.permission.RECOVER_KEYSTORE), any());
}
+ // TODO: Add tests for non-existing cert alias
+
@Test
public void startRecoverySessionWithCertPath_storesTheSessionInfo() throws Exception {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
+ TEST_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -474,6 +499,7 @@ public class RecoverableKeyStoreManagerTest {
public void startRecoverySessionWithCertPath_checksPermissionFirst() throws Exception {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
+ TEST_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -549,6 +575,16 @@ public class RecoverableKeyStoreManagerTest {
}
@Test
+ public void closeSession_throwsIfNullSession() throws Exception {
+ try {
+ mRecoverableKeyStoreManager.closeSession(/*sessionId=*/ null);
+ fail("should have thrown");
+ } catch (NullPointerException e) {
+ assertThat(e.getMessage()).contains("invalid");
+ }
+ }
+
+ @Test
public void startRecoverySession_throwsIfBadNumberOfSecrets() throws Exception {
try {
mRecoverableKeyStoreManager.startRecoverySession(
@@ -591,6 +627,7 @@ public class RecoverableKeyStoreManagerTest {
try {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
+ TEST_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -609,6 +646,7 @@ public class RecoverableKeyStoreManagerTest {
try {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
+ TEST_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
vaultParams,
TEST_VAULT_CHALLENGE,
@@ -631,6 +669,7 @@ public class RecoverableKeyStoreManagerTest {
try {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
+ TEST_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(emptyCertPath),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -655,6 +694,7 @@ public class RecoverableKeyStoreManagerTest {
try {
mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
TEST_SESSION_ID,
+ TEST_ROOT_CERT_ALIAS,
RecoveryCertPath.createRecoveryCertPath(shortCertPath),
TEST_VAULT_PARAMS,
TEST_VAULT_CHALLENGE,
@@ -671,9 +711,9 @@ public class RecoverableKeyStoreManagerTest {
}
@Test
- public void recoverKeys_throwsIfNoSessionIsPresent() throws Exception {
+ public void recoverKeyChainSnapshot_throwsIfNoSessionIsPresent() throws Exception {
try {
- mRecoverableKeyStoreManager.recoverKeys(
+ mRecoverableKeyStoreManager.recoverKeyChainSnapshot(
TEST_SESSION_ID,
/*recoveryKeyBlob=*/ randomBytes(32),
/*applicationKeys=*/ ImmutableList.of(
@@ -686,7 +726,7 @@ public class RecoverableKeyStoreManagerTest {
}
@Test
- public void recoverKeys_throwsIfRecoveryClaimCannotBeDecrypted() throws Exception {
+ public void recoverKeyChainSnapshot_throwsIfRecoveryClaimCannotBeDecrypted() throws Exception {
mRecoverableKeyStoreManager.startRecoverySession(
TEST_SESSION_ID,
TEST_PUBLIC_KEY,
@@ -699,7 +739,7 @@ public class RecoverableKeyStoreManagerTest {
TEST_SECRET)));
try {
- mRecoverableKeyStoreManager.recoverKeys(
+ mRecoverableKeyStoreManager.recoverKeyChainSnapshot(
TEST_SESSION_ID,
/*encryptedRecoveryKey=*/ randomBytes(60),
/*applicationKeys=*/ ImmutableList.of());
@@ -710,7 +750,7 @@ public class RecoverableKeyStoreManagerTest {
}
@Test
- public void recoverKeys_throwsIfFailedToDecryptAllApplicationKeys() throws Exception {
+ public void recoverKeyChainSnapshot_throwsIfFailedToDecryptAllApplicationKeys() throws Exception {
mRecoverableKeyStoreManager.startRecoverySession(
TEST_SESSION_ID,
TEST_PUBLIC_KEY,
@@ -731,7 +771,7 @@ public class RecoverableKeyStoreManagerTest {
encryptedApplicationKey(randomRecoveryKey(), randomBytes(32)));
try {
- mRecoverableKeyStoreManager.recoverKeys(
+ mRecoverableKeyStoreManager.recoverKeyChainSnapshot(
TEST_SESSION_ID,
/*encryptedRecoveryKey=*/ encryptedClaimResponse,
/*applicationKeys=*/ ImmutableList.of(badApplicationKey));
@@ -742,7 +782,8 @@ public class RecoverableKeyStoreManagerTest {
}
@Test
- public void recoverKeys_doesNotThrowIfNoApplicationKeysToBeDecrypted() throws Exception {
+ public void recoverKeyChainSnapshot_doesNotThrowIfNoApplicationKeysToBeDecrypted()
+ throws Exception {
mRecoverableKeyStoreManager.startRecoverySession(
TEST_SESSION_ID,
TEST_PUBLIC_KEY,
@@ -759,14 +800,14 @@ public class RecoverableKeyStoreManagerTest {
byte[] encryptedClaimResponse = encryptClaimResponse(
keyClaimant, TEST_SECRET, TEST_VAULT_PARAMS, recoveryKey);
- mRecoverableKeyStoreManager.recoverKeys(
+ mRecoverableKeyStoreManager.recoverKeyChainSnapshot(
TEST_SESSION_ID,
/*encryptedRecoveryKey=*/ encryptedClaimResponse,
/*applicationKeys=*/ ImmutableList.of());
}
@Test
- public void recoverKeys_returnsDecryptedKeys() throws Exception {
+ public void recoverKeyChainSnapshot_returnsDecryptedKeys() throws Exception {
mRecoverableKeyStoreManager.startRecoverySession(
TEST_SESSION_ID,
TEST_PUBLIC_KEY,
@@ -787,17 +828,18 @@ public class RecoverableKeyStoreManagerTest {
TEST_ALIAS,
encryptedApplicationKey(recoveryKey, applicationKeyBytes));
- Map<String, byte[]> recoveredKeys = mRecoverableKeyStoreManager.recoverKeys(
+ Map<String, String> recoveredKeys = mRecoverableKeyStoreManager.recoverKeyChainSnapshot(
TEST_SESSION_ID,
encryptedClaimResponse,
ImmutableList.of(applicationKey));
assertThat(recoveredKeys).hasSize(1);
- assertThat(recoveredKeys.get(TEST_ALIAS)).isEqualTo(applicationKeyBytes);
+ assertThat(recoveredKeys).containsKey(TEST_ALIAS);
+ // TODO(76083050) Test the grant mechanism for the keys.
}
@Test
- public void recoverKeys_worksOnOtherApplicationKeysIfOneDecryptionFails() throws Exception {
+ public void recoverKeyChainSnapshot_worksOnOtherApplicationKeysIfOneDecryptionFails() throws Exception {
mRecoverableKeyStoreManager.startRecoverySession(
TEST_SESSION_ID,
TEST_PUBLIC_KEY,
@@ -825,13 +867,14 @@ public class RecoverableKeyStoreManagerTest {
TEST_ALIAS2,
encryptedApplicationKey(recoveryKey, applicationKeyBytes2));
- Map<String, byte[]> recoveredKeys = mRecoverableKeyStoreManager.recoverKeys(
+ Map<String, String> recoveredKeys = mRecoverableKeyStoreManager.recoverKeyChainSnapshot(
TEST_SESSION_ID,
encryptedClaimResponse,
ImmutableList.of(applicationKey1, applicationKey2));
assertThat(recoveredKeys).hasSize(1);
- assertThat(recoveredKeys.get(TEST_ALIAS2)).isEqualTo(applicationKeyBytes2);
+ assertThat(recoveredKeys).containsKey(TEST_ALIAS2);
+ // TODO(76083050) Test the grant mechanism for the keys.
}
@Test
@@ -864,6 +907,16 @@ public class RecoverableKeyStoreManagerTest {
}
@Test
+ public void setRecoverySecretTypes_throwsIfNullTypes() throws Exception {
+ try {
+ mRecoverableKeyStoreManager.setRecoverySecretTypes(/*types=*/ null);
+ fail("should have thrown");
+ } catch (NullPointerException e) {
+ assertThat(e.getMessage()).contains("is null");
+ }
+ }
+
+ @Test
public void setRecoverySecretTypes_updatesShouldCreateSnapshot() throws Exception {
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
@@ -897,6 +950,16 @@ public class RecoverableKeyStoreManagerTest {
assertThat(statuses).containsEntry(alias, status2); // updated
}
+ @Test
+ public void setRecoveryStatus_throwsIfNullAlias() throws Exception {
+ try {
+ mRecoverableKeyStoreManager.setRecoveryStatus(/*alias=*/ null, /*status=*/ 100);
+ fail("should have thrown");
+ } catch (NullPointerException e) {
+ assertThat(e.getMessage()).contains("is null");
+ }
+ }
+
private static byte[] encryptedApplicationKey(
SecretKey recoveryKey, byte[] applicationKey) throws Exception {
return KeySyncUtils.encryptKeysWithRecoveryKey(recoveryKey, ImmutableMap.of(
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestData.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestData.java
index b5d6ce8cb74c..4b059c665b54 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestData.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestData.java
@@ -1,11 +1,18 @@
package com.android.server.locksettings.recoverablekeystore;
+import static com.google.common.truth.Truth.assertThat;
+
import com.android.server.locksettings.recoverablekeystore.certificate.CertUtils;
import java.io.ByteArrayInputStream;
+import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
-import java.security.cert.CertPath;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
import java.security.cert.CertificateFactory;
+import java.security.cert.CertPath;
+import java.security.spec.ECPrivateKeySpec;
public final class TestData {
@@ -213,6 +220,44 @@ public final class TestData {
+ " </value>\n"
+ "</signature>\n";
+ public static final PublicKey CERT_1_PUBLIC_KEY;
+ public static final PrivateKey CERT_1_PRIVATE_KEY;
+
+ static {
+ try {
+ CERT_1_PUBLIC_KEY =
+ SecureBox.decodePublicKey(
+ new byte[] {
+ (byte) 0x04, (byte) 0xb8, (byte) 0x00, (byte) 0x11, (byte) 0x18,
+ (byte) 0x98, (byte) 0x1d, (byte) 0xf0, (byte) 0x6e, (byte) 0xb4,
+ (byte) 0x94, (byte) 0xfe, (byte) 0x86, (byte) 0xda, (byte) 0x1c,
+ (byte) 0x07, (byte) 0x8d, (byte) 0x01, (byte) 0xb4, (byte) 0x3a,
+ (byte) 0xf6, (byte) 0x8d, (byte) 0xdc, (byte) 0x61, (byte) 0xd0,
+ (byte) 0x46, (byte) 0x49, (byte) 0x95, (byte) 0x0f, (byte) 0x10,
+ (byte) 0x86, (byte) 0x93, (byte) 0x24, (byte) 0x66, (byte) 0xe0,
+ (byte) 0x3f, (byte) 0xd2, (byte) 0xdf, (byte) 0xf3, (byte) 0x79,
+ (byte) 0x20, (byte) 0x1d, (byte) 0x91, (byte) 0x55, (byte) 0xb0,
+ (byte) 0xe5, (byte) 0xbd, (byte) 0x7a, (byte) 0x8b, (byte) 0x32,
+ (byte) 0x7d, (byte) 0x25, (byte) 0x53, (byte) 0xa2, (byte) 0xfc,
+ (byte) 0xa5, (byte) 0x65, (byte) 0xe1, (byte) 0xbd, (byte) 0x21,
+ (byte) 0x44, (byte) 0x7e, (byte) 0x78, (byte) 0x52, (byte) 0xfa
+ });
+ CERT_1_PRIVATE_KEY =
+ decodePrivateKey(
+ new byte[] {
+ (byte) 0x70, (byte) 0x01, (byte) 0xc7, (byte) 0x87, (byte) 0x32,
+ (byte) 0x2f, (byte) 0x1c, (byte) 0x9a, (byte) 0x6e, (byte) 0xb1,
+ (byte) 0x91, (byte) 0xca, (byte) 0x4e, (byte) 0xb5, (byte) 0x44,
+ (byte) 0xba, (byte) 0xc8, (byte) 0x68, (byte) 0xc6, (byte) 0x0a,
+ (byte) 0x76, (byte) 0xcb, (byte) 0xd3, (byte) 0x63, (byte) 0x67,
+ (byte) 0x7c, (byte) 0xb0, (byte) 0x11, (byte) 0x82, (byte) 0x65,
+ (byte) 0x77, (byte) 0x01
+ });
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
public static byte[] getCertPath1Bytes() {
try {
return CertUtils.decodeBase64(CERT_PATH_1_BASE64);
@@ -256,4 +301,11 @@ public final class TestData {
public static byte[] getSigXml() {
return THM_SIG_XML.getBytes(StandardCharsets.UTF_8);
}
+
+ private static PrivateKey decodePrivateKey(byte[] keyBytes) throws Exception {
+ assertThat(keyBytes.length).isEqualTo(32);
+ BigInteger priv = new BigInteger(/*signum=*/ 1, keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance("EC");
+ return keyFactory.generatePrivate(new ECPrivateKeySpec(priv, SecureBox.EC_PARAM_SPEC));
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java
deleted file mode 100644
index 180345c808e9..000000000000
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.locksettings.recoverablekeystore.storage;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.testng.Assert.assertThrows;
-
-import android.security.keystore.recovery.KeyDerivationParams;
-import android.security.keystore.recovery.WrappedApplicationKey;
-import android.security.keystore.recovery.KeyChainSnapshot;
-import android.security.keystore.recovery.KeyChainProtectionParams;
-
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class PersistentKeyChainSnapshotTest {
-
- private static final String ALIAS = "some_key";
- private static final String ALIAS2 = "another_key";
- private static final byte[] RECOVERY_KEY_MATERIAL = "recovery_key_data"
- .getBytes(StandardCharsets.UTF_8);
- private static final byte[] KEY_MATERIAL = "app_key_data".getBytes(StandardCharsets.UTF_8);
- private static final byte[] PUBLIC_KEY = "public_key_data".getBytes(StandardCharsets.UTF_8);
- private static final byte[] SALT = "salt".getBytes(StandardCharsets.UTF_8);
- private static final int SNAPSHOT_VERSION = 2;
- private static final int MAX_ATTEMPTS = 10;
- private static final long COUNTER_ID = 123456789L;
- private static final byte[] SERVER_PARAMS = "server_params".getBytes(StandardCharsets.UTF_8);
- private static final byte[] ZERO_BYTES = new byte[0];
- private static final byte[] ONE_BYTE = new byte[]{(byte) 11};
- private static final byte[] TWO_BYTES = new byte[]{(byte) 222,(byte) 222};
-
- @Test
- public void testWriteInt() throws Exception {
- PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
- writer.initWriter();
- writer.writeInt(Integer.MIN_VALUE);
- writer.writeInt(Integer.MAX_VALUE);
- byte[] result = writer.getOutput();
-
- PersistentKeyChainSnapshot reader = new PersistentKeyChainSnapshot();
- reader.initReader(result);
- assertThat(reader.readInt()).isEqualTo(Integer.MIN_VALUE);
- assertThat(reader.readInt()).isEqualTo(Integer.MAX_VALUE);
-
- assertThrows(
- IOException.class,
- () -> reader.readInt());
- }
-
- @Test
- public void testWriteLong() throws Exception {
- PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
- writer.initWriter();
- writer.writeLong(Long.MIN_VALUE);
- writer.writeLong(Long.MAX_VALUE);
- byte[] result = writer.getOutput();
-
- PersistentKeyChainSnapshot reader = new PersistentKeyChainSnapshot();
- reader.initReader(result);
- assertThat(reader.readLong()).isEqualTo(Long.MIN_VALUE);
- assertThat(reader.readLong()).isEqualTo(Long.MAX_VALUE);
-
- assertThrows(
- IOException.class,
- () -> reader.readLong());
- }
-
- @Test
- public void testWriteBytes() throws Exception {
- PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
- writer.initWriter();
- writer.writeBytes(ZERO_BYTES);
- writer.writeBytes(ONE_BYTE);
- writer.writeBytes(TWO_BYTES);
- byte[] result = writer.getOutput();
-
- PersistentKeyChainSnapshot reader = new PersistentKeyChainSnapshot();
- reader.initReader(result);
- assertThat(reader.readBytes()).isEqualTo(ZERO_BYTES);
- assertThat(reader.readBytes()).isEqualTo(ONE_BYTE);
- assertThat(reader.readBytes()).isEqualTo(TWO_BYTES);
-
- assertThrows(
- IOException.class,
- () -> reader.readBytes());
- }
-
- @Test
- public void testReadBytes_returnsNullArrayAsEmpty() throws Exception {
- PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
- writer.initWriter();
- writer.writeBytes(null);
- byte[] result = writer.getOutput();
-
- PersistentKeyChainSnapshot reader = new PersistentKeyChainSnapshot();
- reader.initReader(result);
- assertThat(reader.readBytes()).isEqualTo(new byte[]{}); // null -> empty array
- }
-
- @Test
- public void testWriteKeyEntry() throws Exception {
- PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
- writer.initWriter();
- WrappedApplicationKey entry = new WrappedApplicationKey.Builder()
- .setAlias(ALIAS)
- .setEncryptedKeyMaterial(KEY_MATERIAL)
- .build();
- writer.writeKeyEntry(entry);
-
- byte[] result = writer.getOutput();
-
- PersistentKeyChainSnapshot reader = new PersistentKeyChainSnapshot();
- reader.initReader(result);
-
- WrappedApplicationKey copy = reader.readKeyEntry();
- assertThat(copy.getAlias()).isEqualTo(ALIAS);
- assertThat(copy.getEncryptedKeyMaterial()).isEqualTo(KEY_MATERIAL);
-
- assertThrows(
- IOException.class,
- () -> reader.readKeyEntry());
- }
-
- @Test
- public void testWriteProtectionParams() throws Exception {
- PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
- writer.initWriter();
- KeyDerivationParams derivationParams = KeyDerivationParams.createSha256Params(SALT);
- KeyChainProtectionParams protectionParams = new KeyChainProtectionParams.Builder()
- .setUserSecretType(1)
- .setLockScreenUiFormat(2)
- .setKeyDerivationParams(derivationParams)
- .build();
- writer.writeProtectionParams(protectionParams);
-
- byte[] result = writer.getOutput();
-
- PersistentKeyChainSnapshot reader = new PersistentKeyChainSnapshot();
- reader.initReader(result);
-
- KeyChainProtectionParams copy = reader.readProtectionParams();
- assertThat(copy.getUserSecretType()).isEqualTo(1);
- assertThat(copy.getLockScreenUiFormat()).isEqualTo(2);
- assertThat(copy.getKeyDerivationParams().getSalt()).isEqualTo(SALT);
-
- assertThrows(
- IOException.class,
- () -> reader.readProtectionParams());
- }
-
- @Test
- public void testKeyChainSnapshot() throws Exception {
- PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
- writer.initWriter();
-
- KeyDerivationParams derivationParams = KeyDerivationParams.createSha256Params(SALT);
-
- ArrayList<KeyChainProtectionParams> protectionParamsList = new ArrayList<>();
- protectionParamsList.add(new KeyChainProtectionParams.Builder()
- .setUserSecretType(1)
- .setLockScreenUiFormat(2)
- .setKeyDerivationParams(derivationParams)
- .build());
-
- ArrayList<WrappedApplicationKey> appKeysList = new ArrayList<>();
- appKeysList.add(new WrappedApplicationKey.Builder()
- .setAlias(ALIAS)
- .setEncryptedKeyMaterial(KEY_MATERIAL)
- .build());
-
- KeyChainSnapshot snapshot = new KeyChainSnapshot.Builder()
- .setSnapshotVersion(SNAPSHOT_VERSION)
- .setKeyChainProtectionParams(protectionParamsList)
- .setEncryptedRecoveryKeyBlob(RECOVERY_KEY_MATERIAL)
- .setWrappedApplicationKeys(appKeysList)
- .setMaxAttempts(MAX_ATTEMPTS)
- .setCounterId(COUNTER_ID)
- .setServerParams(SERVER_PARAMS)
- .setTrustedHardwarePublicKey(PUBLIC_KEY)
- .build();
-
- writer.writeKeyChainSnapshot(snapshot);
-
- byte[] result = writer.getOutput();
-
- PersistentKeyChainSnapshot reader = new PersistentKeyChainSnapshot();
- reader.initReader(result);
-
- KeyChainSnapshot copy = reader.readKeyChainSnapshot();
- assertThat(copy.getSnapshotVersion()).isEqualTo(SNAPSHOT_VERSION);
- assertThat(copy.getKeyChainProtectionParams()).hasSize(1);
- assertThat(copy.getKeyChainProtectionParams().get(0).getUserSecretType()).isEqualTo(1);
- assertThat(copy.getEncryptedRecoveryKeyBlob()).isEqualTo(RECOVERY_KEY_MATERIAL);
- assertThat(copy.getWrappedApplicationKeys()).hasSize(1);
- assertThat(copy.getWrappedApplicationKeys().get(0).getAlias()).isEqualTo(ALIAS);
- assertThat(copy.getMaxAttempts()).isEqualTo(MAX_ATTEMPTS);
- assertThat(copy.getCounterId()).isEqualTo(COUNTER_ID);
- assertThat(copy.getServerParams()).isEqualTo(SERVER_PARAMS);
- assertThat(copy.getTrustedHardwarePublicKey()).isEqualTo(PUBLIC_KEY);
-
- assertThrows(
- IOException.class,
- () -> reader.readKeyChainSnapshot());
-
- verifyDeserialize(snapshot);
- }
-
- @Test
- public void testKeyChainSnapshot_withManyKeysAndProtectionParams() throws Exception {
- PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
- writer.initWriter();
-
- KeyDerivationParams derivationParams = KeyDerivationParams.createSha256Params(SALT);
-
- ArrayList<KeyChainProtectionParams> protectionParamsList = new ArrayList<>();
- protectionParamsList.add(new KeyChainProtectionParams.Builder()
- .setUserSecretType(1)
- .setLockScreenUiFormat(2)
- .setKeyDerivationParams(derivationParams)
- .build());
- protectionParamsList.add(new KeyChainProtectionParams.Builder()
- .setUserSecretType(2)
- .setLockScreenUiFormat(3)
- .setKeyDerivationParams(derivationParams)
- .build());
- ArrayList<WrappedApplicationKey> appKeysList = new ArrayList<>();
- appKeysList.add(new WrappedApplicationKey.Builder()
- .setAlias(ALIAS)
- .setEncryptedKeyMaterial(KEY_MATERIAL)
- .build());
- appKeysList.add(new WrappedApplicationKey.Builder()
- .setAlias(ALIAS2)
- .setEncryptedKeyMaterial(KEY_MATERIAL)
- .build());
-
-
- KeyChainSnapshot snapshot = new KeyChainSnapshot.Builder()
- .setSnapshotVersion(SNAPSHOT_VERSION)
- .setKeyChainProtectionParams(protectionParamsList)
- .setEncryptedRecoveryKeyBlob(RECOVERY_KEY_MATERIAL)
- .setWrappedApplicationKeys(appKeysList)
- .setMaxAttempts(MAX_ATTEMPTS)
- .setCounterId(COUNTER_ID)
- .setServerParams(SERVER_PARAMS)
- .setTrustedHardwarePublicKey(PUBLIC_KEY)
- .build();
-
- writer.writeKeyChainSnapshot(snapshot);
-
- byte[] result = writer.getOutput();
-
- PersistentKeyChainSnapshot reader = new PersistentKeyChainSnapshot();
- reader.initReader(result);
-
- KeyChainSnapshot copy = reader.readKeyChainSnapshot();
- assertThat(copy.getSnapshotVersion()).isEqualTo(SNAPSHOT_VERSION);
- assertThat(copy.getKeyChainProtectionParams().get(0).getUserSecretType()).isEqualTo(1);
- assertThat(copy.getEncryptedRecoveryKeyBlob()).isEqualTo(RECOVERY_KEY_MATERIAL);
- assertThat(copy.getWrappedApplicationKeys().get(0).getAlias()).isEqualTo(ALIAS);
- assertThat(copy.getMaxAttempts()).isEqualTo(MAX_ATTEMPTS);
- assertThat(copy.getCounterId()).isEqualTo(COUNTER_ID);
- assertThat(copy.getServerParams()).isEqualTo(SERVER_PARAMS);
- assertThat(copy.getTrustedHardwarePublicKey()).isEqualTo(PUBLIC_KEY);
-
- assertThrows(
- IOException.class,
- () -> reader.readKeyChainSnapshot());
-
- verifyDeserialize(snapshot);
- }
-
- private void verifyDeserialize(KeyChainSnapshot snapshot) throws Exception {
- byte[] serialized = PersistentKeyChainSnapshot.serialize(snapshot);
- KeyChainSnapshot copy = PersistentKeyChainSnapshot.deserialize(serialized);
- assertThat(copy.getSnapshotVersion())
- .isEqualTo(snapshot.getSnapshotVersion());
- assertThat(copy.getKeyChainProtectionParams().size())
- .isEqualTo(copy.getKeyChainProtectionParams().size());
- assertThat(copy.getEncryptedRecoveryKeyBlob())
- .isEqualTo(snapshot.getEncryptedRecoveryKeyBlob());
- assertThat(copy.getWrappedApplicationKeys().size())
- .isEqualTo(snapshot.getWrappedApplicationKeys().size());
- assertThat(copy.getMaxAttempts()).isEqualTo(snapshot.getMaxAttempts());
- assertThat(copy.getCounterId()).isEqualTo(snapshot.getCounterId());
- assertThat(copy.getServerParams()).isEqualTo(snapshot.getServerParams());
- assertThat(copy.getTrustedHardwarePublicKey())
- .isEqualTo(snapshot.getTrustedHardwarePublicKey());
- }
-
- @Test
- public void testDeserialize_failsForNewerVersion() throws Exception {
- byte[] newVersion = new byte[]{(byte) 2, (byte) 0, (byte) 0, (byte) 0};
- assertThrows(
- IOException.class,
- () -> PersistentKeyChainSnapshot.deserialize(newVersion));
- }
-
- @Test
- public void testDeserialize_failsForEmptyData() throws Exception {
- byte[] empty = new byte[]{};
- assertThrows(
- IOException.class,
- () -> PersistentKeyChainSnapshot.deserialize(empty));
- }
-
-}
-
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java
index 999dce51bd9c..6f2237f1baef 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java
@@ -75,11 +75,11 @@ public class PrivacyUtilsTests {
Map<String, Boolean> result = PrivacyUtils.createDpEncodedReportMap(false, null,
TEST_DIGEST_LIST, TEST_AGGREGATED_RESULT1);
assertEquals(6, result.size());
- assertTrue(result.get("C86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB48"));
+ assertFalse(result.get("C86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB48"));
assertTrue(result.get("C86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB49"));
assertTrue(result.get("C86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB47"));
- assertFalse(result.get("E86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB45"));
- assertTrue(result.get("C86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB44"));
+ assertTrue(result.get("E86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB45"));
+ assertFalse(result.get("C86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB44"));
assertTrue(result.get("B86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB43"));
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
index 53d97e7957c8..ebb424806296 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -21,13 +21,12 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@@ -39,12 +38,13 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageParser;
import android.content.pm.PackageUserState;
import android.content.pm.UserInfo;
+import android.os.BaseBundle;
+import android.os.PersistableBundle;
import android.os.UserHandle;
import android.os.UserManagerInternal;
-import android.security.keystore.ArrayUtils;
import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
@@ -54,8 +54,8 @@ import com.android.internal.os.AtomicFile;
import com.android.server.LocalServices;
import com.android.server.pm.permission.PermissionManagerInternal;
import com.android.server.pm.permission.PermissionManagerService;
-import com.android.server.pm.permission.DefaultPermissionGrantPolicy.DefaultPermissionGrantedCallback;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -71,9 +71,9 @@ import java.util.List;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class PackageManagerSettingsTests {
- private static final String PACKAGE_NAME_2 = "com.google.app2";
+ private static final String PACKAGE_NAME_2 = "com.android.app2";
private static final String PACKAGE_NAME_3 = "com.android.app3";
- private static final String PACKAGE_NAME_1 = "com.google.app1";
+ private static final String PACKAGE_NAME_1 = "com.android.app1";
public static final String TAG = "PackageManagerSettingsTests";
protected final String PREFIX = "android.content.pm";
@@ -156,6 +156,92 @@ public class PackageManagerSettingsTests {
assertThat(ps.getEnabled(1), is(COMPONENT_ENABLED_STATE_DEFAULT));
}
+ private PersistableBundle getPersistableBundle(String packageName, long longVal,
+ double doubleVal, boolean boolVal, String textVal) {
+ final PersistableBundle bundle = new PersistableBundle();
+ bundle.putString(packageName + ".TEXT_VALUE", textVal);
+ bundle.putLong(packageName + ".LONG_VALUE", longVal);
+ bundle.putBoolean(packageName + ".BOOL_VALUE", boolVal);
+ bundle.putDouble(packageName + ".DOUBLE_VALUE", doubleVal);
+ return bundle;
+ }
+
+ @Test
+ public void testReadPackageRestrictions_oldSuspendInfo() {
+ writePackageRestrictions_oldSuspendInfoXml(0);
+ final Object lock = new Object();
+ final Context context = InstrumentationRegistry.getTargetContext();
+ final Settings settingsUnderTest = new Settings(context.getFilesDir(), null, lock);
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_1, createPackageSetting(PACKAGE_NAME_1));
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_2, createPackageSetting(PACKAGE_NAME_2));
+ settingsUnderTest.readPackageRestrictionsLPr(0);
+
+ final PackageSetting ps1 = settingsUnderTest.mPackages.get(PACKAGE_NAME_1);
+ final PackageUserState packageUserState1 = ps1.readUserState(0);
+ assertThat(packageUserState1.suspended, is(true));
+ assertThat("android".equals(packageUserState1.suspendingPackage), is(true));
+
+ final PackageSetting ps2 = settingsUnderTest.mPackages.get(PACKAGE_NAME_2);
+ final PackageUserState packageUserState2 = ps2.readUserState(0);
+ assertThat(packageUserState2.suspended, is(false));
+ assertThat(packageUserState2.suspendingPackage, is(nullValue()));
+ }
+
+ @Test
+ public void testReadWritePackageRestrictions_newSuspendInfo() {
+ final Context context = InstrumentationRegistry.getTargetContext();
+ final Settings settingsUnderTest = new Settings(context.getFilesDir(), null, new Object());
+ final PackageSetting ps1 = createPackageSetting(PACKAGE_NAME_1);
+ final PackageSetting ps2 = createPackageSetting(PACKAGE_NAME_2);
+ final PackageSetting ps3 = createPackageSetting(PACKAGE_NAME_3);
+
+ final PersistableBundle appExtras1 = getPersistableBundle(
+ PACKAGE_NAME_1, 1L, 0.01, true, "appString1");
+ final PersistableBundle launcherExtras1 = getPersistableBundle(
+ PACKAGE_NAME_1, 10L, 0.1, false, "launcherString1");
+ ps1.setSuspended(true, "suspendingPackage1", appExtras1, launcherExtras1, 0);
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_1, ps1);
+
+ ps2.setSuspended(true, "suspendingPackage2", null, null, 0);
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_2, ps2);
+
+ ps3.setSuspended(false, "irrelevant", null, null, 0);
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_3, ps3);
+
+ settingsUnderTest.writePackageRestrictionsLPr(0);
+
+ settingsUnderTest.mPackages.clear();
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_1, createPackageSetting(PACKAGE_NAME_1));
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_2, createPackageSetting(PACKAGE_NAME_2));
+ settingsUnderTest.mPackages.put(PACKAGE_NAME_3, createPackageSetting(PACKAGE_NAME_3));
+ // now read and verify
+ settingsUnderTest.readPackageRestrictionsLPr(0);
+ final PackageUserState readPus1 = settingsUnderTest.mPackages.get(PACKAGE_NAME_1).
+ readUserState(0);
+ assertThat(readPus1.suspended, is(true));
+ assertThat(readPus1.suspendingPackage, equalTo("suspendingPackage1"));
+ assertThat(BaseBundle.kindofEquals(readPus1.suspendedAppExtras, appExtras1), is(true));
+ assertThat(BaseBundle.kindofEquals(readPus1.suspendedLauncherExtras, launcherExtras1),
+ is(true));
+
+ final PackageUserState readPus2 = settingsUnderTest.mPackages.get(PACKAGE_NAME_2).
+ readUserState(0);
+ assertThat(readPus2.suspended, is(true));
+ assertThat(readPus2.suspendingPackage, equalTo("suspendingPackage2"));
+ assertThat(readPus2.suspendedAppExtras, is(nullValue()));
+ assertThat(readPus2.suspendedLauncherExtras, is(nullValue()));
+
+ final PackageUserState readPus3 = settingsUnderTest.mPackages.get(PACKAGE_NAME_3).
+ readUserState(0);
+ assertThat(readPus3.suspended, is(false));
+ }
+
+ @Test
+ public void testPackageRestrictionsSuspendedDefault() {
+ final PackageSetting defaultSetting = createPackageSetting(PACKAGE_NAME_1);
+ assertThat(defaultSetting.getSuspended(0), is(false));
+ }
+
@Test
public void testEnableDisable() {
// Write the package files and make sure they're parsed properly the first time
@@ -686,6 +772,26 @@ public class PackageManagerSettingsTests {
null /*usesStaticLibrariesVersions*/);
}
+ private PackageSetting createPackageSetting(String packageName) {
+ return new PackageSetting(
+ packageName,
+ packageName,
+ INITIAL_CODE_PATH /*codePath*/,
+ INITIAL_CODE_PATH /*resourcePath*/,
+ null /*legacyNativeLibraryPathString*/,
+ "x86_64" /*primaryCpuAbiString*/,
+ "x86" /*secondaryCpuAbiString*/,
+ null /*cpuAbiOverrideString*/,
+ INITIAL_VERSION_CODE,
+ 0,
+ 0 /*privateFlags*/,
+ null /*parentPackageName*/,
+ null /*childPackageNames*/,
+ 0,
+ null /*usesStaticLibraries*/,
+ null /*usesStaticLibrariesVersions*/);
+ }
+
private @NonNull List<UserInfo> createFakeUsers() {
ArrayList<UserInfo> users = new ArrayList<>();
users.add(new UserInfo(UserHandle.USER_SYSTEM, "test user", UserInfo.FLAG_INITIALIZED));
@@ -718,13 +824,13 @@ public class PackageManagerSettingsTests {
+ "<item name=\"android.permission.ACCESS_WIMAX_STATE\" package=\"android\" />"
+ "<item name=\"android.permission.REBOOT\" package=\"android\" protection=\"18\" />"
+ "</permissions>"
- + "<package name=\"com.google.app1\" codePath=\"/system/app/app1.apk\" nativeLibraryPath=\"/data/data/com.google.app1/lib\" flags=\"1\" ft=\"1360e2caa70\" it=\"135f2f80d08\" ut=\"1360e2caa70\" version=\"1109\" sharedUserId=\"11000\">"
+ + "<package name=\"com.android.app1\" codePath=\"/system/app/app1.apk\" nativeLibraryPath=\"/data/data/com.android.app1/lib\" flags=\"1\" ft=\"1360e2caa70\" it=\"135f2f80d08\" ut=\"1360e2caa70\" version=\"1109\" sharedUserId=\"11000\">"
+ "<sigs count=\"1\">"
+ "<cert index=\"0\" key=\"" + KeySetStrings.ctsKeySetCertA + "\" />"
+ "</sigs>"
+ "<proper-signing-keyset identifier=\"1\" />"
+ "</package>"
- + "<package name=\"com.google.app2\" codePath=\"/system/app/app2.apk\" nativeLibraryPath=\"/data/data/com.google.app2/lib\" flags=\"1\" ft=\"1360e578718\" it=\"135f2f80d08\" ut=\"1360e578718\" version=\"15\" enabled=\"3\" userId=\"11001\">"
+ + "<package name=\"com.android.app2\" codePath=\"/system/app/app2.apk\" nativeLibraryPath=\"/data/data/com.android.app2/lib\" flags=\"1\" ft=\"1360e578718\" it=\"135f2f80d08\" ut=\"1360e578718\" version=\"15\" enabled=\"3\" userId=\"11001\">"
+ "<sigs count=\"1\">"
+ "<cert index=\"0\" />"
+ "</sigs>"
@@ -774,11 +880,26 @@ public class PackageManagerSettingsTests {
+ "</packages>").getBytes());
}
+ private void writePackageRestrictions_oldSuspendInfoXml(final int userId) {
+ writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/users/"
+ + userId + "/package-restrictions.xml"),
+ ( "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ + "<package-restrictions>\n"
+ + " <pkg name=\"" + PACKAGE_NAME_1 + "\" suspended=\"true\" />"
+ + " <pkg name=\"" + PACKAGE_NAME_2 + "\" suspended=\"false\" />"
+ + " <preferred-activities />\n"
+ + " <persistent-preferred-activities />\n"
+ + " <crossProfile-intent-filters />\n"
+ + " <default-apps />\n"
+ + "</package-restrictions>\n")
+ .getBytes());
+ }
+
private void writeStoppedPackagesXml() {
writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages-stopped.xml"),
( "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
+ "<stopped-packages>"
- + "<pkg name=\"com.google.app1\" nl=\"1\" />"
+ + "<pkg name=\"com.android.app1\" nl=\"1\" />"
+ "<pkg name=\"com.android.app3\" nl=\"1\" />"
+ "</stopped-packages>")
.getBytes());
@@ -786,8 +907,8 @@ public class PackageManagerSettingsTests {
private void writePackagesList() {
writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages.list"),
- ( "com.google.app1 11000 0 /data/data/com.google.app1 seinfo1"
- + "com.google.app2 11001 0 /data/data/com.google.app2 seinfo2"
+ ( "com.android.app1 11000 0 /data/data/com.android.app1 seinfo1"
+ + "com.android.app2 11001 0 /data/data/com.android.app2 seinfo2"
+ "com.android.app3 11030 0 /data/data/com.android.app3 seinfo3")
.getBytes());
}
@@ -828,6 +949,11 @@ public class PackageManagerSettingsTests {
});
}
+ @After
+ public void tearDown() throws Exception {
+ deleteFolder(InstrumentationRegistry.getTargetContext().getFilesDir());
+ }
+
private void verifyKeySetMetaData(Settings settings)
throws ReflectiveOperationException, IllegalAccessException {
ArrayMap<String, PackageSetting> packages = settings.mPackages;
@@ -871,9 +997,9 @@ public class PackageManagerSettingsTests {
assertThat(KeySetUtils.getLastIssuedKeySetId(ksms), is(4L));
/* verify packages have been given the appropriate information */
- PackageSetting ps = packages.get("com.google.app1");
+ PackageSetting ps = packages.get("com.android.app1");
assertThat(ps.keySetData.getProperSigningKeySet(), is(1L));
- ps = packages.get("com.google.app2");
+ ps = packages.get("com.android.app2");
assertThat(ps.keySetData.getProperSigningKeySet(), is(1L));
assertThat(ps.keySetData.getAliases().get("AB"), is(4L));
ps = packages.get("com.android.app3");
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
index 50be8dbd16a8..4e1418c7a6e4 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
@@ -23,8 +23,9 @@ import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import android.content.pm.PackageUserState;
+import android.os.PersistableBundle;
+import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.ArraySet;
import org.junit.Test;
@@ -170,4 +171,44 @@ public class PackageUserStateTest {
testUserState03.enabledComponents.add("com.android.unit_test_04");
assertThat(testUserState03.equals(oldUserState), is(false));
}
+
+ @Test
+ public void testPackageUserState05() {
+ PersistableBundle appExtras1 = new PersistableBundle();
+ PersistableBundle appExtras2 = new PersistableBundle();
+ appExtras1.putInt("appExtraId", 1);
+ appExtras2.putInt("appExtraId", 2);
+ PersistableBundle launcherExtras1 = new PersistableBundle();
+ PersistableBundle launcherExtras2 = new PersistableBundle();
+ launcherExtras1.putString("name", "launcherExtras1");
+ launcherExtras2.putString("name", "launcherExtras2");
+ final String suspendingPackage1 = "package1";
+ final String suspendingPackage2 = "package2";
+
+ final PackageUserState testUserState1 = new PackageUserState();
+ testUserState1.suspended = true;
+ testUserState1.suspendedAppExtras = appExtras1;
+ testUserState1.suspendedLauncherExtras = launcherExtras1;
+ testUserState1.suspendingPackage = suspendingPackage1;
+
+ final PackageUserState testUserState2 = new PackageUserState(testUserState1);
+ assertThat(testUserState1.equals(testUserState2), is(true));
+ testUserState2.suspendingPackage = suspendingPackage2;
+ assertThat(testUserState1.equals(testUserState2), is(false));
+
+ testUserState2.suspendingPackage = testUserState1.suspendingPackage;
+ testUserState2.suspendedAppExtras = appExtras2;
+ assertThat(testUserState1.equals(testUserState2), is(false));
+
+ testUserState2.suspendedAppExtras = testUserState1.suspendedAppExtras;
+ testUserState2.suspendedLauncherExtras = launcherExtras2;
+ assertThat(testUserState1.equals(testUserState2), is(false));
+
+ // Everything is different but irrelevant if suspended is false
+ testUserState2.suspended = testUserState1.suspended = false;
+ testUserState2.suspendedAppExtras = appExtras2;
+ testUserState2.suspendingPackage = suspendingPackage2;
+ assertThat(testUserState1.equals(testUserState2), is(true));
+ }
+
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
new file mode 100644
index 000000000000..d702318761d1
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.BaseBundle;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PersistableBundle;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.servicestests.apps.suspendtestapp.SuspendTestReceiver;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class SuspendPackagesTest {
+ private static final String TEST_APP_PACKAGE_NAME = SuspendTestReceiver.PACKAGE_NAME;
+ private static final String[] PACKAGES_TO_SUSPEND = new String[]{TEST_APP_PACKAGE_NAME};
+
+ private Context mContext;
+ private PackageManager mPackageManager;
+ private Handler mReceiverHandler;
+ private ComponentName mTestReceiverComponent;
+
+ @Before
+ public void setUp() {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mPackageManager = mContext.getPackageManager();
+ mPackageManager.setPackagesSuspended(PACKAGES_TO_SUSPEND, false, null, null, null);
+ mReceiverHandler = new Handler(Looper.getMainLooper());
+ mTestReceiverComponent = new ComponentName(TEST_APP_PACKAGE_NAME,
+ SuspendTestReceiver.class.getCanonicalName());
+ }
+
+ private Bundle requestAppAction(String action) throws InterruptedException {
+ final AtomicReference<Bundle> result = new AtomicReference<>();
+ final CountDownLatch receiverLatch = new CountDownLatch(1);
+
+ final Intent broadcastIntent = new Intent(action)
+ .setComponent(mTestReceiverComponent)
+ .setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ mContext.sendOrderedBroadcast(broadcastIntent, null, new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ result.set(getResultExtras(true));
+ receiverLatch.countDown();
+ }
+ }, mReceiverHandler, 0, null, null);
+
+ assertTrue("Test receiver timed out ", receiverLatch.await(5, TimeUnit.SECONDS));
+ return result.get();
+ }
+
+ private PersistableBundle getExtras(String keyPrefix, long lval, String sval, double dval) {
+ final PersistableBundle extras = new PersistableBundle(3);
+ extras.putLong(keyPrefix + ".LONG_VALUE", lval);
+ extras.putDouble(keyPrefix + ".DOUBLE_VALUE", dval);
+ extras.putString(keyPrefix + ".STRING_VALUE", sval);
+ return extras;
+ }
+
+ private void suspendTestPackage(PersistableBundle appExtras, PersistableBundle launcherExtras) {
+ final String[] unchangedPackages = mPackageManager.setPackagesSuspended(
+ PACKAGES_TO_SUSPEND, true, appExtras, launcherExtras, null);
+ assertTrue("setPackagesSuspended returned non-empty list", unchangedPackages.length == 0);
+ }
+
+ @Test
+ public void testIsPackageSuspended() {
+ suspendTestPackage(null, null);
+ assertTrue("isPackageSuspended is false",
+ mPackageManager.isPackageSuspended(TEST_APP_PACKAGE_NAME));
+ }
+
+ @Test
+ public void testSuspendedStateFromApp() throws Exception {
+ Bundle resultFromApp = requestAppAction(SuspendTestReceiver.ACTION_GET_SUSPENDED_STATE);
+ assertFalse(resultFromApp.getBoolean(SuspendTestReceiver.EXTRA_SUSPENDED, true));
+ assertNull(resultFromApp.getParcelable(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
+
+ final PersistableBundle appExtras = getExtras("appExtras", 20, "20", 0.2);
+ suspendTestPackage(appExtras, null);
+
+ resultFromApp = requestAppAction(SuspendTestReceiver.ACTION_GET_SUSPENDED_STATE);
+ assertTrue("resultFromApp:suspended is false",
+ resultFromApp.getBoolean(SuspendTestReceiver.EXTRA_SUSPENDED));
+ final PersistableBundle receivedAppExtras =
+ resultFromApp.getParcelable(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS);
+ receivedAppExtras.get(""); // hack to unparcel the bundles
+ appExtras.get("");
+ assertTrue("Received app extras " + receivedAppExtras + " different to the ones supplied",
+ BaseBundle.kindofEquals(appExtras, receivedAppExtras));
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index edf1f746fb4b..552c915f8480 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -17,6 +17,8 @@
package com.android.server.usage;
import static android.app.usage.UsageEvents.Event.NOTIFICATION_SEEN;
+import static android.app.usage.UsageEvents.Event.SLICE_PINNED;
+import static android.app.usage.UsageEvents.Event.SLICE_PINNED_PRIV;
import static android.app.usage.UsageEvents.Event.USER_INTERACTION;
import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT;
import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED;
@@ -406,6 +408,30 @@ public class AppStandbyControllerTests {
}
@Test
+ public void testSlicePinnedEvent() throws Exception {
+ setChargingState(mController, false);
+
+ reportEvent(mController, USER_INTERACTION, 0);
+ assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
+ mInjector.mElapsedRealtime = 1;
+ reportEvent(mController, SLICE_PINNED, mInjector.mElapsedRealtime);
+ assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
+
+ mController.forceIdleState(PACKAGE_1, USER_ID, true);
+ reportEvent(mController, SLICE_PINNED, mInjector.mElapsedRealtime);
+ assertEquals(STANDBY_BUCKET_WORKING_SET, getStandbyBucket(mController));
+ }
+
+ @Test
+ public void testSlicePinnedPrivEvent() throws Exception {
+ setChargingState(mController, false);
+
+ mController.forceIdleState(PACKAGE_1, USER_ID, true);
+ reportEvent(mController, SLICE_PINNED_PRIV, mInjector.mElapsedRealtime);
+ assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
+ }
+
+ @Test
public void testPredictionTimedout() throws Exception {
setChargingState(mController, false);
// Set it to timeout or usage, so that prediction can override it
diff --git a/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java b/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java
new file mode 100644
index 000000000000..8b78f10b0b5b
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.wm;
+
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.FlakyTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Tests for the {@link TaskStack} class.
+ *
+ * Build/Install/Run:
+ * atest FrameworksServicesTests:com.android.server.wm.AnimatingAppWindowTokenRegistryTest
+ */
+@SmallTest
+@Presubmit
+@FlakyTest(detail = "Promote once confirmed non-flaky")
+@RunWith(AndroidJUnit4.class)
+public class AnimatingAppWindowTokenRegistryTest extends WindowTestsBase {
+
+ @Mock
+ AnimationAdapter mAdapter;
+
+ @Mock
+ Runnable mMockEndDeferFinishCallback1;
+ @Mock
+ Runnable mMockEndDeferFinishCallback2;
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testDeferring() throws Exception {
+ final AppWindowToken window1 = createAppWindowToken(mDisplayContent,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ final AppWindowToken window2 = createAppWindow(window1.getTask(), ACTIVITY_TYPE_STANDARD,
+ "window2").mAppToken;
+ final AnimatingAppWindowTokenRegistry registry =
+ window1.getStack().getAnimatingAppWindowTokenRegistry();
+
+ window1.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */);
+ window2.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */);
+ assertTrue(window1.isSelfAnimating());
+ assertTrue(window2.isSelfAnimating());
+
+ // Make sure that first animation finish is deferred, second one is not deferred, and first
+ // one gets cancelled.
+ assertTrue(registry.notifyAboutToFinish(window1, mMockEndDeferFinishCallback1));
+ assertFalse(registry.notifyAboutToFinish(window2, mMockEndDeferFinishCallback2));
+ verify(mMockEndDeferFinishCallback1).run();
+ verifyZeroInteractions(mMockEndDeferFinishCallback2);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index 4f49a4ae6467..b645700abb79 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -31,7 +31,10 @@ import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
import static com.android.server.wm.WindowContainer.POSITION_TOP;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -457,6 +460,18 @@ public class DisplayContentTests extends WindowTestsBase {
SCREEN_ORIENTATION_LANDSCAPE, dc.getOrientation());
}
+ @Test
+ public void testDisableDisplayInfoOverrideFromWindowManager() {
+ final DisplayContent dc = createNewDisplay();
+
+ assertTrue(dc.mShouldOverrideDisplayConfiguration);
+ sWm.dontOverrideDisplayInfo(dc.getDisplayId());
+
+ assertFalse(dc.mShouldOverrideDisplayConfiguration);
+ verify(sWm.mDisplayManagerInternal, times(1))
+ .setDisplayInfoOverrideFromWindowManager(dc.getDisplayId(), null);
+ }
+
private static void verifySizes(DisplayContent displayContent, int expectedBaseWidth,
int expectedBaseHeight, int expectedBaseDensity) {
assertEquals(displayContent.mBaseDisplayWidth, expectedBaseWidth);
diff --git a/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
index 26a7313b71d8..64501e49a9a8 100644
--- a/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
@@ -68,6 +68,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
super.setUp();
MockitoAnnotations.initMocks(this);
mAdapter = new RemoteAnimationAdapter(mMockRunner, 100, 50);
+ mAdapter.setCallingPid(123);
sWm.mH.runWithScissors(() -> {
mHandler = new TestHandler(null, mClock);
}, 0);
@@ -83,7 +84,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
new Point(50, 100), new Rect(50, 100, 150, 150));
adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
mController.goodToGo();
-
+ sWm.mAnimator.executeAfterPrepareSurfacesRunnables();
final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
@@ -167,4 +168,33 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
mController.goodToGo();
verifyZeroInteractions(mMockRunner);
}
+
+ @Test
+ public void testNotReallyStarted() throws Exception {
+ final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
+ mController.createAnimationAdapter(win.mAppToken,
+ new Point(50, 100), new Rect(50, 100, 150, 150));
+ mController.goodToGo();
+ verifyZeroInteractions(mMockRunner);
+ }
+
+ @Test
+ public void testOneNotStarted() throws Exception {
+ final WindowState win1 = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin1");
+ final WindowState win2 = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin2");
+ mController.createAnimationAdapter(win1.mAppToken,
+ new Point(50, 100), new Rect(50, 100, 150, 150));
+ final AnimationAdapter adapter = mController.createAnimationAdapter(win2.mAppToken,
+ new Point(50, 100), new Rect(50, 100, 150, 150));
+ adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
+ mController.goodToGo();
+ sWm.mAnimator.executeAfterPrepareSurfacesRunnables();
+ final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
+ ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
+ final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
+ ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
+ verify(mMockRunner).onAnimationStart(appsCaptor.capture(), finishedCaptor.capture());
+ assertEquals(1, appsCaptor.getValue().length);
+ assertEquals(mMockLeash, appsCaptor.getValue()[0].leash);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java
index a120eba623a3..16b84581de39 100644
--- a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java
@@ -28,6 +28,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.SurfaceControl;
@@ -64,6 +65,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
private SurfaceSession mSession = new SurfaceSession();
private MyAnimatable mAnimatable;
private MyAnimatable mAnimatable2;
+ private DeferFinishAnimatable mDeferFinishAnimatable;
@Before
public void setUp() throws Exception {
@@ -71,6 +73,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
MockitoAnnotations.initMocks(this);
mAnimatable = new MyAnimatable();
mAnimatable2 = new MyAnimatable();
+ mDeferFinishAnimatable = new DeferFinishAnimatable();
}
@Test
@@ -131,6 +134,7 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
verifyZeroInteractions(mSpec);
assertAnimating(mAnimatable);
+ assertTrue(mAnimatable.mSurfaceAnimator.isAnimationStartDelayed());
mAnimatable.mSurfaceAnimator.endDelayingAnimationStart();
verify(mSpec).startAnimation(any(), any(), any());
}
@@ -166,6 +170,29 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
verify(mTransaction).destroy(eq(leash));
}
+ @Test
+ @FlakyTest(detail = "Promote once confirmed non-flaky")
+ public void testDeferFinish() throws Exception {
+
+ // Start animation
+ mDeferFinishAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec,
+ true /* hidden */);
+ final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
+ OnAnimationFinishedCallback.class);
+ assertAnimating(mDeferFinishAnimatable);
+ verify(mSpec).startAnimation(any(), any(), callbackCaptor.capture());
+
+ // Finish the animation but then make sure we are deferring.
+ callbackCaptor.getValue().onAnimationFinished(mSpec);
+ assertAnimating(mDeferFinishAnimatable);
+
+ // Now end defer finishing.
+ mDeferFinishAnimatable.endDeferFinishCallback.run();
+ assertNotAnimating(mAnimatable2);
+ assertTrue(mDeferFinishAnimatable.mFinishedCallbackCalled);
+ verify(mTransaction).destroy(eq(mDeferFinishAnimatable.mLeash));
+ }
+
private void assertAnimating(MyAnimatable animatable) {
assertTrue(animatable.mSurfaceAnimator.isAnimating());
assertNotNull(animatable.mSurfaceAnimator.getAnimation());
@@ -254,4 +281,15 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
private final Runnable mFinishedCallback = () -> mFinishedCallbackCalled = true;
}
+
+ private class DeferFinishAnimatable extends MyAnimatable {
+
+ Runnable endDeferFinishCallback;
+
+ @Override
+ public boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
+ this.endDeferFinishCallback = endDeferFinishCallback;
+ return true;
+ }
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java
index a3ade1ea754c..50852548f525 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java
@@ -36,7 +36,7 @@ import android.support.test.runner.AndroidJUnit4;
import android.util.proto.ProtoOutputStream;
import com.android.internal.util.Preconditions;
-import com.android.server.wm.proto.WindowManagerTraceProto;
+import com.android.server.wm.WindowManagerTraceProto;
import org.junit.After;
import org.junit.Before;
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk b/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
new file mode 100644
index 000000000000..40a34b945f44
--- /dev/null
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
@@ -0,0 +1,30 @@
+# 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+
+LOCAL_COMPATIBILITY_SUITE := device-tests
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := SuspendTestApp
+LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE) \ No newline at end of file
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml b/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
new file mode 100644
index 000000000000..70a1fd0e6430
--- /dev/null
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?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.servicestests.apps.suspendtestapp">
+
+ <application>
+ <activity android:name=".SuspendTestActivity"
+ android:exported="true" />
+ <receiver android:name=".SuspendTestReceiver"
+ android:exported="true" />
+ </application>
+
+</manifest> \ No newline at end of file
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestActivity.java b/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestActivity.java
new file mode 100644
index 000000000000..fa5fc5863a0e
--- /dev/null
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestActivity.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.servicestests.apps.suspendtestapp;
+
+import android.app.Activity;
+
+public class SuspendTestActivity extends Activity {
+ private static final String TAG = SuspendTestActivity.class.getSimpleName();
+
+} \ No newline at end of file
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestReceiver.java b/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestReceiver.java
new file mode 100644
index 000000000000..6f353a008bea
--- /dev/null
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestReceiver.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.servicestests.apps.suspendtestapp;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.util.Log;
+
+public class SuspendTestReceiver extends BroadcastReceiver {
+ private static final String TAG = SuspendTestReceiver.class.getSimpleName();
+
+ public static final String PACKAGE_NAME = "com.android.servicestests.apps.suspendtestapp";
+ public static final String ACTION_GET_SUSPENDED_STATE =
+ PACKAGE_NAME + ".action.GET_SUSPENDED_STATE";
+ public static final String EXTRA_SUSPENDED = PACKAGE_NAME + ".extra.SUSPENDED";
+ public static final String EXTRA_SUSPENDED_APP_EXTRAS =
+ PACKAGE_NAME + ".extra.SUSPENDED_APP_EXTRAS";
+
+ private PackageManager mPm;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mPm = context.getPackageManager();
+ Log.d(TAG, "Received request action " + intent.getAction());
+ switch (intent.getAction()) {
+ case ACTION_GET_SUSPENDED_STATE:
+ final Bundle result = new Bundle();
+ final boolean suspended = mPm.isPackageSuspended();
+ final PersistableBundle appExtras = mPm.getSuspendedPackageAppExtras();
+ result.putBoolean(EXTRA_SUSPENDED, suspended);
+ result.putParcelable(EXTRA_SUSPENDED_APP_EXTRAS, appExtras);
+ setResult(0, null, result);
+ break;
+ default:
+ Log.e(TAG, "Unknown action: " + intent.getAction());
+ }
+ }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
index f4313b80c520..181fcebbb536 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
@@ -70,6 +70,7 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
assertEquals(getSnoozeCriteria(key, i), ranking.getSnoozeCriteria());
assertEquals(getShowBadge(i), ranking.canShowBadge());
assertEquals(getUserSentiment(i), ranking.getUserSentiment());
+ assertEquals(getHidden(i), ranking.isSuspended());
}
}
@@ -85,6 +86,7 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
Bundle showBadge = new Bundle();
int[] importance = new int[mKeys.length];
Bundle userSentiment = new Bundle();
+ Bundle mHidden = new Bundle();
for (int i = 0; i < mKeys.length; i++) {
String key = mKeys[i];
@@ -101,11 +103,12 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
snoozeCriteria.putParcelableArrayList(key, getSnoozeCriteria(key, i));
showBadge.putBoolean(key, getShowBadge(i));
userSentiment.putInt(key, getUserSentiment(i));
+ mHidden.putBoolean(key, getHidden(i));
}
NotificationRankingUpdate update = new NotificationRankingUpdate(mKeys,
interceptedKeys.toArray(new String[0]), visibilityOverrides,
suppressedVisualEffects, importance, explanation, overrideGroupKeys,
- channels, overridePeople, snoozeCriteria, showBadge, userSentiment);
+ channels, overridePeople, snoozeCriteria, showBadge, userSentiment, mHidden);
return update;
}
@@ -153,6 +156,10 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
return USER_SENTIMENT_NEUTRAL;
}
+ private boolean getHidden(int index) {
+ return index % 2 == 0;
+ }
+
private ArrayList<String> getPeople(String key, int index) {
ArrayList<String> people = new ArrayList<>();
for (int i = 0; i < index; i++) {
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 4fe54b9f15ef..b82becd64f65 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -68,6 +68,7 @@ import android.app.Notification.MessagingStyle.Message;
import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
import android.app.NotificationManager;
+import android.app.usage.UsageStatsManagerInternal;
import android.companion.ICompanionDeviceManager;
import android.content.ComponentName;
import android.content.Context;
@@ -264,7 +265,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mPackageManager, mPackageManagerClient, mockLightsManager,
mListeners, mAssistants, mConditionProviders,
mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager,
- mGroupHelper, mAm);
+ mGroupHelper, mAm, mock(UsageStatsManagerInternal.class));
} catch (SecurityException e) {
if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
throw e;
@@ -2662,4 +2663,120 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
assertEquals(expected, actual);
}
+
+ @Test
+ public void testVisualDifference_diffTitle() {
+ Notification.Builder nb1 = new Notification.Builder(mContext, "")
+ .setContentTitle("foo");
+ StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ nb1.build(), new UserHandle(mUid), null, 0);
+ NotificationRecord r1 =
+ new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
+
+ Notification.Builder nb2 = new Notification.Builder(mContext, "")
+ .setContentTitle("bar");
+ StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ nb2.build(), new UserHandle(mUid), null, 0);
+ NotificationRecord r2 =
+ new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
+
+ assertTrue(mService.isVisuallyInterruptive(r1, r2));
+ }
+
+ @Test
+ public void testVisualDifference_diffText() {
+ Notification.Builder nb1 = new Notification.Builder(mContext, "")
+ .setContentText("foo");
+ StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ nb1.build(), new UserHandle(mUid), null, 0);
+ NotificationRecord r1 =
+ new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
+
+ Notification.Builder nb2 = new Notification.Builder(mContext, "")
+ .setContentText("bar");
+ StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ nb2.build(), new UserHandle(mUid), null, 0);
+ NotificationRecord r2 =
+ new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
+
+ assertTrue(mService.isVisuallyInterruptive(r1, r2));
+ }
+
+ @Test
+ public void testVisualDifference_diffProgress() {
+ Notification.Builder nb1 = new Notification.Builder(mContext, "")
+ .setProgress(100, 90, false);
+ StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ nb1.build(), new UserHandle(mUid), null, 0);
+ NotificationRecord r1 =
+ new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
+
+ Notification.Builder nb2 = new Notification.Builder(mContext, "")
+ .setProgress(100, 100, false);
+ StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ nb2.build(), new UserHandle(mUid), null, 0);
+ NotificationRecord r2 =
+ new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
+
+ assertTrue(mService.isVisuallyInterruptive(r1, r2));
+ }
+
+ @Test
+ public void testVisualDifference_diffProgressNotDone() {
+ Notification.Builder nb1 = new Notification.Builder(mContext, "")
+ .setProgress(100, 90, false);
+ StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ nb1.build(), new UserHandle(mUid), null, 0);
+ NotificationRecord r1 =
+ new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
+
+ Notification.Builder nb2 = new Notification.Builder(mContext, "")
+ .setProgress(100, 91, false);
+ StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ nb2.build(), new UserHandle(mUid), null, 0);
+ NotificationRecord r2 =
+ new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
+
+ assertFalse(mService.isVisuallyInterruptive(r1, r2));
+ }
+
+ @Test
+ public void testHideAndUnhideNotificationsOnSuspendedPackageBroadcast() {
+ // post 2 notification from this package
+ final NotificationRecord notif1 = generateNotificationRecord(
+ mTestNotificationChannel, 1, null, true);
+ final NotificationRecord notif2 = generateNotificationRecord(
+ mTestNotificationChannel, 2, null, false);
+ mService.addNotification(notif1);
+ mService.addNotification(notif2);
+
+ // on broadcast, hide the 2 notifications
+ mService.simulatePackageSuspendBroadcast(true, PKG);
+ ArgumentCaptor<List> captorHide = ArgumentCaptor.forClass(List.class);
+ verify(mListeners, times(1)).notifyHiddenLocked(captorHide.capture());
+ assertEquals(2, captorHide.getValue().size());
+
+ // on broadcast, unhide the 2 notifications
+ mService.simulatePackageSuspendBroadcast(false, PKG);
+ ArgumentCaptor<List> captorUnhide = ArgumentCaptor.forClass(List.class);
+ verify(mListeners, times(1)).notifyUnhiddenLocked(captorUnhide.capture());
+ assertEquals(2, captorUnhide.getValue().size());
+ }
+
+ @Test
+ public void testNoNotificationsHiddenOnSuspendedPackageBroadcast() {
+ // post 2 notification from this package
+ final NotificationRecord notif1 = generateNotificationRecord(
+ mTestNotificationChannel, 1, null, true);
+ final NotificationRecord notif2 = generateNotificationRecord(
+ mTestNotificationChannel, 2, null, false);
+ mService.addNotification(notif1);
+ mService.addNotification(notif2);
+
+ // on broadcast, nothing is hidden since no notifications are of package "test_package"
+ mService.simulatePackageSuspendBroadcast(true, "test_package");
+ ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
+ verify(mListeners, times(1)).notifyHiddenLocked(captor.capture());
+ assertEquals(0, captor.getValue().size());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
index 4bfb2362988e..0f2e56b83f75 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
@@ -20,18 +20,27 @@ import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.app.Notification;
+import android.app.Notification.Person;
+import android.app.PendingIntent;
+import android.app.RemoteInput;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.graphics.Bitmap;
import android.graphics.Color;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
import android.os.Build;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.widget.RemoteViews;
import com.android.server.UiServiceTestCase;
@@ -112,5 +121,294 @@ public class NotificationTest extends UiServiceTestCase {
assertEquals(Color.RED, new Notification.CarExtender(before).getColor());
assertEquals("dismiss", new Notification.WearableExtender(before).getDismissalId());
}
+
+ @Test
+ public void testStyleChangeVisiblyDifferent_noStyles() {
+ Notification.Builder n1 = new Notification.Builder(mContext, "test");
+ Notification.Builder n2 = new Notification.Builder(mContext, "test");
+
+ assertFalse(Notification.areStyledNotificationsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testStyleChangeVisiblyDifferent_noStyleToStyle() {
+ Notification.Builder n1 = new Notification.Builder(mContext, "test");
+ Notification.Builder n2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.BigTextStyle());
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testStyleChangeVisiblyDifferent_styleToNoStyle() {
+ Notification.Builder n2 = new Notification.Builder(mContext, "test");
+ Notification.Builder n1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.BigTextStyle());
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testStyleChangeVisiblyDifferent_changeStyle() {
+ Notification.Builder n1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.InboxStyle());
+ Notification.Builder n2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.BigTextStyle());
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testInboxTextChange() {
+ Notification.Builder nInbox1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.InboxStyle().addLine("a").addLine("b"));
+ Notification.Builder nInbox2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.InboxStyle().addLine("b").addLine("c"));
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nInbox1, nInbox2));
+ }
+
+ @Test
+ public void testBigTextTextChange() {
+ Notification.Builder nBigText1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.BigTextStyle().bigText("something"));
+ Notification.Builder nBigText2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.BigTextStyle().bigText("else"));
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nBigText1, nBigText2));
+ }
+
+ @Test
+ public void testBigPictureChange() {
+ Notification.Builder nBigPic1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.BigPictureStyle().bigPicture(mock(Bitmap.class)));
+ Notification.Builder nBigPic2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.BigPictureStyle().bigPicture(mock(Bitmap.class)));
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nBigPic1, nBigPic2));
+ }
+
+ @Test
+ public void testMessagingChange_text() {
+ Notification.Builder nM1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message(
+ "a", 100, mock(Notification.Person.class))));
+ Notification.Builder nM2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message(
+ "a", 100, mock(Notification.Person.class)))
+ .addMessage(new Notification.MessagingStyle.Message(
+ "b", 100, mock(Notification.Person.class)))
+ );
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
+ }
+
+ @Test
+ public void testMessagingChange_data() {
+ Notification.Builder nM1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message(
+ "a", 100, mock(Person.class))
+ .setData("text", mock(Uri.class))));
+ Notification.Builder nM2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message(
+ "a", 100, mock(Person.class))));
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
+ }
+
+ @Test
+ public void testMessagingChange_sender() {
+ Person a = mock(Person.class);
+ when(a.getName()).thenReturn("A");
+ Person b = mock(Person.class);
+ when(b.getName()).thenReturn("b");
+ Notification.Builder nM1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message("a", 100, b)));
+ Notification.Builder nM2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message("a", 100, a)));
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
+ }
+
+ @Test
+ public void testMessagingChange_key() {
+ Person a = mock(Person.class);
+ when(a.getKey()).thenReturn("A");
+ Person b = mock(Person.class);
+ when(b.getKey()).thenReturn("b");
+ Notification.Builder nM1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message("a", 100, a)));
+ Notification.Builder nM2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message("a", 100, b)));
+
+ assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
+ }
+
+ @Test
+ public void testMessagingChange_ignoreTimeChange() {
+ Notification.Builder nM1 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message(
+ "a", 100, mock(Notification.Person.class))));
+ Notification.Builder nM2 = new Notification.Builder(mContext, "test")
+ .setStyle(new Notification.MessagingStyle("")
+ .addMessage(new Notification.MessagingStyle.Message(
+ "a", 1000, mock(Notification.Person.class)))
+ );
+
+ assertFalse(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
+ }
+
+ @Test
+ public void testRemoteViews_nullChange() {
+ Notification.Builder n1 = new Notification.Builder(mContext, "test")
+ .setContent(mock(RemoteViews.class));
+ Notification.Builder n2 = new Notification.Builder(mContext, "test");
+ assertTrue(Notification.areRemoteViewsChanged(n1, n2));
+
+ n1 = new Notification.Builder(mContext, "test");
+ n2 = new Notification.Builder(mContext, "test")
+ .setContent(mock(RemoteViews.class));
+ assertTrue(Notification.areRemoteViewsChanged(n1, n2));
+
+ n1 = new Notification.Builder(mContext, "test")
+ .setCustomBigContentView(mock(RemoteViews.class));
+ n2 = new Notification.Builder(mContext, "test");
+ assertTrue(Notification.areRemoteViewsChanged(n1, n2));
+
+ n1 = new Notification.Builder(mContext, "test");
+ n2 = new Notification.Builder(mContext, "test")
+ .setCustomBigContentView(mock(RemoteViews.class));
+ assertTrue(Notification.areRemoteViewsChanged(n1, n2));
+
+ n1 = new Notification.Builder(mContext, "test");
+ n2 = new Notification.Builder(mContext, "test");
+ assertFalse(Notification.areRemoteViewsChanged(n1, n2));
+ }
+
+ @Test
+ public void testActionsDifferent_null() {
+ Notification n1 = new Notification.Builder(mContext, "test")
+ .build();
+ Notification n2 = new Notification.Builder(mContext, "test")
+ .build();
+
+ assertFalse(Notification.areActionsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testActionsDifferentSame() {
+ PendingIntent intent = mock(PendingIntent.class);
+ Icon icon = mock(Icon.class);
+
+ Notification n1 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
+ .build();
+ Notification n2 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
+ .build();
+
+ assertFalse(Notification.areActionsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testActionsDifferentText() {
+ PendingIntent intent = mock(PendingIntent.class);
+ Icon icon = mock(Icon.class);
+
+ Notification n1 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
+ .build();
+ Notification n2 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 2", intent).build())
+ .build();
+
+ assertTrue(Notification.areActionsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testActionsDifferentNumber() {
+ PendingIntent intent = mock(PendingIntent.class);
+ Icon icon = mock(Icon.class);
+
+ Notification n1 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
+ .build();
+ Notification n2 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
+ .addAction(new Notification.Action.Builder(icon, "TEXT 2", intent).build())
+ .build();
+
+ assertTrue(Notification.areActionsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testActionsDifferentIntent() {
+ PendingIntent intent1 = mock(PendingIntent.class);
+ PendingIntent intent2 = mock(PendingIntent.class);
+ Icon icon = mock(Icon.class);
+
+ Notification n1 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent1).build())
+ .build();
+ Notification n2 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent2).build())
+ .build();
+
+ assertFalse(Notification.areActionsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testActionsMoreOptionsThanChoices() {
+ PendingIntent intent1 = mock(PendingIntent.class);
+ PendingIntent intent2 = mock(PendingIntent.class);
+ Icon icon = mock(Icon.class);
+
+ Notification n1 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent1).build())
+ .addAction(new Notification.Action.Builder(icon, "TEXT 2", intent1)
+ .addRemoteInput(new RemoteInput.Builder("a")
+ .setChoices(new CharSequence[] {"i", "m"})
+ .build())
+ .build())
+ .build();
+ Notification n2 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent2).build())
+ .addAction(new Notification.Action.Builder(icon, "TEXT 2", intent1).build())
+ .build();
+
+ assertTrue(Notification.areActionsVisiblyDifferent(n1, n2));
+ }
+
+ @Test
+ public void testActionsDifferentRemoteInputs() {
+ PendingIntent intent = mock(PendingIntent.class);
+ Icon icon = mock(Icon.class);
+
+ Notification n1 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent)
+ .addRemoteInput(new RemoteInput.Builder("a")
+ .setChoices(new CharSequence[] {"i", "m"})
+ .build())
+ .build())
+ .build();
+ Notification n2 = new Notification.Builder(mContext, "test")
+ .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent)
+ .addRemoteInput(new RemoteInput.Builder("a")
+ .setChoices(new CharSequence[] {"t", "m"})
+ .build())
+ .build())
+ .build();
+
+ assertTrue(Notification.areActionsVisiblyDifferent(n1, n2));
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
index 4f446a9afb98..1073a800527a 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
import android.app.slice.SliceSpec;
+import android.app.usage.UsageStatsManagerInternal;
import android.content.pm.PackageManagerInternal;
import android.net.Uri;
import android.os.Binder;
@@ -66,6 +67,8 @@ public class SliceManagerServiceTest extends UiServiceTestCase {
@Before
public void setup() {
LocalServices.addService(PackageManagerInternal.class, mock(PackageManagerInternal.class));
+ LocalServices.addService(UsageStatsManagerInternal.class,
+ mock(UsageStatsManagerInternal.class));
mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
mContext.getTestablePermissions().setPermission(TEST_URI, PERMISSION_GRANTED);
@@ -77,6 +80,7 @@ public class SliceManagerServiceTest extends UiServiceTestCase {
@After
public void teardown() {
LocalServices.removeServiceForTest(PackageManagerInternal.class);
+ LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
}
@Test
diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java
index e836677e38fc..1af5f469c0f0 100644
--- a/services/usage/java/com/android/server/usage/AppStandbyController.java
+++ b/services/usage/java/com/android/server/usage/AppStandbyController.java
@@ -36,6 +36,7 @@ import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
+
import static com.android.server.SystemService.PHASE_BOOT_COMPLETED;
import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY;
@@ -43,8 +44,8 @@ import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AppGlobals;
import android.app.usage.AppStandbyInfo;
-import android.app.usage.UsageStatsManager.StandbyBuckets;
import android.app.usage.UsageEvents;
+import android.app.usage.UsageStatsManager.StandbyBuckets;
import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
@@ -100,7 +101,6 @@ import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -690,7 +690,9 @@ public class AppStandbyController {
|| event.mEventType == UsageEvents.Event.MOVE_TO_BACKGROUND
|| event.mEventType == UsageEvents.Event.SYSTEM_INTERACTION
|| event.mEventType == UsageEvents.Event.USER_INTERACTION
- || event.mEventType == UsageEvents.Event.NOTIFICATION_SEEN)) {
+ || event.mEventType == UsageEvents.Event.NOTIFICATION_SEEN
+ || event.mEventType == UsageEvents.Event.SLICE_PINNED
+ || event.mEventType == UsageEvents.Event.SLICE_PINNED_PRIV)) {
final AppUsageHistory appHistory = mAppIdleHistory.getAppUsageHistory(
event.mPackage, userId, elapsedRealtime);
@@ -699,7 +701,8 @@ public class AppStandbyController {
final long nextCheckTime;
final int subReason = usageEventToSubReason(event.mEventType);
final int reason = REASON_MAIN_USAGE | subReason;
- if (event.mEventType == UsageEvents.Event.NOTIFICATION_SEEN) {
+ if (event.mEventType == UsageEvents.Event.NOTIFICATION_SEEN
+ || event.mEventType == UsageEvents.Event.SLICE_PINNED) {
// Mild usage elevates to WORKING_SET but doesn't change usage time.
mAppIdleHistory.reportUsage(appHistory, event.mPackage,
STANDBY_BUCKET_WORKING_SET, subReason,
diff --git a/services/usage/java/com/android/server/usage/AppTimeLimitController.java b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
index 9cd05933d845..e20185114261 100644
--- a/services/usage/java/com/android/server/usage/AppTimeLimitController.java
+++ b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
@@ -71,16 +71,13 @@ public class AppTimeLimitController {
/** The time when the current app came to the foreground */
private long currentForegroundedTime;
- /** The last app that was in the background */
- private String lastBackgroundedPackage;
-
/** Map from package name for quick lookup */
private ArrayMap<String, ArrayList<TimeLimitGroup>> packageMap = new ArrayMap<>();
/** Map of observerId to details of the time limit group */
private SparseArray<TimeLimitGroup> groups = new SparseArray<>();
- UserData(@UserIdInt int userId) {
+ private UserData(@UserIdInt int userId) {
this.userId = userId;
}
}
@@ -114,7 +111,7 @@ public class AppTimeLimitController {
int userId;
}
- class MyHandler extends Handler {
+ private class MyHandler extends Handler {
static final int MSG_CHECK_TIMEOUT = 1;
static final int MSG_INFORM_LISTENER = 2;
@@ -151,7 +148,7 @@ public class AppTimeLimitController {
}
/** Returns an existing UserData object for the given userId, or creates one */
- UserData getOrCreateUserDataLocked(int userId) {
+ private UserData getOrCreateUserDataLocked(int userId) {
UserData userData = mUsers.get(userId);
if (userData == null) {
userData = new UserData(userId);
@@ -258,12 +255,6 @@ public class AppTimeLimitController {
user.currentForegroundedPackage = packageName;
user.currentForegroundedTime = getUptimeMillis();
- // Check if the last package that was backgrounded is the same as this one
- if (!TextUtils.equals(packageName, user.lastBackgroundedPackage)) {
- // TODO: Move this logic up to usage stats to persist there.
- incTotalLaunchesLocked(user, packageName);
- }
-
// Check if any of the groups need to watch for this package
maybeWatchForPackageLocked(user, packageName, user.currentForegroundedTime);
}
@@ -279,7 +270,6 @@ public class AppTimeLimitController {
public void moveToBackground(String packageName, String className, int userId) {
synchronized (mLock) {
UserData user = getOrCreateUserDataLocked(userId);
- user.lastBackgroundedPackage = packageName;
if (!TextUtils.equals(user.currentForegroundedPackage, packageName)) {
Slog.w(TAG, "Eh? Last foregrounded package = " + user.currentForegroundedPackage
+ " and now backgrounded = " + packageName);
@@ -433,10 +423,6 @@ public class AppTimeLimitController {
}
}
- private void incTotalLaunchesLocked(UserData user, String packageName) {
- // TODO: Inform UsageStatsService and aggregate the counter per app
- }
-
void dump(PrintWriter pw) {
synchronized (mLock) {
pw.println("\n App Time Limits");
@@ -457,7 +443,6 @@ public class AppTimeLimitController {
pw.println();
pw.print(" currentForegroundedPackage=");
pw.println(user.currentForegroundedPackage);
- pw.print(" lastBackgroundedPackage="); pw.println(user.lastBackgroundedPackage);
}
}
}
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index 4d458b027429..00826e057a86 100644
--- a/services/usage/java/com/android/server/usage/IntervalStats.java
+++ b/services/usage/java/com/android/server/usage/IntervalStats.java
@@ -166,6 +166,11 @@ class IntervalStats {
endTime = timeStamp;
}
+ void incrementAppLaunchCount(String packageName) {
+ UsageStats usageStats = getOrCreateUsageStats(packageName);
+ usageStats.mAppLaunchCount += 1;
+ }
+
private String getCachedStringRef(String str) {
final int index = mStringCache.indexOf(str);
if (index < 0) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index b144545c693a..b8317b470d01 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -21,6 +21,8 @@ import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.IUidObserver;
import android.app.PendingIntent;
+import android.app.admin.DeviceAdminInfo;
+import android.app.admin.DevicePolicyManagerInternal;
import android.app.usage.AppStandbyInfo;
import android.app.usage.ConfigurationStats;
import android.app.usage.IUsageStatsManager;
@@ -110,6 +112,7 @@ public class UsageStatsService extends SystemService implements
PackageManager mPackageManager;
PackageManagerInternal mPackageManagerInternal;
IDeviceIdleController mDeviceIdleController;
+ DevicePolicyManagerInternal mDpmInternal;
private final SparseArray<UserUsageStatsService> mUserState = new SparseArray<>();
private final SparseIntArray mUidToKernelCounter = new SparseIntArray();
@@ -117,8 +120,10 @@ public class UsageStatsService extends SystemService implements
long mRealTimeSnapshot;
long mSystemTimeSnapshot;
+ /** Manages the standby state of apps. */
AppStandbyController mAppStandby;
+ /** Manages app time limit observers */
AppTimeLimitController mAppTimeLimit;
private UsageStatsManagerInternal.AppIdleStateChangeListener mStandbyChangeListener =
@@ -151,6 +156,7 @@ public class UsageStatsService extends SystemService implements
mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
mPackageManager = getContext().getPackageManager();
mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
+ mDpmInternal = LocalServices.getService(DevicePolicyManagerInternal.class);
mHandler = new H(BackgroundThread.get().getLooper());
mAppStandby = new AppStandbyController(getContext(), BackgroundThread.get().getLooper());
@@ -647,6 +653,19 @@ public class UsageStatsService extends SystemService implements
return mode == AppOpsManager.MODE_ALLOWED;
}
+ private boolean hasObserverPermission(String callingPackage) {
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid == Process.SYSTEM_UID
+ || (mDpmInternal != null
+ && mDpmInternal.isActiveAdminWithPolicy(callingUid,
+ DeviceAdminInfo.USES_POLICY_PROFILE_OWNER))) {
+ // Caller is the system or the profile owner, so proceed.
+ return true;
+ }
+ return getContext().checkCallingPermission(Manifest.permission.OBSERVE_APP_USAGE)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
@Override
public ParceledListSlice<UsageStats> queryUsageStats(int bucketType, long beginTime,
long endTime, String callingPackage) {
@@ -821,8 +840,8 @@ public class UsageStatsService extends SystemService implements
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
- final boolean shellCaller = callingUid == 0 || callingUid == Process.SHELL_UID;
- final int reason = shellCaller
+ final boolean systemCaller = UserHandle.isCore(callingUid);
+ final int reason = systemCaller
? UsageStatsManager.REASON_MAIN_FORCED
: UsageStatsManager.REASON_MAIN_PREDICTED;
final long token = Binder.clearCallingIdentity();
@@ -963,8 +982,8 @@ public class UsageStatsService extends SystemService implements
public void registerAppUsageObserver(int observerId,
String[] packages, long timeLimitMs, PendingIntent
callbackIntent, String callingPackage) {
- if (!hasPermission(callingPackage)) {
- throw new SecurityException("Caller doesn't have PACKAGE_USAGE_STATS permission");
+ if (!hasObserverPermission(callingPackage)) {
+ throw new SecurityException("Caller doesn't have OBSERVE_APP_USAGE permission");
}
if (packages == null || packages.length == 0) {
@@ -989,8 +1008,8 @@ public class UsageStatsService extends SystemService implements
@Override
public void unregisterAppUsageObserver(int observerId, String callingPackage) {
- if (!hasPermission(callingPackage)) {
- throw new SecurityException("Caller doesn't have PACKAGE_USAGE_STATS permission");
+ if (!hasObserverPermission(callingPackage)) {
+ throw new SecurityException("Caller doesn't have OBSERVE_APP_USAGE permission");
}
final int callingUid = Binder.getCallingUid();
diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
index 5e7e80db410b..bcfc42169374 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
@@ -62,6 +62,7 @@ final class UsageStatsXmlV1 {
private static final String TYPE_ATTR = "type";
private static final String SHORTCUT_ID_ATTR = "shortcutId";
private static final String STANDBY_BUCKET_ATTR = "standbyBucket";
+ private static final String APP_LAUNCH_COUNT_ATTR = "appLaunchCount";
// Time attributes stored as an offset of the beginTime.
private static final String LAST_TIME_ACTIVE_ATTR = "lastTimeActive";
@@ -81,6 +82,7 @@ final class UsageStatsXmlV1 {
parser, LAST_TIME_ACTIVE_ATTR);
stats.mTotalTimeInForeground = XmlUtils.readLongAttribute(parser, TOTAL_TIME_ACTIVE_ATTR);
stats.mLastEvent = XmlUtils.readIntAttribute(parser, LAST_EVENT_ATTR);
+ stats.mAppLaunchCount = XmlUtils.readIntAttribute(parser, APP_LAUNCH_COUNT_ATTR, 0);
int eventCode;
while ((eventCode = parser.next()) != XmlPullParser.END_DOCUMENT) {
final String tag = parser.getName();
@@ -193,6 +195,9 @@ final class UsageStatsXmlV1 {
XmlUtils.writeStringAttribute(xml, PACKAGE_ATTR, usageStats.mPackageName);
XmlUtils.writeLongAttribute(xml, TOTAL_TIME_ACTIVE_ATTR, usageStats.mTotalTimeInForeground);
XmlUtils.writeIntAttribute(xml, LAST_EVENT_ATTR, usageStats.mLastEvent);
+ if (usageStats.mAppLaunchCount > 0) {
+ XmlUtils.writeIntAttribute(xml, APP_LAUNCH_COUNT_ATTR, usageStats.mAppLaunchCount);
+ }
writeChooserCounts(xml, usageStats);
xml.endTag(null, PACKAGE_TAG);
}
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index d9742825ac70..afc3d5924c4a 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -61,6 +61,7 @@ class UserUsageStatsService {
private final UnixCalendar mDailyExpiryDate;
private final StatsUpdatedListener mListener;
private final String mLogPrefix;
+ private String mLastBackgroundedPackage;
private final int mUserId;
private static final long[] INTERVAL_LENGTH = new long[] {
@@ -178,6 +179,17 @@ class UserUsageStatsService {
currentDailyStats.events.put(event.mTimeStamp, event);
}
+ boolean incrementAppLaunch = false;
+ if (event.mEventType == UsageEvents.Event.MOVE_TO_FOREGROUND) {
+ if (event.mPackage != null && !event.mPackage.equals(mLastBackgroundedPackage)) {
+ incrementAppLaunch = true;
+ }
+ } else if (event.mEventType == UsageEvents.Event.MOVE_TO_BACKGROUND) {
+ if (event.mPackage != null) {
+ mLastBackgroundedPackage = event.mPackage;
+ }
+ }
+
for (IntervalStats stats : mCurrentStats) {
if (event.mEventType == UsageEvents.Event.CONFIGURATION_CHANGE) {
stats.updateConfigurationStats(newFullConfig, event.mTimeStamp);
@@ -191,6 +203,9 @@ class UserUsageStatsService {
}
} else {
stats.update(event.mPackage, event.mTimeStamp, event.mEventType);
+ if (incrementAppLaunch) {
+ stats.incrementAppLaunchCount(event.mPackage);
+ }
}
}
@@ -649,6 +664,7 @@ class UserUsageStatsService {
pw.printPair("totalTime",
formatElapsedTime(usageStats.mTotalTimeInForeground, prettyDates));
pw.printPair("lastTime", formatDateTime(usageStats.mLastTimeUsed, prettyDates));
+ pw.printPair("appLaunchCount", usageStats.mAppLaunchCount);
pw.println();
}
pw.decreaseIndent();
@@ -761,6 +777,10 @@ class UserUsageStatsService {
return "STANDBY_BUCKET_CHANGED";
case UsageEvents.Event.NOTIFICATION_INTERRUPTION:
return "NOTIFICATION_INTERRUPTION";
+ case UsageEvents.Event.SLICE_PINNED:
+ return "SLICE_PINNED";
+ case UsageEvents.Event.SLICE_PINNED_PRIV:
+ return "SLICE_PINNED_PRIV";
default:
return "UNKNOWN";
}
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
index cd3fdeefee13..11609435205f 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
@@ -15,36 +15,68 @@
*/
package com.android.server.soundtrigger;
+
+import static android.Manifest.permission.BIND_SOUND_TRIGGER_DETECTION_SERVICE;
+import static android.content.Context.BIND_AUTO_CREATE;
+import static android.content.Context.BIND_FOREGROUND_SERVICE;
+import static android.content.pm.PackageManager.GET_META_DATA;
+import static android.content.pm.PackageManager.GET_SERVICES;
+import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
import static android.hardware.soundtrigger.SoundTrigger.STATUS_ERROR;
import static android.hardware.soundtrigger.SoundTrigger.STATUS_OK;
+import static android.provider.Settings.Global.MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY;
+import static android.provider.Settings.Global.SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT;
+
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+import android.Manifest;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.PendingIntent;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.ServiceConnection;
import android.content.pm.PackageManager;
-import android.Manifest;
+import android.content.pm.ResolveInfo;
import android.hardware.soundtrigger.IRecognitionStatusCallback;
import android.hardware.soundtrigger.SoundTrigger;
-import android.hardware.soundtrigger.SoundTrigger.SoundModel;
import android.hardware.soundtrigger.SoundTrigger.GenericSoundModel;
import android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel;
import android.hardware.soundtrigger.SoundTrigger.ModuleProperties;
import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig;
+import android.hardware.soundtrigger.SoundTrigger.SoundModel;
+import android.media.soundtrigger.ISoundTriggerDetectionService;
+import android.media.soundtrigger.ISoundTriggerDetectionServiceClient;
+import android.media.soundtrigger.SoundTriggerDetectionService;
import android.media.soundtrigger.SoundTriggerManager;
+import android.os.Binder;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
import android.os.Parcel;
import android.os.ParcelUuid;
import android.os.PowerManager;
import android.os.RemoteException;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Slog;
-import com.android.server.SystemService;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.ISoundTriggerService;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.Preconditions;
+import com.android.server.SystemService;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.ArrayList;
import java.util.TreeMap;
import java.util.UUID;
+import java.util.concurrent.TimeUnit;
/**
* A single SystemService to manage all sound/voice-based sound models on the DSP.
@@ -67,9 +99,13 @@ public class SoundTriggerService extends SystemService {
private SoundTriggerHelper mSoundTriggerHelper;
private final TreeMap<UUID, SoundModel> mLoadedModels;
private Object mCallbacksLock;
- private final TreeMap<UUID, LocalSoundTriggerRecognitionStatusCallback> mIntentCallbacks;
+ private final TreeMap<UUID, IRecognitionStatusCallback> mCallbacks;
private PowerManager.WakeLock mWakelock;
+ /** Number of ops run by the {@link RemoteSoundTriggerDetectionService} per package name */
+ @GuardedBy("mLock")
+ private final ArrayMap<String, NumOps> mNumOpsPerPackage = new ArrayMap<>();
+
public SoundTriggerService(Context context) {
super(context);
mContext = context;
@@ -77,7 +113,7 @@ public class SoundTriggerService extends SystemService {
mLocalSoundTriggerService = new LocalSoundTriggerService(context);
mLoadedModels = new TreeMap<UUID, SoundModel>();
mCallbacksLock = new Object();
- mIntentCallbacks = new TreeMap<UUID, LocalSoundTriggerRecognitionStatusCallback>();
+ mCallbacks = new TreeMap<>();
mLock = new Object();
}
@@ -214,7 +250,7 @@ public class SoundTriggerService extends SystemService {
if (oldModel != null && !oldModel.equals(soundModel)) {
mSoundTriggerHelper.unloadGenericSoundModel(soundModel.uuid);
synchronized (mCallbacksLock) {
- mIntentCallbacks.remove(soundModel.uuid);
+ mCallbacks.remove(soundModel.uuid);
}
}
mLoadedModels.put(soundModel.uuid, soundModel);
@@ -245,7 +281,7 @@ public class SoundTriggerService extends SystemService {
if (oldModel != null && !oldModel.equals(soundModel)) {
mSoundTriggerHelper.unloadKeyphraseSoundModel(soundModel.keyphrases[0].id);
synchronized (mCallbacksLock) {
- mIntentCallbacks.remove(soundModel.uuid);
+ mCallbacks.remove(soundModel.uuid);
}
}
mLoadedModels.put(soundModel.uuid, soundModel);
@@ -254,8 +290,28 @@ public class SoundTriggerService extends SystemService {
}
@Override
+ public int startRecognitionForService(ParcelUuid soundModelId, Bundle params,
+ ComponentName detectionService, SoundTrigger.RecognitionConfig config) {
+ Preconditions.checkNotNull(soundModelId);
+ Preconditions.checkNotNull(detectionService);
+ Preconditions.checkNotNull(config);
+
+ return startRecognitionForInt(soundModelId,
+ new RemoteSoundTriggerDetectionService(soundModelId.getUuid(),
+ params, detectionService, Binder.getCallingUserHandle(), config), config);
+
+ }
+
+ @Override
public int startRecognitionForIntent(ParcelUuid soundModelId, PendingIntent callbackIntent,
SoundTrigger.RecognitionConfig config) {
+ return startRecognitionForInt(soundModelId,
+ new LocalSoundTriggerRecognitionStatusIntentCallback(soundModelId.getUuid(),
+ callbackIntent, config), config);
+ }
+
+ private int startRecognitionForInt(ParcelUuid soundModelId,
+ IRecognitionStatusCallback callback, SoundTrigger.RecognitionConfig config) {
enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER);
if (!isInitialized()) return STATUS_ERROR;
if (DEBUG) {
@@ -268,27 +324,25 @@ public class SoundTriggerService extends SystemService {
Slog.e(TAG, soundModelId + " is not loaded");
return STATUS_ERROR;
}
- LocalSoundTriggerRecognitionStatusCallback callback = null;
+ IRecognitionStatusCallback existingCallback = null;
synchronized (mCallbacksLock) {
- callback = mIntentCallbacks.get(soundModelId.getUuid());
+ existingCallback = mCallbacks.get(soundModelId.getUuid());
}
- if (callback != null) {
+ if (existingCallback != null) {
Slog.e(TAG, soundModelId + " is already running");
return STATUS_ERROR;
}
- callback = new LocalSoundTriggerRecognitionStatusCallback(soundModelId.getUuid(),
- callbackIntent, config);
int ret;
switch (soundModel.type) {
case SoundModel.TYPE_KEYPHRASE: {
KeyphraseSoundModel keyphraseSoundModel = (KeyphraseSoundModel) soundModel;
ret = mSoundTriggerHelper.startKeyphraseRecognition(
- keyphraseSoundModel.keyphrases[0].id, keyphraseSoundModel, callback,
- config);
+ keyphraseSoundModel.keyphrases[0].id, keyphraseSoundModel, callback,
+ config);
} break;
case SoundModel.TYPE_GENERIC_SOUND:
ret = mSoundTriggerHelper.startGenericRecognition(soundModel.uuid,
- (GenericSoundModel) soundModel, callback, config);
+ (GenericSoundModel) soundModel, callback, config);
break;
default:
Slog.e(TAG, "Unknown model type");
@@ -300,7 +354,7 @@ public class SoundTriggerService extends SystemService {
return ret;
}
synchronized (mCallbacksLock) {
- mIntentCallbacks.put(soundModelId.getUuid(), callback);
+ mCallbacks.put(soundModelId.getUuid(), callback);
}
}
return STATUS_OK;
@@ -320,9 +374,9 @@ public class SoundTriggerService extends SystemService {
Slog.e(TAG, soundModelId + " is not loaded");
return STATUS_ERROR;
}
- LocalSoundTriggerRecognitionStatusCallback callback = null;
+ IRecognitionStatusCallback callback = null;
synchronized (mCallbacksLock) {
- callback = mIntentCallbacks.get(soundModelId.getUuid());
+ callback = mCallbacks.get(soundModelId.getUuid());
}
if (callback == null) {
Slog.e(TAG, soundModelId + " is not running");
@@ -347,7 +401,7 @@ public class SoundTriggerService extends SystemService {
return ret;
}
synchronized (mCallbacksLock) {
- mIntentCallbacks.remove(soundModelId.getUuid());
+ mCallbacks.remove(soundModelId.getUuid());
}
}
return STATUS_OK;
@@ -394,8 +448,7 @@ public class SoundTriggerService extends SystemService {
enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER);
if (!isInitialized()) return false;
synchronized (mCallbacksLock) {
- LocalSoundTriggerRecognitionStatusCallback callback =
- mIntentCallbacks.get(parcelUuid.getUuid());
+ IRecognitionStatusCallback callback = mCallbacks.get(parcelUuid.getUuid());
if (callback == null) {
return false;
}
@@ -404,13 +457,13 @@ public class SoundTriggerService extends SystemService {
}
}
- private final class LocalSoundTriggerRecognitionStatusCallback
+ private final class LocalSoundTriggerRecognitionStatusIntentCallback
extends IRecognitionStatusCallback.Stub {
private UUID mUuid;
private PendingIntent mCallbackIntent;
private RecognitionConfig mRecognitionConfig;
- public LocalSoundTriggerRecognitionStatusCallback(UUID modelUuid,
+ public LocalSoundTriggerRecognitionStatusIntentCallback(UUID modelUuid,
PendingIntent callbackIntent,
RecognitionConfig config) {
mUuid = modelUuid;
@@ -528,7 +581,7 @@ public class SoundTriggerService extends SystemService {
private void removeCallback(boolean releaseWakeLock) {
mCallbackIntent = null;
synchronized (mCallbacksLock) {
- mIntentCallbacks.remove(mUuid);
+ mCallbacks.remove(mUuid);
if (releaseWakeLock) {
mWakelock.release();
}
@@ -536,6 +589,478 @@ public class SoundTriggerService extends SystemService {
}
}
+ /**
+ * Counts the number of operations added in the last 24 hours.
+ */
+ private static class NumOps {
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ private int[] mNumOps = new int[24];
+ @GuardedBy("mLock")
+ private long mLastOpsHourSinceBoot;
+
+ /**
+ * Clear buckets of new hours that have elapsed since last operation.
+ *
+ * <p>I.e. when the last operation was triggered at 1:40 and the current operation was
+ * triggered at 4:03, the buckets "2, 3, and 4" are cleared.
+ *
+ * @param currentTime Current elapsed time since boot in ns
+ */
+ void clearOldOps(long currentTime) {
+ synchronized (mLock) {
+ long numHoursSinceBoot = TimeUnit.HOURS.convert(currentTime, TimeUnit.NANOSECONDS);
+
+ // Clear buckets of new hours that have elapsed since last operation
+ // I.e. when the last operation was triggered at 1:40 and the current
+ // operation was triggered at 4:03, the bucket "2, 3, and 4" is cleared
+ if (mLastOpsHourSinceBoot != 0) {
+ for (long hour = mLastOpsHourSinceBoot + 1; hour <= numHoursSinceBoot; hour++) {
+ mNumOps[(int) (hour % 24)] = 0;
+ }
+ }
+ }
+ }
+
+ /**
+ * Add a new operation.
+ *
+ * @param currentTime Current elapsed time since boot in ns
+ */
+ void addOp(long currentTime) {
+ synchronized (mLock) {
+ long numHoursSinceBoot = TimeUnit.HOURS.convert(currentTime, TimeUnit.NANOSECONDS);
+
+ mNumOps[(int) (numHoursSinceBoot % 24)]++;
+ mLastOpsHourSinceBoot = numHoursSinceBoot;
+ }
+ }
+
+ /**
+ * Get the total operations added in the last 24 hours.
+ *
+ * @return The total number of operations added in the last 24 hours
+ */
+ int getOpsAdded() {
+ synchronized (mLock) {
+ int totalOperationsInLastDay = 0;
+ for (int i = 0; i < 24; i++) {
+ totalOperationsInLastDay += mNumOps[i];
+ }
+
+ return totalOperationsInLastDay;
+ }
+ }
+ }
+
+ private interface Operation {
+ void run(int opId, ISoundTriggerDetectionService service) throws RemoteException;
+ }
+
+ /**
+ * Local end for a {@link SoundTriggerDetectionService}. Operations are queued up and executed
+ * when the service connects.
+ *
+ * <p>If operations take too long they are forcefully aborted.
+ *
+ * <p>This also limits the amount of operations in 24 hours.
+ */
+ private class RemoteSoundTriggerDetectionService
+ extends IRecognitionStatusCallback.Stub implements ServiceConnection {
+ private static final int MSG_STOP_ALL_PENDING_OPERATIONS = 1;
+
+ private final Object mRemoteServiceLock = new Object();
+
+ /** UUID of the model the service is started for */
+ private final @NonNull ParcelUuid mPuuid;
+ /** Params passed into the start method for the service */
+ private final @Nullable Bundle mParams;
+ /** Component name passed when starting the service */
+ private final @NonNull ComponentName mServiceName;
+ /** User that started the service */
+ private final @NonNull UserHandle mUser;
+ /** Configuration of the recognition the service is handling */
+ private final @NonNull RecognitionConfig mRecognitionConfig;
+ /** Wake lock keeping the remote service alive */
+ private final @NonNull PowerManager.WakeLock mRemoteServiceWakeLock;
+
+ private final @NonNull Handler mHandler;
+
+ /** Callbacks that are called by the service */
+ private final @NonNull ISoundTriggerDetectionServiceClient mClient;
+
+ /** Operations that are pending because the service is not yet connected */
+ @GuardedBy("mRemoteServiceLock")
+ private final ArrayList<Operation> mPendingOps = new ArrayList<>();
+ /** Operations that have been send to the service but have no yet finished */
+ @GuardedBy("mRemoteServiceLock")
+ private final ArraySet<Integer> mRunningOpIds = new ArraySet<>();
+ /** The number of operations executed in each of the last 24 hours */
+ private final NumOps mNumOps;
+
+ /** The service binder if connected */
+ @GuardedBy("mRemoteServiceLock")
+ private @Nullable ISoundTriggerDetectionService mService;
+ /** Whether the service has been bound */
+ @GuardedBy("mRemoteServiceLock")
+ private boolean mIsBound;
+ /** Whether the service has been destroyed */
+ @GuardedBy("mRemoteServiceLock")
+ private boolean mIsDestroyed;
+ /**
+ * Set once a final op is scheduled. No further ops can be added and the service is
+ * destroyed once the op finishes.
+ */
+ @GuardedBy("mRemoteServiceLock")
+ private boolean mDestroyOnceRunningOpsDone;
+
+ /** Total number of operations performed by this service */
+ @GuardedBy("mRemoteServiceLock")
+ private int mNumTotalOpsPerformed;
+
+ /**
+ * Create a new remote sound trigger detection service. This only binds to the service when
+ * operations are in flight. Each operation has a certain time it can run. Once no
+ * operations are allowed to run anymore, {@link #stopAllPendingOperations() all operations
+ * are aborted and stopped} and the service is disconnected.
+ *
+ * @param modelUuid The UUID of the model the recognition is for
+ * @param params The params passed to each method of the service
+ * @param serviceName The component name of the service
+ * @param user The user of the service
+ * @param config The configuration of the recognition
+ */
+ public RemoteSoundTriggerDetectionService(@NonNull UUID modelUuid,
+ @Nullable Bundle params, @NonNull ComponentName serviceName, @NonNull UserHandle user,
+ @NonNull RecognitionConfig config) {
+ mPuuid = new ParcelUuid(modelUuid);
+ mParams = params;
+ mServiceName = serviceName;
+ mUser = user;
+ mRecognitionConfig = config;
+ mHandler = new Handler(Looper.getMainLooper());
+
+ PowerManager pm = ((PowerManager) mContext.getSystemService(Context.POWER_SERVICE));
+ mRemoteServiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+ "RemoteSoundTriggerDetectionService " + mServiceName.getPackageName() + ":"
+ + mServiceName.getClassName());
+
+ synchronized (mLock) {
+ NumOps numOps = mNumOpsPerPackage.get(mServiceName.getPackageName());
+ if (numOps == null) {
+ numOps = new NumOps();
+ mNumOpsPerPackage.put(mServiceName.getPackageName(), numOps);
+ }
+ mNumOps = numOps;
+ }
+
+ mClient = new ISoundTriggerDetectionServiceClient.Stub() {
+ @Override
+ public void onOpFinished(int opId) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ synchronized (mRemoteServiceLock) {
+ mRunningOpIds.remove(opId);
+
+ if (mRunningOpIds.isEmpty() && mPendingOps.isEmpty()) {
+ if (mDestroyOnceRunningOpsDone) {
+ destroy();
+ } else {
+ disconnectLocked();
+ }
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+ };
+ }
+
+ @Override
+ public boolean pingBinder() {
+ return !(mIsDestroyed || mDestroyOnceRunningOpsDone);
+ }
+
+ /**
+ * Disconnect from the service, but allow to re-connect when new operations are triggered.
+ */
+ private void disconnectLocked() {
+ if (mService != null) {
+ try {
+ mService.removeClient(mPuuid);
+ } catch (Exception e) {
+ Slog.e(TAG, mPuuid + ": Cannot remove client", e);
+ }
+
+ mService = null;
+ }
+
+ if (mIsBound) {
+ mContext.unbindService(RemoteSoundTriggerDetectionService.this);
+ mIsBound = false;
+
+ synchronized (mCallbacksLock) {
+ mRemoteServiceWakeLock.release();
+ }
+ }
+ }
+
+ /**
+ * Disconnect, do not allow to reconnect to the service. All further operations will be
+ * dropped.
+ */
+ private void destroy() {
+ if (DEBUG) Slog.v(TAG, mPuuid + ": destroy");
+
+ synchronized (mRemoteServiceLock) {
+ disconnectLocked();
+
+ mIsDestroyed = true;
+ }
+
+ // The callback is removed before the flag is set
+ if (!mDestroyOnceRunningOpsDone) {
+ synchronized (mCallbacksLock) {
+ mCallbacks.remove(mPuuid.getUuid());
+ }
+ }
+ }
+
+ /**
+ * Stop all pending operations and then disconnect for the service.
+ */
+ private void stopAllPendingOperations() {
+ synchronized (mRemoteServiceLock) {
+ if (mIsDestroyed) {
+ return;
+ }
+
+ if (mService != null) {
+ int numOps = mRunningOpIds.size();
+ for (int i = 0; i < numOps; i++) {
+ try {
+ mService.onStopOperation(mPuuid, mRunningOpIds.valueAt(i));
+ } catch (Exception e) {
+ Slog.e(TAG, mPuuid + ": Could not stop operation "
+ + mRunningOpIds.valueAt(i), e);
+ }
+ }
+
+ mRunningOpIds.clear();
+ }
+
+ disconnectLocked();
+ }
+ }
+
+ /**
+ * Verify that the service has the expected properties and then bind to the service
+ */
+ private void bind() {
+ long token = Binder.clearCallingIdentity();
+ try {
+ Intent i = new Intent();
+ i.setComponent(mServiceName);
+
+ ResolveInfo ri = mContext.getPackageManager().resolveServiceAsUser(i,
+ GET_SERVICES | GET_META_DATA | MATCH_DEBUG_TRIAGED_MISSING,
+ mUser.getIdentifier());
+
+ if (ri == null) {
+ Slog.w(TAG, mPuuid + ": " + mServiceName + " not found");
+ return;
+ }
+
+ if (!BIND_SOUND_TRIGGER_DETECTION_SERVICE
+ .equals(ri.serviceInfo.permission)) {
+ Slog.w(TAG, mPuuid + ": " + mServiceName + " does not require "
+ + BIND_SOUND_TRIGGER_DETECTION_SERVICE);
+ return;
+ }
+
+ mIsBound = mContext.bindServiceAsUser(i, this,
+ BIND_AUTO_CREATE | BIND_FOREGROUND_SERVICE, mUser);
+
+ if (mIsBound) {
+ mRemoteServiceWakeLock.acquire();
+ } else {
+ Slog.w(TAG, mPuuid + ": Could not bind to " + mServiceName);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * Run an operation (i.e. send it do the service). If the service is not connected, this
+ * binds the service and then runs the operation once connected.
+ *
+ * @param op The operation to run
+ */
+ private void runOrAddOperation(Operation op) {
+ synchronized (mRemoteServiceLock) {
+ if (mIsDestroyed || mDestroyOnceRunningOpsDone) {
+ return;
+ }
+
+ if (mService == null) {
+ mPendingOps.add(op);
+
+ if (!mIsBound) {
+ bind();
+ }
+ } else {
+ long currentTime = System.nanoTime();
+ mNumOps.clearOldOps(currentTime);
+
+ // Drop operation if too many were executed in the last 24 hours.
+ int opsAllowed = Settings.Global.getInt(mContext.getContentResolver(),
+ MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY,
+ Integer.MAX_VALUE);
+
+ int opsAdded = mNumOps.getOpsAdded();
+ if (mNumOps.getOpsAdded() >= opsAllowed) {
+ if (DEBUG || opsAllowed + 10 > opsAdded) {
+ Slog.w(TAG, mPuuid + ": Dropped operation as too many operations were "
+ + "run in last 24 hours");
+ }
+ return;
+ }
+
+ mNumOps.addOp(currentTime);
+
+ // Find a free opID
+ int opId = mNumTotalOpsPerformed;
+ do {
+ mNumTotalOpsPerformed++;
+ } while (mRunningOpIds.contains(opId));
+
+ // Run OP
+ try {
+ if (DEBUG) Slog.v(TAG, mPuuid + ": runOp " + opId);
+
+ op.run(opId, mService);
+ mRunningOpIds.add(opId);
+ } catch (Exception e) {
+ Slog.e(TAG, mPuuid + ": Could not run operation " + opId, e);
+ }
+
+ // Unbind from service if no operations are left (i.e. if the operation failed)
+ if (mPendingOps.isEmpty() && mRunningOpIds.isEmpty()) {
+ if (mDestroyOnceRunningOpsDone) {
+ destroy();
+ } else {
+ disconnectLocked();
+ }
+ } else {
+ mHandler.removeMessages(MSG_STOP_ALL_PENDING_OPERATIONS);
+ mHandler.sendMessageDelayed(obtainMessage(
+ RemoteSoundTriggerDetectionService::stopAllPendingOperations, this)
+ .setWhat(MSG_STOP_ALL_PENDING_OPERATIONS),
+ Settings.Global.getLong(mContext.getContentResolver(),
+ SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT,
+ Long.MAX_VALUE));
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onKeyphraseDetected(SoundTrigger.KeyphraseRecognitionEvent event) {
+ Slog.w(TAG, mPuuid + "->" + mServiceName + ": IGNORED onKeyphraseDetected(" + event
+ + ")");
+ }
+
+ @Override
+ public void onGenericSoundTriggerDetected(SoundTrigger.GenericRecognitionEvent event) {
+ if (DEBUG) Slog.v(TAG, mPuuid + ": Generic sound trigger event: " + event);
+
+ runOrAddOperation((opId, service) -> {
+ if (!mRecognitionConfig.allowMultipleTriggers) {
+ synchronized (mCallbacksLock) {
+ mCallbacks.remove(mPuuid.getUuid());
+ }
+ mDestroyOnceRunningOpsDone = true;
+ }
+
+ service.onGenericRecognitionEvent(mPuuid, opId, event);
+ });
+ }
+
+ @Override
+ public void onError(int status) {
+ if (DEBUG) Slog.v(TAG, mPuuid + ": onError: " + status);
+
+ runOrAddOperation((opId, service) -> {
+ synchronized (mCallbacksLock) {
+ mCallbacks.remove(mPuuid.getUuid());
+ }
+ mDestroyOnceRunningOpsDone = true;
+
+ service.onError(mPuuid, opId, status);
+ });
+ }
+
+ @Override
+ public void onRecognitionPaused() {
+ Slog.i(TAG, mPuuid + "->" + mServiceName + ": IGNORED onRecognitionPaused");
+ }
+
+ @Override
+ public void onRecognitionResumed() {
+ Slog.i(TAG, mPuuid + "->" + mServiceName + ": IGNORED onRecognitionResumed");
+ }
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ if (DEBUG) Slog.v(TAG, mPuuid + ": onServiceConnected(" + service + ")");
+
+ synchronized (mRemoteServiceLock) {
+ mService = ISoundTriggerDetectionService.Stub.asInterface(service);
+
+ try {
+ mService.setClient(mPuuid, mParams, mClient);
+ } catch (Exception e) {
+ Slog.e(TAG, mPuuid + ": Could not init " + mServiceName, e);
+ return;
+ }
+
+ while (!mPendingOps.isEmpty()) {
+ runOrAddOperation(mPendingOps.remove(0));
+ }
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ if (DEBUG) Slog.v(TAG, mPuuid + ": onServiceDisconnected");
+
+ synchronized (mRemoteServiceLock) {
+ mService = null;
+ }
+ }
+
+ @Override
+ public void onBindingDied(ComponentName name) {
+ if (DEBUG) Slog.v(TAG, mPuuid + ": onBindingDied");
+
+ synchronized (mRemoteServiceLock) {
+ destroy();
+ }
+ }
+
+ @Override
+ public void onNullBinding(ComponentName name) {
+ Slog.w(TAG, name + " for model " + mPuuid + " returned a null binding");
+
+ synchronized (mRemoteServiceLock) {
+ disconnectLocked();
+ }
+ }
+ }
+
private void grabWakeLock() {
synchronized (mCallbacksLock) {
if (mWakelock == null) {
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 73243d2ebada..1c0e260bef5f 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -881,7 +881,7 @@ public final class Call {
*/
@IntDef(prefix = { "HANDOVER_" },
value = {HANDOVER_FAILURE_DEST_APP_REJECTED, HANDOVER_FAILURE_NOT_SUPPORTED,
- HANDOVER_FAILURE_USER_REJECTED, HANDOVER_FAILURE_ONGOING_EMERG_CALL,
+ HANDOVER_FAILURE_USER_REJECTED, HANDOVER_FAILURE_ONGOING_EMERGENCY_CALL,
HANDOVER_FAILURE_UNKNOWN})
@Retention(RetentionPolicy.SOURCE)
public @interface HandoverFailureErrors {}
@@ -939,7 +939,7 @@ public final class Call {
* For more information on call handovers, see
* {@link #handoverTo(PhoneAccountHandle, int, Bundle)}.
*/
- public static final int HANDOVER_FAILURE_ONGOING_EMERG_CALL = 4;
+ public static final int HANDOVER_FAILURE_ONGOING_EMERGENCY_CALL = 4;
/**
* Handover failure reason returned via {@link #onHandoverFailed(Call, int)} when a handover
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index eebe2a196c66..c79eec081349 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -2227,7 +2227,9 @@ public class CarrierConfigManager {
/**
* Gets the configuration values for a particular subscription, which is associated with a
* specific SIM card. If an invalid subId is used, the returned config will contain default
- * values.
+ * values. After using this method to get the configuration bundle,
+ * {@link #isConfigForIdentifiedCarrier(PersistableBundle)} should be called to confirm whether
+ * any carrier specific configuration has been applied.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
@@ -2254,7 +2256,9 @@ public class CarrierConfigManager {
}
/**
- * Gets the configuration values for the default subscription.
+ * Gets the configuration values for the default subscription. After using this method to get
+ * the configuration bundle, {@link #isConfigForIdentifiedCarrier(PersistableBundle)} should be
+ * called to confirm whether any carrier specific configuration has been applied.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
@@ -2283,6 +2287,9 @@ public class CarrierConfigManager {
* <p>
* After using {@link #getConfig()} or {@link #getConfigForSubId(int)} an app should always
* use this method to confirm whether any carrier specific configuration has been applied.
+ * Especially when an app misses the broadcast {@link #ACTION_CARRIER_CONFIG_CHANGED} but it
+ * still needs to get the current configuration, it must use this method to verify whether the
+ * configuration is default or carrier overridden.
* </p>
*
* @param bundle the configuration bundle to be checked.
diff --git a/telephony/java/android/telephony/CellIdentityTdscdma.java b/telephony/java/android/telephony/CellIdentityTdscdma.java
index 992545d62408..7475c74ea70c 100644
--- a/telephony/java/android/telephony/CellIdentityTdscdma.java
+++ b/telephony/java/android/telephony/CellIdentityTdscdma.java
@@ -16,6 +16,7 @@
package android.telephony;
+import android.annotation.Nullable;
import android.os.Parcel;
import android.text.TextUtils;
@@ -34,6 +35,10 @@ public final class CellIdentityTdscdma extends CellIdentity {
private final int mCid;
// 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown.
private final int mCpid;
+ // long alpha Operator Name String or Enhanced Operator Name String
+ private final String mAlphaLong;
+ // short alpha Operator Name String or Enhanced Operator Name String
+ private final String mAlphaShort;
/**
* @hide
@@ -43,6 +48,8 @@ public final class CellIdentityTdscdma extends CellIdentity {
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
mCpid = Integer.MAX_VALUE;
+ mAlphaLong = null;
+ mAlphaShort = null;
}
/**
@@ -55,7 +62,7 @@ public final class CellIdentityTdscdma extends CellIdentity {
* @hide
*/
public CellIdentityTdscdma(int mcc, int mnc, int lac, int cid, int cpid) {
- this(String.valueOf(mcc), String.valueOf(mnc), lac, cid, cpid);
+ this(String.valueOf(mcc), String.valueOf(mnc), lac, cid, cpid, null, null);
}
/**
@@ -65,6 +72,7 @@ public final class CellIdentityTdscdma extends CellIdentity {
* @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
* @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
*
+ * FIXME: This is a temporary constructor to facilitate migration.
* @hide
*/
public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid) {
@@ -72,10 +80,34 @@ public final class CellIdentityTdscdma extends CellIdentity {
mLac = lac;
mCid = cid;
mCpid = cpid;
+ mAlphaLong = null;
+ mAlphaShort = null;
+ }
+
+ /**
+ * @param mcc 3-digit Mobile Country Code in string format
+ * @param mnc 2 or 3-digit Mobile Network Code in string format
+ * @param lac 16-bit Location Area Code, 0..65535, INT_MAX if unknown
+ * @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
+ * @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
+ * @param alphal long alpha Operator Name String or Enhanced Operator Name String
+ * @param alphas short alpha Operator Name String or Enhanced Operator Name String
+ *
+ * @hide
+ */
+ public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid,
+ String alphal, String alphas) {
+ super(TAG, TYPE_TDSCDMA, mcc, mnc);
+ mLac = lac;
+ mCid = cid;
+ mCpid = cpid;
+ mAlphaLong = alphal;
+ mAlphaShort = alphas;
}
private CellIdentityTdscdma(CellIdentityTdscdma cid) {
- this(cid.mMccStr, cid.mMncStr, cid.mLac, cid.mCid, cid.mCpid);
+ this(cid.mMccStr, cid.mMncStr, cid.mLac, cid.mCid,
+ cid.mCpid, cid.mAlphaLong, cid.mAlphaShort);
}
CellIdentityTdscdma copy() {
@@ -119,9 +151,31 @@ public final class CellIdentityTdscdma extends CellIdentity {
return mCpid;
}
+ /**
+ * @return The long alpha tag associated with the current scan result (may be the operator
+ * name string or extended operator name string). May be null if unknown.
+ *
+ * @hide
+ */
+ @Nullable
+ public CharSequence getOperatorAlphaLong() {
+ return mAlphaLong;
+ }
+
+ /**
+ * @return The short alpha tag associated with the current scan result (may be the operator
+ * name string or extended operator name string). May be null if unknown.
+ *
+ * @hide
+ */
+ @Nullable
+ public CharSequence getOperatorAlphaShort() {
+ return mAlphaShort;
+ }
+
@Override
public int hashCode() {
- return Objects.hash(mMccStr, mMncStr, mLac, mCid, mCpid);
+ return Objects.hash(mMccStr, mMncStr, mLac, mCid, mCpid, mAlphaLong, mAlphaShort);
}
@Override
@@ -139,7 +193,9 @@ public final class CellIdentityTdscdma extends CellIdentity {
&& TextUtils.equals(mMncStr, o.mMncStr)
&& mLac == o.mLac
&& mCid == o.mCid
- && mCpid == o.mCpid;
+ && mCpid == o.mCpid
+ && mAlphaLong == o.mAlphaLong
+ && mAlphaShort == o.mAlphaShort;
}
@Override
@@ -150,6 +206,8 @@ public final class CellIdentityTdscdma extends CellIdentity {
.append(" mLac=").append(mLac)
.append(" mCid=").append(mCid)
.append(" mCpid=").append(mCpid)
+ .append(" mAlphaLong=").append(mAlphaLong)
+ .append(" mAlphaShort=").append(mAlphaShort)
.append("}").toString();
}
@@ -161,6 +219,8 @@ public final class CellIdentityTdscdma extends CellIdentity {
dest.writeInt(mLac);
dest.writeInt(mCid);
dest.writeInt(mCpid);
+ dest.writeString(mAlphaLong);
+ dest.writeString(mAlphaShort);
}
/** Construct from Parcel, type has already been processed */
@@ -169,6 +229,8 @@ public final class CellIdentityTdscdma extends CellIdentity {
mLac = in.readInt();
mCid = in.readInt();
mCpid = in.readInt();
+ mAlphaLong = in.readString();
+ mAlphaShort = in.readString();
if (DBG) log(toString());
}
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 9c831b9be0dd..e971d08aae7a 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -17,7 +17,6 @@
package android.telephony;
import android.annotation.IntDef;
-import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Bundle;
@@ -496,9 +495,8 @@ public class ServiceState implements Parcelable {
*
* @return Current serving cell bandwidths
*/
- @Nullable
public int[] getCellBandwidths() {
- return mCellBandwidths;
+ return mCellBandwidths == null ? new int[0] : mCellBandwidths;
}
/**
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index c1300b3892ff..c5386eff612e 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -111,6 +111,13 @@ public class TelephonyManager {
BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY;
/**
+ * The process name of the Phone app as well as many other apps that use this process name, such
+ * as settings and vendor components.
+ * @hide
+ */
+ public static final String PHONE_PROCESS_NAME = "com.android.phone";
+
+ /**
* The allowed states of Wi-Fi calling.
*
* @hide
@@ -5458,7 +5465,10 @@ public class TelephonyManager {
* app has carrier privileges (see {@link #hasCarrierPrivileges}).
*
* @param request Contains all the RAT with bands/channels that need to be scanned.
- * @param executor The executor through which the callback should be invoked.
+ * @param executor The executor through which the callback should be invoked. Since the scan
+ * request may trigger multiple callbacks and they must be invoked in the same order as
+ * they are received by the platform, the user should provide an executor which executes
+ * tasks one at a time in serial order. For example AsyncTask.SERIAL_EXECUTOR.
* @param callback Returns network scan results or errors.
* @return A NetworkScan obj which contains a callback which can be used to stop the scan.
*/
@@ -5484,7 +5494,7 @@ public class TelephonyManager {
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public NetworkScan requestNetworkScan(
NetworkScanRequest request, TelephonyScanManager.NetworkScanCallback callback) {
- return requestNetworkScan(request, AsyncTask.THREAD_POOL_EXECUTOR, callback);
+ return requestNetworkScan(request, AsyncTask.SERIAL_EXECUTOR, callback);
}
/**
diff --git a/telephony/java/android/telephony/TelephonyScanManager.java b/telephony/java/android/telephony/TelephonyScanManager.java
index 99e2db883e52..96ff33255b53 100644
--- a/telephony/java/android/telephony/TelephonyScanManager.java
+++ b/telephony/java/android/telephony/TelephonyScanManager.java
@@ -137,8 +137,10 @@ public final class TelephonyScanManager {
for (int i = 0; i < parcelables.length; i++) {
ci[i] = (CellInfo) parcelables[i];
}
- executor.execute(() ->
- callback.onResults((List<CellInfo>) Arrays.asList(ci)));
+ executor.execute(() ->{
+ Rlog.d(TAG, "onResults: " + ci.toString());
+ callback.onResults((List<CellInfo>) Arrays.asList(ci));
+ });
} catch (Exception e) {
Rlog.e(TAG, "Exception in networkscan callback onResults", e);
}
@@ -146,14 +148,20 @@ public final class TelephonyScanManager {
case CALLBACK_SCAN_ERROR:
try {
final int errorCode = message.arg1;
- executor.execute(() -> callback.onError(errorCode));
+ executor.execute(() -> {
+ Rlog.d(TAG, "onError: " + errorCode);
+ callback.onError(errorCode);
+ });
} catch (Exception e) {
Rlog.e(TAG, "Exception in networkscan callback onError", e);
}
break;
case CALLBACK_SCAN_COMPLETE:
try {
- executor.execute(() -> callback.onComplete());
+ executor.execute(() -> {
+ Rlog.d(TAG, "onComplete");
+ callback.onComplete();
+ });
mScanInfo.remove(message.arg2);
} catch (Exception e) {
Rlog.e(TAG, "Exception in networkscan callback onComplete", e);
diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java
index 73a05af8e56e..145ed7eeabdd 100644
--- a/telephony/java/android/telephony/data/ApnSetting.java
+++ b/telephony/java/android/telephony/data/ApnSetting.java
@@ -17,10 +17,10 @@ package android.telephony.data;
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.StringDef;
import android.content.ContentValues;
import android.database.Cursor;
import android.hardware.radio.V1_0.ApnTypes;
+import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.Telephony;
@@ -28,17 +28,15 @@ import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.Log;
-
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
/**
@@ -46,25 +44,184 @@ import java.util.Objects;
*/
public class ApnSetting implements Parcelable {
- static final String LOG_TAG = "ApnSetting";
+ private static final String LOG_TAG = "ApnSetting";
private static final boolean VDBG = false;
+ private static final Map<String, Integer> APN_TYPE_STRING_MAP;
+ private static final Map<Integer, String> APN_TYPE_INT_MAP;
+ private static final Map<String, Integer> PROTOCOL_STRING_MAP;
+ private static final Map<Integer, String> PROTOCOL_INT_MAP;
+ private static final Map<String, Integer> MVNO_TYPE_STRING_MAP;
+ private static final Map<Integer, String> MVNO_TYPE_INT_MAP;
+ private static final int NOT_IN_MAP_INT = -1;
+ private static final int NO_PORT_SPECIFIED = -1;
+
+ /** All APN types except IA. */
+ private static final int TYPE_ALL_BUT_IA = ApnTypes.ALL & (~ApnTypes.IA);
+
+ /** APN type for default data traffic and HiPri traffic. */
+ public static final int TYPE_DEFAULT = ApnTypes.DEFAULT | ApnTypes.HIPRI;
+ /** APN type for MMS traffic. */
+ public static final int TYPE_MMS = ApnTypes.MMS;
+ /** APN type for SUPL assisted GPS. */
+ public static final int TYPE_SUPL = ApnTypes.SUPL;
+ /** APN type for DUN traffic. */
+ public static final int TYPE_DUN = ApnTypes.DUN;
+ /** APN type for HiPri traffic. */
+ public static final int TYPE_HIPRI = ApnTypes.HIPRI;
+ /** APN type for accessing the carrier's FOTA portal, used for over the air updates. */
+ public static final int TYPE_FOTA = ApnTypes.FOTA;
+ /** APN type for IMS. */
+ public static final int TYPE_IMS = ApnTypes.IMS;
+ /** APN type for CBS. */
+ public static final int TYPE_CBS = ApnTypes.CBS;
+ /** APN type for IA Initial Attach APN. */
+ public static final int TYPE_IA = ApnTypes.IA;
+ /**
+ * APN type for Emergency PDN. This is not an IA apn, but is used
+ * for access to carrier services in an emergency call situation.
+ */
+ public static final int TYPE_EMERGENCY = ApnTypes.EMERGENCY;
+
+ /** @hide */
+ @IntDef(flag = true, prefix = { "TYPE_" }, value = {
+ TYPE_DEFAULT,
+ TYPE_MMS,
+ TYPE_SUPL,
+ TYPE_DUN,
+ TYPE_HIPRI,
+ TYPE_FOTA,
+ TYPE_IMS,
+ TYPE_CBS,
+ TYPE_IA,
+ TYPE_EMERGENCY
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ApnType {}
+
+ // Possible values for authentication types.
+ /** No authentication type. */
+ public static final int AUTH_TYPE_NONE = 0;
+ /** Authentication type for PAP. */
+ public static final int AUTH_TYPE_PAP = 1;
+ /** Authentication type for CHAP. */
+ public static final int AUTH_TYPE_CHAP = 2;
+ /** Authentication type for PAP or CHAP. */
+ public static final int AUTH_TYPE_PAP_OR_CHAP = 3;
+
+ /** @hide */
+ @IntDef(prefix = { "AUTH_TYPE_" }, value = {
+ AUTH_TYPE_NONE,
+ AUTH_TYPE_PAP,
+ AUTH_TYPE_CHAP,
+ AUTH_TYPE_PAP_OR_CHAP,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AuthType {}
+
+ // Possible values for protocol.
+ /** Protocol type for IP. */
+ public static final int PROTOCOL_IP = 0;
+ /** Protocol type for IPV6. */
+ public static final int PROTOCOL_IPV6 = 1;
+ /** Protocol type for IPV4V6. */
+ public static final int PROTOCOL_IPV4V6 = 2;
+ /** Protocol type for PPP. */
+ public static final int PROTOCOL_PPP = 3;
+
+ /** @hide */
+ @IntDef(prefix = { "PROTOCOL_" }, value = {
+ PROTOCOL_IP,
+ PROTOCOL_IPV6,
+ PROTOCOL_IPV4V6,
+ PROTOCOL_PPP,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ProtocolType {}
+
+ // Possible values for MVNO type.
+ /** MVNO type for service provider name. */
+ public static final int MVNO_TYPE_SPN = 0;
+ /** MVNO type for IMSI. */
+ public static final int MVNO_TYPE_IMSI = 1;
+ /** MVNO type for group identifier level 1. */
+ public static final int MVNO_TYPE_GID = 2;
+ /** MVNO type for ICCID. */
+ public static final int MVNO_TYPE_ICCID = 3;
+
+ /** @hide */
+ @IntDef(prefix = { "MVNO_TYPE_" }, value = {
+ MVNO_TYPE_SPN,
+ MVNO_TYPE_IMSI,
+ MVNO_TYPE_GID,
+ MVNO_TYPE_ICCID,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface MvnoType {}
+
+ static {
+ APN_TYPE_STRING_MAP = new ArrayMap<String, Integer>();
+ APN_TYPE_STRING_MAP.put("*", TYPE_ALL_BUT_IA);
+ APN_TYPE_STRING_MAP.put("default", TYPE_DEFAULT);
+ APN_TYPE_STRING_MAP.put("mms", TYPE_MMS);
+ APN_TYPE_STRING_MAP.put("supl", TYPE_SUPL);
+ APN_TYPE_STRING_MAP.put("dun", TYPE_DUN);
+ APN_TYPE_STRING_MAP.put("hipri", TYPE_HIPRI);
+ APN_TYPE_STRING_MAP.put("fota", TYPE_FOTA);
+ APN_TYPE_STRING_MAP.put("ims", TYPE_IMS);
+ APN_TYPE_STRING_MAP.put("cbs", TYPE_CBS);
+ APN_TYPE_STRING_MAP.put("ia", TYPE_IA);
+ APN_TYPE_STRING_MAP.put("emergency", TYPE_EMERGENCY);
+ APN_TYPE_INT_MAP = new ArrayMap<Integer, String>();
+ APN_TYPE_INT_MAP.put(TYPE_DEFAULT, "default");
+ APN_TYPE_INT_MAP.put(TYPE_MMS, "mms");
+ APN_TYPE_INT_MAP.put(TYPE_SUPL, "supl");
+ APN_TYPE_INT_MAP.put(TYPE_DUN, "dun");
+ APN_TYPE_INT_MAP.put(TYPE_HIPRI, "hipri");
+ APN_TYPE_INT_MAP.put(TYPE_FOTA, "fota");
+ APN_TYPE_INT_MAP.put(TYPE_IMS, "ims");
+ APN_TYPE_INT_MAP.put(TYPE_CBS, "cbs");
+ APN_TYPE_INT_MAP.put(TYPE_IA, "ia");
+ APN_TYPE_INT_MAP.put(TYPE_EMERGENCY, "emergency");
+
+ PROTOCOL_STRING_MAP = new ArrayMap<String, Integer>();
+ PROTOCOL_STRING_MAP.put("IP", PROTOCOL_IP);
+ PROTOCOL_STRING_MAP.put("IPV6", PROTOCOL_IPV6);
+ PROTOCOL_STRING_MAP.put("IPV4V6", PROTOCOL_IPV4V6);
+ PROTOCOL_STRING_MAP.put("PPP", PROTOCOL_PPP);
+ PROTOCOL_INT_MAP = new ArrayMap<Integer, String>();
+ PROTOCOL_INT_MAP.put(PROTOCOL_IP, "IP");
+ PROTOCOL_INT_MAP.put(PROTOCOL_IPV6, "IPV6");
+ PROTOCOL_INT_MAP.put(PROTOCOL_IPV4V6, "IPV4V6");
+ PROTOCOL_INT_MAP.put(PROTOCOL_PPP, "PPP");
+
+ MVNO_TYPE_STRING_MAP = new ArrayMap<String, Integer>();
+ MVNO_TYPE_STRING_MAP.put("spn", MVNO_TYPE_SPN);
+ MVNO_TYPE_STRING_MAP.put("imsi", MVNO_TYPE_IMSI);
+ MVNO_TYPE_STRING_MAP.put("gid", MVNO_TYPE_GID);
+ MVNO_TYPE_STRING_MAP.put("iccid", MVNO_TYPE_ICCID);
+ MVNO_TYPE_INT_MAP = new ArrayMap<Integer, String>();
+ MVNO_TYPE_INT_MAP.put(MVNO_TYPE_SPN, "spn");
+ MVNO_TYPE_INT_MAP.put(MVNO_TYPE_IMSI, "imsi");
+ MVNO_TYPE_INT_MAP.put(MVNO_TYPE_GID, "gid");
+ MVNO_TYPE_INT_MAP.put(MVNO_TYPE_ICCID, "iccid");
+ }
+
private final String mEntryName;
private final String mApnName;
- private final InetAddress mProxy;
- private final int mPort;
- private final URL mMmsc;
- private final InetAddress mMmsProxy;
- private final int mMmsPort;
+ private final InetAddress mProxyAddress;
+ private final int mProxyPort;
+ private final Uri mMmsc;
+ private final InetAddress mMmsProxyAddress;
+ private final int mMmsProxyPort;
private final String mUser;
private final String mPassword;
private final int mAuthType;
- private final List<String> mTypes;
- private final int mTypesBitmap;
+ private final int mApnTypeBitmask;
private final int mId;
private final String mOperatorNumeric;
- private final String mProtocol;
- private final String mRoamingProtocol;
+ private final int mProtocol;
+ private final int mRoamingProtocol;
private final int mMtu;
private final boolean mCarrierEnabled;
@@ -78,22 +235,12 @@ public class ApnSetting implements Parcelable {
private final int mWaitTime;
private final int mMaxConnsTime;
- private final String mMvnoType;
+ private final int mMvnoType;
private final String mMvnoMatchData;
private boolean mPermanentFailed = false;
/**
- * Returns the types bitmap of the APN.
- *
- * @return types bitmap of the APN
- * @hide
- */
- public int getTypesBitmap() {
- return mTypesBitmap;
- }
-
- /**
* Returns the MTU size of the mobile interface to which the APN connected.
*
* @return the MTU size of the APN
@@ -211,8 +358,8 @@ public class ApnSetting implements Parcelable {
*
* @return proxy address.
*/
- public InetAddress getProxy() {
- return mProxy;
+ public InetAddress getProxyAddress() {
+ return mProxyAddress;
}
/**
@@ -220,15 +367,15 @@ public class ApnSetting implements Parcelable {
*
* @return proxy port
*/
- public int getPort() {
- return mPort;
+ public int getProxyPort() {
+ return mProxyPort;
}
/**
- * Returns the MMSC URL of the APN.
+ * Returns the MMSC Uri of the APN.
*
- * @return MMSC URL.
+ * @return MMSC Uri.
*/
- public URL getMmsc() {
+ public Uri getMmsc() {
return mMmsc;
}
@@ -237,8 +384,8 @@ public class ApnSetting implements Parcelable {
*
* @return MMS proxy address.
*/
- public InetAddress getMmsProxy() {
- return mMmsProxy;
+ public InetAddress getMmsProxyAddress() {
+ return mMmsProxyAddress;
}
/**
@@ -246,8 +393,8 @@ public class ApnSetting implements Parcelable {
*
* @return MMS proxy port
*/
- public int getMmsPort() {
- return mMmsPort;
+ public int getMmsProxyPort() {
+ return mMmsProxyPort;
}
/**
@@ -268,21 +415,9 @@ public class ApnSetting implements Parcelable {
return mPassword;
}
- /** @hide */
- @IntDef({
- AUTH_TYPE_NONE,
- AUTH_TYPE_PAP,
- AUTH_TYPE_CHAP,
- AUTH_TYPE_PAP_OR_CHAP,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface AuthType {}
-
/**
* Returns the authentication type of the APN.
*
- * Example of possible values: {@link #AUTH_TYPE_NONE}, {@link #AUTH_TYPE_PAP}.
- *
* @return authentication type
*/
@AuthType
@@ -290,32 +425,20 @@ public class ApnSetting implements Parcelable {
return mAuthType;
}
- /** @hide */
- @StringDef({
- TYPE_DEFAULT,
- TYPE_MMS,
- TYPE_SUPL,
- TYPE_DUN,
- TYPE_HIPRI,
- TYPE_FOTA,
- TYPE_IMS,
- TYPE_CBS,
- TYPE_IA,
- TYPE_EMERGENCY
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface ApnType {}
-
/**
- * Returns the list of APN types of the APN.
+ * Returns the bitmask of APN types.
*
- * Example of possible values: {@link #TYPE_DEFAULT}, {@link #TYPE_MMS}.
+ * <p>Apn types are usage categories for an APN entry. One APN entry may support multiple
+ * APN types, eg, a single APN may service regular internet traffic ("default") as well as
+ * MMS-specific connections.
*
- * @return the list of APN types
+ * <p>The bitmask of APN types is calculated from APN types defined in {@link ApnSetting}.
+ *
+ * @see Builder#setApnTypeBitmask(int)
+ * @return a bitmask describing the types of the APN
*/
- @ApnType
- public List<String> getTypes() {
- return mTypes;
+ public @ApnType int getApnTypeBitmask() {
+ return mApnTypeBitmask;
}
/**
@@ -328,7 +451,7 @@ public class ApnSetting implements Parcelable {
}
/**
- * Returns the numeric operator ID for the APN. Usually
+ * Returns the numeric operator ID for the APN. Numeric operator ID is defined as
* {@link android.provider.Telephony.Carriers#MCC} +
* {@link android.provider.Telephony.Carriers#MNC}.
*
@@ -338,37 +461,29 @@ public class ApnSetting implements Parcelable {
return mOperatorNumeric;
}
- /** @hide */
- @StringDef({
- PROTOCOL_IP,
- PROTOCOL_IPV6,
- PROTOCOL_IPV4V6,
- PROTOCOL_PPP,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface ProtocolType {}
-
/**
* Returns the protocol to use to connect to this APN.
*
- * One of the {@code PDP_type} values in TS 27.007 section 10.1.1.
- * Example of possible values: {@link #PROTOCOL_IP}, {@link #PROTOCOL_IPV6}.
+ * <p>Protocol is one of the {@code PDP_type} values in TS 27.007 section 10.1.1.
*
+ * @see Builder#setProtocol(int)
* @return the protocol
*/
@ProtocolType
- public String getProtocol() {
+ public int getProtocol() {
return mProtocol;
}
/**
- * Returns the protocol to use to connect to this APN when roaming.
+ * Returns the protocol to use to connect to this APN while the device is roaming.
*
- * The syntax is the same as {@link android.provider.Telephony.Carriers#PROTOCOL}.
+ * <p>Roaming protocol is one of the {@code PDP_type} values in TS 27.007 section 10.1.1.
*
+ * @see Builder#setRoamingProtocol(int)
* @return the roaming protocol
*/
- public String getRoamingProtocol() {
+ @ProtocolType
+ public int getRoamingProtocol() {
return mRoamingProtocol;
}
@@ -398,41 +513,29 @@ public class ApnSetting implements Parcelable {
return mNetworkTypeBitmask;
}
- /** @hide */
- @StringDef({
- MVNO_TYPE_SPN,
- MVNO_TYPE_IMSI,
- MVNO_TYPE_GID,
- MVNO_TYPE_ICCID,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface MvnoType {}
-
/**
* Returns the MVNO match type for this APN.
*
- * Example of possible values: {@link #MVNO_TYPE_SPN}, {@link #MVNO_TYPE_IMSI}.
- *
+ * @see Builder#setMvnoType(int)
* @return the MVNO match type
*/
@MvnoType
- public String getMvnoType() {
+ public int getMvnoType() {
return mMvnoType;
}
private ApnSetting(Builder builder) {
this.mEntryName = builder.mEntryName;
this.mApnName = builder.mApnName;
- this.mProxy = builder.mProxy;
- this.mPort = builder.mPort;
+ this.mProxyAddress = builder.mProxyAddress;
+ this.mProxyPort = builder.mProxyPort;
this.mMmsc = builder.mMmsc;
- this.mMmsProxy = builder.mMmsProxy;
- this.mMmsPort = builder.mMmsPort;
+ this.mMmsProxyAddress = builder.mMmsProxyAddress;
+ this.mMmsProxyPort = builder.mMmsProxyPort;
this.mUser = builder.mUser;
this.mPassword = builder.mPassword;
this.mAuthType = builder.mAuthType;
- this.mTypes = (builder.mTypes == null ? new ArrayList<String>() : builder.mTypes);
- this.mTypesBitmap = builder.mTypesBitmap;
+ this.mApnTypeBitmask = builder.mApnTypeBitmask;
this.mId = builder.mId;
this.mOperatorNumeric = builder.mOperatorNumeric;
this.mProtocol = builder.mProtocol;
@@ -451,25 +554,25 @@ public class ApnSetting implements Parcelable {
/** @hide */
public static ApnSetting makeApnSetting(int id, String operatorNumeric, String entryName,
- String apnName, InetAddress proxy, int port, URL mmsc, InetAddress mmsProxy,
- int mmsPort, String user, String password, int authType, List<String> types,
- String protocol, String roamingProtocol, boolean carrierEnabled,
+ String apnName, InetAddress proxy, int port, Uri mmsc, InetAddress mmsProxy,
+ int mmsPort, String user, String password, int authType, int mApnTypeBitmask,
+ int protocol, int roamingProtocol, boolean carrierEnabled,
int networkTypeBitmask, int profileId, boolean modemCognitive, int maxConns,
- int waitTime, int maxConnsTime, int mtu, String mvnoType, String mvnoMatchData) {
+ int waitTime, int maxConnsTime, int mtu, int mvnoType, String mvnoMatchData) {
return new Builder()
.setId(id)
.setOperatorNumeric(operatorNumeric)
.setEntryName(entryName)
.setApnName(apnName)
- .setProxy(proxy)
- .setPort(port)
+ .setProxyAddress(proxy)
+ .setProxyPort(port)
.setMmsc(mmsc)
- .setMmsProxy(mmsProxy)
- .setMmsPort(mmsPort)
+ .setMmsProxyAddress(mmsProxy)
+ .setMmsProxyPort(mmsPort)
.setUser(user)
.setPassword(password)
.setAuthType(authType)
- .setTypes(types)
+ .setApnTypeBitmask(mApnTypeBitmask)
.setProtocol(protocol)
.setRoamingProtocol(roamingProtocol)
.setCarrierEnabled(carrierEnabled)
@@ -487,7 +590,7 @@ public class ApnSetting implements Parcelable {
/** @hide */
public static ApnSetting makeApnSetting(Cursor cursor) {
- String[] types = parseTypes(
+ final int apnTypesBitmask = parseTypes(
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.TYPE)));
int networkTypeBitmask = cursor.getInt(
cursor.getColumnIndexOrThrow(Telephony.Carriers.NETWORK_TYPE_BITMASK));
@@ -507,7 +610,7 @@ public class ApnSetting implements Parcelable {
cursor.getColumnIndexOrThrow(Telephony.Carriers.PROXY))),
portFromString(cursor.getString(
cursor.getColumnIndexOrThrow(Telephony.Carriers.PORT))),
- URLFromString(cursor.getString(
+ UriFromString(cursor.getString(
cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSC))),
inetAddressFromString(cursor.getString(
cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPROXY))),
@@ -516,10 +619,12 @@ public class ApnSetting implements Parcelable {
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)),
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)),
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)),
- Arrays.asList(types),
- cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)),
- cursor.getString(cursor.getColumnIndexOrThrow(
- Telephony.Carriers.ROAMING_PROTOCOL)),
+ apnTypesBitmask,
+ nullToNotInMapInt(PROTOCOL_STRING_MAP.get(
+ cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)))),
+ nullToNotInMapInt(PROTOCOL_STRING_MAP.get(
+ cursor.getString(cursor.getColumnIndexOrThrow(
+ Telephony.Carriers.ROAMING_PROTOCOL)))),
cursor.getInt(cursor.getColumnIndexOrThrow(
Telephony.Carriers.CARRIER_ENABLED)) == 1,
networkTypeBitmask,
@@ -531,8 +636,9 @@ public class ApnSetting implements Parcelable {
cursor.getInt(cursor.getColumnIndexOrThrow(
Telephony.Carriers.MAX_CONNS_TIME)),
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MTU)),
- cursor.getString(cursor.getColumnIndexOrThrow(
- Telephony.Carriers.MVNO_TYPE)),
+ nullToNotInMapInt(MVNO_TYPE_STRING_MAP.get(
+ cursor.getString(cursor.getColumnIndexOrThrow(
+ Telephony.Carriers.MVNO_TYPE)))),
cursor.getString(cursor.getColumnIndexOrThrow(
Telephony.Carriers.MVNO_MATCH_DATA)));
}
@@ -540,8 +646,8 @@ public class ApnSetting implements Parcelable {
/** @hide */
public static ApnSetting makeApnSetting(ApnSetting apn) {
return makeApnSetting(apn.mId, apn.mOperatorNumeric, apn.mEntryName, apn.mApnName,
- apn.mProxy, apn.mPort, apn.mMmsc, apn.mMmsProxy, apn.mMmsPort, apn.mUser,
- apn.mPassword, apn.mAuthType, apn.mTypes, apn.mProtocol, apn.mRoamingProtocol,
+ apn.mProxyAddress, apn.mProxyPort, apn.mMmsc, apn.mMmsProxyAddress, apn.mMmsProxyPort, apn.mUser,
+ apn.mPassword, apn.mAuthType, apn.mApnTypeBitmask, apn.mProtocol, apn.mRoamingProtocol,
apn.mCarrierEnabled, apn.mNetworkTypeBitmask, apn.mProfileId,
apn.mModemCognitive, apn.mMaxConns, apn.mWaitTime, apn.mMaxConnsTime, apn.mMtu,
apn.mMvnoType, apn.mMvnoMatchData);
@@ -555,18 +661,14 @@ public class ApnSetting implements Parcelable {
.append(", ").append(mId)
.append(", ").append(mOperatorNumeric)
.append(", ").append(mApnName)
- .append(", ").append(inetAddressToString(mProxy))
- .append(", ").append(URLToString(mMmsc))
- .append(", ").append(inetAddressToString(mMmsProxy))
- .append(", ").append(portToString(mMmsPort))
- .append(", ").append(portToString(mPort))
+ .append(", ").append(inetAddressToString(mProxyAddress))
+ .append(", ").append(UriToString(mMmsc))
+ .append(", ").append(inetAddressToString(mMmsProxyAddress))
+ .append(", ").append(portToString(mMmsProxyPort))
+ .append(", ").append(portToString(mProxyPort))
.append(", ").append(mAuthType).append(", ");
- for (int i = 0; i < mTypes.size(); i++) {
- sb.append(mTypes.get(i));
- if (i < mTypes.size() - 1) {
- sb.append(" | ");
- }
- }
+ final String[] types = deParseTypes(mApnTypeBitmask).split(",");
+ sb.append(TextUtils.join(" | ", types)).append(", ");
sb.append(", ").append(mProtocol);
sb.append(", ").append(mRoamingProtocol);
sb.append(", ").append(mCarrierEnabled);
@@ -588,56 +690,37 @@ public class ApnSetting implements Parcelable {
* @hide
*/
public boolean hasMvnoParams() {
- return !TextUtils.isEmpty(mMvnoType) && !TextUtils.isEmpty(mMvnoMatchData);
+ return (mMvnoType != NOT_IN_MAP_INT) && !TextUtils.isEmpty(mMvnoMatchData);
}
/** @hide */
- public boolean canHandleType(String type) {
- if (!mCarrierEnabled) return false;
- boolean wildcardable = true;
- if (TYPE_IA.equalsIgnoreCase(type)) wildcardable = false;
- for (String t : mTypes) {
- // DEFAULT handles all, and HIPRI is handled by DEFAULT
- if (t.equalsIgnoreCase(type)
- || (wildcardable && t.equalsIgnoreCase(TYPE_ALL))
- || (t.equalsIgnoreCase(TYPE_DEFAULT)
- && type.equalsIgnoreCase(TYPE_HIPRI))) {
- return true;
- }
- }
- return false;
+ public boolean canHandleType(@ApnType int type) {
+ return mCarrierEnabled && ((mApnTypeBitmask & type) == type);
}
// check whether the types of two APN same (even only one type of each APN is same)
private boolean typeSameAny(ApnSetting first, ApnSetting second) {
if (VDBG) {
StringBuilder apnType1 = new StringBuilder(first.mApnName + ": ");
- for (int index1 = 0; index1 < first.mTypes.size(); index1++) {
- apnType1.append(first.mTypes.get(index1));
- apnType1.append(",");
- }
+ apnType1.append(deParseTypes(first.mApnTypeBitmask));
StringBuilder apnType2 = new StringBuilder(second.mApnName + ": ");
- for (int index1 = 0; index1 < second.mTypes.size(); index1++) {
- apnType2.append(second.mTypes.get(index1));
- apnType2.append(",");
- }
+ apnType2.append(deParseTypes(second.mApnTypeBitmask));
+
Rlog.d(LOG_TAG, "APN1: is " + apnType1);
Rlog.d(LOG_TAG, "APN2: is " + apnType2);
}
- for (int index1 = 0; index1 < first.mTypes.size(); index1++) {
- for (int index2 = 0; index2 < second.mTypes.size(); index2++) {
- if (first.mTypes.get(index1).equals(ApnSetting.TYPE_ALL)
- || second.mTypes.get(index2).equals(ApnSetting.TYPE_ALL)
- || first.mTypes.get(index1).equals(second.mTypes.get(index2))) {
- if (VDBG) Rlog.d(LOG_TAG, "typeSameAny: return true");
- return true;
- }
+ if ((first.mApnTypeBitmask & second.mApnTypeBitmask) != 0) {
+ if (VDBG) {
+ Rlog.d(LOG_TAG, "typeSameAny: return true");
}
+ return true;
}
- if (VDBG) Rlog.d(LOG_TAG, "typeSameAny: return false");
+ if (VDBG) {
+ Rlog.d(LOG_TAG, "typeSameAny: return false");
+ }
return false;
}
@@ -655,16 +738,15 @@ public class ApnSetting implements Parcelable {
&& Objects.equals(mId, other.mId)
&& Objects.equals(mOperatorNumeric, other.mOperatorNumeric)
&& Objects.equals(mApnName, other.mApnName)
- && Objects.equals(mProxy, other.mProxy)
+ && Objects.equals(mProxyAddress, other.mProxyAddress)
&& Objects.equals(mMmsc, other.mMmsc)
- && Objects.equals(mMmsProxy, other.mMmsProxy)
- && Objects.equals(mMmsPort, other.mMmsPort)
- && Objects.equals(mPort,other.mPort)
+ && Objects.equals(mMmsProxyAddress, other.mMmsProxyAddress)
+ && Objects.equals(mMmsProxyPort, other.mMmsProxyPort)
+ && Objects.equals(mProxyPort,other.mProxyPort)
&& Objects.equals(mUser, other.mUser)
&& Objects.equals(mPassword, other.mPassword)
&& Objects.equals(mAuthType, other.mAuthType)
- && Objects.equals(mTypes, other.mTypes)
- && Objects.equals(mTypesBitmap, other.mTypesBitmap)
+ && Objects.equals(mApnTypeBitmask, other.mApnTypeBitmask)
&& Objects.equals(mProtocol, other.mProtocol)
&& Objects.equals(mRoamingProtocol, other.mRoamingProtocol)
&& Objects.equals(mCarrierEnabled, other.mCarrierEnabled)
@@ -701,16 +783,15 @@ public class ApnSetting implements Parcelable {
return mEntryName.equals(other.mEntryName)
&& Objects.equals(mOperatorNumeric, other.mOperatorNumeric)
&& Objects.equals(mApnName, other.mApnName)
- && Objects.equals(mProxy, other.mProxy)
+ && Objects.equals(mProxyAddress, other.mProxyAddress)
&& Objects.equals(mMmsc, other.mMmsc)
- && Objects.equals(mMmsProxy, other.mMmsProxy)
- && Objects.equals(mMmsPort, other.mMmsPort)
- && Objects.equals(mPort, other.mPort)
+ && Objects.equals(mMmsProxyAddress, other.mMmsProxyAddress)
+ && Objects.equals(mMmsProxyPort, other.mMmsProxyPort)
+ && Objects.equals(mProxyPort, other.mProxyPort)
&& Objects.equals(mUser, other.mUser)
&& Objects.equals(mPassword, other.mPassword)
&& Objects.equals(mAuthType, other.mAuthType)
- && Objects.equals(mTypes, other.mTypes)
- && Objects.equals(mTypesBitmap, other.mTypesBitmap)
+ && Objects.equals(mApnTypeBitmask, other.mApnTypeBitmask)
&& (isDataRoaming || Objects.equals(mProtocol,other.mProtocol))
&& (!isDataRoaming || Objects.equals(mRoamingProtocol, other.mRoamingProtocol))
&& Objects.equals(mCarrierEnabled, other.mCarrierEnabled)
@@ -736,17 +817,17 @@ public class ApnSetting implements Parcelable {
&& !other.canHandleType(TYPE_DUN)
&& Objects.equals(this.mApnName, other.mApnName)
&& !typeSameAny(this, other)
- && xorEqualsInetAddress(this.mProxy, other.mProxy)
- && xorEqualsPort(this.mPort, other.mPort)
+ && xorEquals(this.mProxyAddress, other.mProxyAddress)
+ && xorEqualsPort(this.mProxyPort, other.mProxyPort)
&& xorEquals(this.mProtocol, other.mProtocol)
&& xorEquals(this.mRoamingProtocol, other.mRoamingProtocol)
&& Objects.equals(this.mCarrierEnabled, other.mCarrierEnabled)
&& Objects.equals(this.mProfileId, other.mProfileId)
&& Objects.equals(this.mMvnoType, other.mMvnoType)
&& Objects.equals(this.mMvnoMatchData, other.mMvnoMatchData)
- && xorEqualsURL(this.mMmsc, other.mMmsc)
- && xorEqualsInetAddress(this.mMmsProxy, other.mMmsProxy)
- && xorEqualsPort(this.mMmsPort, other.mMmsPort))
+ && xorEquals(this.mMmsc, other.mMmsc)
+ && xorEquals(this.mMmsProxyAddress, other.mMmsProxyAddress)
+ && xorEqualsPort(this.mMmsProxyPort, other.mMmsProxyPort))
&& Objects.equals(this.mNetworkTypeBitmask, other.mNetworkTypeBitmask);
}
@@ -757,42 +838,23 @@ public class ApnSetting implements Parcelable {
|| TextUtils.isEmpty(second));
}
- // Equal or one is not specified.
- private boolean xorEqualsInetAddress(InetAddress first, InetAddress second) {
- return first == null || second == null || first.equals(second);
- }
-
- // Equal or one is not specified.
- private boolean xorEqualsURL(URL first, URL second) {
+ // Equal or one is not null.
+ private boolean xorEquals(Object first, Object second) {
return first == null || second == null || first.equals(second);
}
// Equal or one is not specified.
private boolean xorEqualsPort(int first, int second) {
- return first == -1 || second == -1 || Objects.equals(first, second);
- }
-
- // Helper function to convert APN string into a 32-bit bitmask.
- private static int getApnBitmask(String apn) {
- switch (apn) {
- case TYPE_DEFAULT: return ApnTypes.DEFAULT;
- case TYPE_MMS: return ApnTypes.MMS;
- case TYPE_SUPL: return ApnTypes.SUPL;
- case TYPE_DUN: return ApnTypes.DUN;
- case TYPE_HIPRI: return ApnTypes.HIPRI;
- case TYPE_FOTA: return ApnTypes.FOTA;
- case TYPE_IMS: return ApnTypes.IMS;
- case TYPE_CBS: return ApnTypes.CBS;
- case TYPE_IA: return ApnTypes.IA;
- case TYPE_EMERGENCY: return ApnTypes.EMERGENCY;
- case TYPE_ALL: return ApnTypes.ALL;
- default: return ApnTypes.NONE;
- }
+ return first == NO_PORT_SPECIFIED || second == NO_PORT_SPECIFIED
+ || Objects.equals(first, second);
}
- private String deParseTypes(List<String> types) {
- if (types == null) {
- return null;
+ private String deParseTypes(int apnTypeBitmask) {
+ List<String> types = new ArrayList<>();
+ for (Integer type : APN_TYPE_INT_MAP.keySet()) {
+ if ((apnTypeBitmask & type) == type) {
+ types.add(APN_TYPE_INT_MAP.get(type));
+ }
}
return TextUtils.join(",", types);
}
@@ -808,21 +870,25 @@ public class ApnSetting implements Parcelable {
apnValue.put(Telephony.Carriers.NUMERIC, nullToEmpty(mOperatorNumeric));
apnValue.put(Telephony.Carriers.NAME, nullToEmpty(mEntryName));
apnValue.put(Telephony.Carriers.APN, nullToEmpty(mApnName));
- apnValue.put(Telephony.Carriers.PROXY, mProxy == null ? "" : inetAddressToString(mProxy));
- apnValue.put(Telephony.Carriers.PORT, portToString(mPort));
- apnValue.put(Telephony.Carriers.MMSC, mMmsc == null ? "" : URLToString(mMmsc));
- apnValue.put(Telephony.Carriers.MMSPORT, portToString(mMmsPort));
- apnValue.put(Telephony.Carriers.MMSPROXY, mMmsProxy == null
- ? "" : inetAddressToString(mMmsProxy));
+ apnValue.put(Telephony.Carriers.PROXY, mProxyAddress == null ? ""
+ : inetAddressToString(mProxyAddress));
+ apnValue.put(Telephony.Carriers.PORT, portToString(mProxyPort));
+ apnValue.put(Telephony.Carriers.MMSC, mMmsc == null ? "" : UriToString(mMmsc));
+ apnValue.put(Telephony.Carriers.MMSPORT, portToString(mMmsProxyPort));
+ apnValue.put(Telephony.Carriers.MMSPROXY, mMmsProxyAddress == null
+ ? "" : inetAddressToString(mMmsProxyAddress));
apnValue.put(Telephony.Carriers.USER, nullToEmpty(mUser));
apnValue.put(Telephony.Carriers.PASSWORD, nullToEmpty(mPassword));
apnValue.put(Telephony.Carriers.AUTH_TYPE, mAuthType);
- String apnType = deParseTypes(mTypes);
+ String apnType = deParseTypes(mApnTypeBitmask);
apnValue.put(Telephony.Carriers.TYPE, nullToEmpty(apnType));
- apnValue.put(Telephony.Carriers.PROTOCOL, nullToEmpty(mProtocol));
- apnValue.put(Telephony.Carriers.ROAMING_PROTOCOL, nullToEmpty(mRoamingProtocol));
+ apnValue.put(Telephony.Carriers.PROTOCOL,
+ nullToEmpty(PROTOCOL_INT_MAP.get(mProtocol)));
+ apnValue.put(Telephony.Carriers.ROAMING_PROTOCOL,
+ nullToEmpty(PROTOCOL_INT_MAP.get(mRoamingProtocol)));
apnValue.put(Telephony.Carriers.CARRIER_ENABLED, mCarrierEnabled);
- apnValue.put(Telephony.Carriers.MVNO_TYPE, nullToEmpty(mMvnoType));
+ apnValue.put(Telephony.Carriers.MVNO_TYPE,
+ nullToEmpty(MVNO_TYPE_INT_MAP.get(mMvnoType)));
apnValue.put(Telephony.Carriers.NETWORK_TYPE_BITMASK, mNetworkTypeBitmask);
return apnValue;
@@ -830,32 +896,31 @@ public class ApnSetting implements Parcelable {
/**
* @param types comma delimited list of APN types
- * @return array of APN types
+ * @return bitmask of APN types
* @hide
*/
- public static String[] parseTypes(String types) {
- String[] result;
- // If unset, set to DEFAULT.
+ public static int parseTypes(String types) {
+ // If unset, set to ALL.
if (TextUtils.isEmpty(types)) {
- result = new String[1];
- result[0] = TYPE_ALL;
+ return TYPE_ALL_BUT_IA;
} else {
- result = types.split(",");
+ int result = 0;
+ for (String str : types.split(",")) {
+ Integer type = APN_TYPE_STRING_MAP.get(str);
+ if (type != null) {
+ result |= type;
+ }
+ }
+ return result;
}
- return result;
}
- private static URL URLFromString(String url) {
- try {
- return TextUtils.isEmpty(url) ? null : new URL(url);
- } catch (MalformedURLException e) {
- Log.e(LOG_TAG, "Can't parse URL from string.");
- return null;
- }
+ private static Uri UriFromString(String uri) {
+ return TextUtils.isEmpty(uri) ? null : Uri.parse(uri);
}
- private static String URLToString(URL url) {
- return url == null ? "" : url.toString();
+ private static String UriToString(Uri uri) {
+ return uri == null ? "" : uri.toString();
}
private static InetAddress inetAddressFromString(String inetAddress) {
@@ -887,7 +952,7 @@ public class ApnSetting implements Parcelable {
}
private static int portFromString(String strPort) {
- int port = -1;
+ int port = NO_PORT_SPECIFIED;
if (!TextUtils.isEmpty(strPort)) {
try {
port = Integer.parseInt(strPort);
@@ -899,7 +964,7 @@ public class ApnSetting implements Parcelable {
}
private static String portToString(int port) {
- return port == -1 ? "" : Integer.toString(port);
+ return port == NO_PORT_SPECIFIED ? "" : Integer.toString(port);
}
// Implement Parcelable.
@@ -916,19 +981,19 @@ public class ApnSetting implements Parcelable {
dest.writeString(mOperatorNumeric);
dest.writeString(mEntryName);
dest.writeString(mApnName);
- dest.writeValue(mProxy);
- dest.writeInt(mPort);
+ dest.writeValue(mProxyAddress);
+ dest.writeInt(mProxyPort);
dest.writeValue(mMmsc);
- dest.writeValue(mMmsProxy);
- dest.writeInt(mMmsPort);
+ dest.writeValue(mMmsProxyAddress);
+ dest.writeInt(mMmsProxyPort);
dest.writeString(mUser);
dest.writeString(mPassword);
dest.writeInt(mAuthType);
- dest.writeStringArray(mTypes.toArray(new String[0]));
- dest.writeString(mProtocol);
- dest.writeString(mRoamingProtocol);
+ dest.writeInt(mApnTypeBitmask);
+ dest.writeInt(mProtocol);
+ dest.writeInt(mRoamingProtocol);
dest.writeInt(mCarrierEnabled ? 1: 0);
- dest.writeString(mMvnoType);
+ dest.writeInt(mMvnoType);
dest.writeInt(mNetworkTypeBitmask);
}
@@ -939,23 +1004,23 @@ public class ApnSetting implements Parcelable {
final String apnName = in.readString();
final InetAddress proxy = (InetAddress)in.readValue(InetAddress.class.getClassLoader());
final int port = in.readInt();
- final URL mmsc = (URL)in.readValue(URL.class.getClassLoader());
+ final Uri mmsc = (Uri)in.readValue(Uri.class.getClassLoader());
final InetAddress mmsProxy = (InetAddress)in.readValue(InetAddress.class.getClassLoader());
final int mmsPort = in.readInt();
final String user = in.readString();
final String password = in.readString();
final int authType = in.readInt();
- final List<String> types = Arrays.asList(in.readStringArray());
- final String protocol = in.readString();
- final String roamingProtocol = in.readString();
+ final int apnTypesBitmask = in.readInt();
+ final int protocol = in.readInt();
+ final int roamingProtocol = in.readInt();
final boolean carrierEnabled = in.readInt() > 0;
- final String mvnoType = in.readString();
+ final int mvnoType = in.readInt();
final int networkTypeBitmask = in.readInt();
return makeApnSetting(id, operatorNumeric, entryName, apnName,
- proxy, port, mmsc, mmsProxy, mmsPort, user, password, authType, types, protocol,
- roamingProtocol, carrierEnabled, networkTypeBitmask, 0, false,
- 0, 0, 0, 0, mvnoType, null);
+ proxy, port, mmsc, mmsProxy, mmsPort, user, password, authType, apnTypesBitmask,
+ protocol, roamingProtocol, carrierEnabled, networkTypeBitmask, 0, false,
+ 0, 0, 0, 0, mvnoType, null);
}
public static final Parcelable.Creator<ApnSetting> CREATOR =
@@ -971,89 +1036,26 @@ public class ApnSetting implements Parcelable {
}
};
- /**
- * APN types for data connections. These are usage categories for an APN
- * entry. One APN entry may support multiple APN types, eg, a single APN
- * may service regular internet traffic ("default") as well as MMS-specific
- * connections.<br/>
- * ALL is a special type to indicate that this APN entry can
- * service all data connections.
- */
- public static final String TYPE_ALL = "*";
- /** APN type for default data traffic */
- public static final String TYPE_DEFAULT = "default";
- /** APN type for MMS traffic */
- public static final String TYPE_MMS = "mms";
- /** APN type for SUPL assisted GPS */
- public static final String TYPE_SUPL = "supl";
- /** APN type for DUN traffic */
- public static final String TYPE_DUN = "dun";
- /** APN type for HiPri traffic */
- public static final String TYPE_HIPRI = "hipri";
- /** APN type for FOTA */
- public static final String TYPE_FOTA = "fota";
- /** APN type for IMS */
- public static final String TYPE_IMS = "ims";
- /** APN type for CBS */
- public static final String TYPE_CBS = "cbs";
- /** APN type for IA Initial Attach APN */
- public static final String TYPE_IA = "ia";
- /** APN type for Emergency PDN. This is not an IA apn, but is used
- * for access to carrier services in an emergency call situation. */
- public static final String TYPE_EMERGENCY = "emergency";
- /**
- * Array of all APN types
- *
- * @hide
- */
- public static final String[] ALL_TYPES = {
- TYPE_DEFAULT,
- TYPE_MMS,
- TYPE_SUPL,
- TYPE_DUN,
- TYPE_HIPRI,
- TYPE_FOTA,
- TYPE_IMS,
- TYPE_CBS,
- TYPE_IA,
- TYPE_EMERGENCY
- };
-
- // Possible values for authentication types.
- public static final int AUTH_TYPE_NONE = 0;
- public static final int AUTH_TYPE_PAP = 1;
- public static final int AUTH_TYPE_CHAP = 2;
- public static final int AUTH_TYPE_PAP_OR_CHAP = 3;
-
- // Possible values for protocol.
- public static final String PROTOCOL_IP = "IP";
- public static final String PROTOCOL_IPV6 = "IPV6";
- public static final String PROTOCOL_IPV4V6 = "IPV4V6";
- public static final String PROTOCOL_PPP = "PPP";
-
- // Possible values for MVNO type.
- public static final String MVNO_TYPE_SPN = "spn";
- public static final String MVNO_TYPE_IMSI = "imsi";
- public static final String MVNO_TYPE_GID = "gid";
- public static final String MVNO_TYPE_ICCID = "iccid";
+ private static int nullToNotInMapInt(Integer value) {
+ return value == null ? NOT_IN_MAP_INT : value;
+ }
public static class Builder{
private String mEntryName;
private String mApnName;
- private InetAddress mProxy;
- private int mPort = -1;
- private URL mMmsc;
- private InetAddress mMmsProxy;
- private int mMmsPort = -1;
+ private InetAddress mProxyAddress;
+ private int mProxyPort = NO_PORT_SPECIFIED;
+ private Uri mMmsc;
+ private InetAddress mMmsProxyAddress;
+ private int mMmsProxyPort = NO_PORT_SPECIFIED;
private String mUser;
private String mPassword;
private int mAuthType;
- private List<String> mTypes;
- private int mTypesBitmap;
+ private int mApnTypeBitmask;
private int mId;
private String mOperatorNumeric;
- private String mProtocol;
- private String mRoamingProtocol;
+ private int mProtocol = NOT_IN_MAP_INT;
+ private int mRoamingProtocol = NOT_IN_MAP_INT;
private int mMtu;
private int mNetworkTypeBitmask;
private boolean mCarrierEnabled;
@@ -1062,7 +1064,7 @@ public class ApnSetting implements Parcelable {
private int mMaxConns;
private int mWaitTime;
private int mMaxConnsTime;
- private String mMvnoType;
+ private int mMvnoType = NOT_IN_MAP_INT;
private String mMvnoMatchData;
/**
@@ -1182,8 +1184,8 @@ public class ApnSetting implements Parcelable {
*
* @param proxy the proxy address to set for the APN
*/
- public Builder setProxy(InetAddress proxy) {
- this.mProxy = proxy;
+ public Builder setProxyAddress(InetAddress proxy) {
+ this.mProxyAddress = proxy;
return this;
}
@@ -1192,17 +1194,17 @@ public class ApnSetting implements Parcelable {
*
* @param port the proxy port to set for the APN
*/
- public Builder setPort(int port) {
- this.mPort = port;
+ public Builder setProxyPort(int port) {
+ this.mProxyPort = port;
return this;
}
/**
- * Sets the MMSC URL of the APN.
+ * Sets the MMSC Uri of the APN.
*
- * @param mmsc the MMSC URL to set for the APN
+ * @param mmsc the MMSC Uri to set for the APN
*/
- public Builder setMmsc(URL mmsc) {
+ public Builder setMmsc(Uri mmsc) {
this.mMmsc = mmsc;
return this;
}
@@ -1212,8 +1214,8 @@ public class ApnSetting implements Parcelable {
*
* @param mmsProxy the MMS proxy address to set for the APN
*/
- public Builder setMmsProxy(InetAddress mmsProxy) {
- this.mMmsProxy = mmsProxy;
+ public Builder setMmsProxyAddress(InetAddress mmsProxy) {
+ this.mMmsProxyAddress = mmsProxy;
return this;
}
@@ -1222,8 +1224,8 @@ public class ApnSetting implements Parcelable {
*
* @param mmsPort the MMS proxy port to set for the APN
*/
- public Builder setMmsPort(int mmsPort) {
- this.mMmsPort = mmsPort;
+ public Builder setMmsProxyPort(int mmsPort) {
+ this.mMmsProxyPort = mmsPort;
return this;
}
@@ -1251,8 +1253,6 @@ public class ApnSetting implements Parcelable {
/**
* Sets the authentication type of the APN.
*
- * Example of possible values: {@link #AUTH_TYPE_NONE}, {@link #AUTH_TYPE_PAP}.
- *
* @param authType the authentication type to set for the APN
*/
public Builder setAuthType(@AuthType int authType) {
@@ -1261,25 +1261,25 @@ public class ApnSetting implements Parcelable {
}
/**
- * Sets the list of APN types of the APN.
+ * Sets the bitmask of APN types.
+ *
+ * <p>Apn types are usage categories for an APN entry. One APN entry may support multiple
+ * APN types, eg, a single APN may service regular internet traffic ("default") as well as
+ * MMS-specific connections.
*
- * Example of possible values: {@link #TYPE_DEFAULT}, {@link #TYPE_MMS}.
+ * <p>The bitmask of APN types is calculated from APN types defined in {@link ApnSetting}.
*
- * @param types the list of APN types to set for the APN
+ * @param apnTypeBitmask a bitmask describing the types of the APN
*/
- public Builder setTypes(@ApnType List<String> types) {
- this.mTypes = types;
- int apnBitmap = 0;
- for (int i = 0; i < mTypes.size(); i++) {
- mTypes.set(i, mTypes.get(i).toLowerCase());
- apnBitmap |= getApnBitmask(mTypes.get(i));
- }
- this.mTypesBitmap = apnBitmap;
+ public Builder setApnTypeBitmask(@ApnType int apnTypeBitmask) {
+ this.mApnTypeBitmask = apnTypeBitmask;
return this;
}
/**
- * Set the numeric operator ID for the APN.
+ * Sets the numeric operator ID for the APN. Numeric operator ID is defined as
+ * {@link android.provider.Telephony.Carriers#MCC} +
+ * {@link android.provider.Telephony.Carriers#MNC}.
*
* @param operatorNumeric the numeric operator ID to set for this entry
*/
@@ -1291,22 +1291,23 @@ public class ApnSetting implements Parcelable {
/**
* Sets the protocol to use to connect to this APN.
*
- * One of the {@code PDP_type} values in TS 27.007 section 10.1.1.
- * Example of possible values: {@link #PROTOCOL_IP}, {@link #PROTOCOL_IPV6}.
+ * <p>Protocol is one of the {@code PDP_type} values in TS 27.007 section 10.1.1.
*
* @param protocol the protocol to set to use to connect to this APN
*/
- public Builder setProtocol(@ProtocolType String protocol) {
+ public Builder setProtocol(@ProtocolType int protocol) {
this.mProtocol = protocol;
return this;
}
/**
- * Sets the protocol to use to connect to this APN when roaming.
+ * Sets the protocol to use to connect to this APN when the device is roaming.
+ *
+ * <p>Roaming protocol is one of the {@code PDP_type} values in TS 27.007 section 10.1.1.
*
* @param roamingProtocol the protocol to set to use to connect to this APN when roaming
*/
- public Builder setRoamingProtocol(String roamingProtocol) {
+ public Builder setRoamingProtocol(@ProtocolType int roamingProtocol) {
this.mRoamingProtocol = roamingProtocol;
return this;
}
@@ -1334,16 +1335,25 @@ public class ApnSetting implements Parcelable {
/**
* Sets the MVNO match type for this APN.
*
- * Example of possible values: {@link #MVNO_TYPE_SPN}, {@link #MVNO_TYPE_IMSI}.
- *
* @param mvnoType the MVNO match type to set for this APN
*/
- public Builder setMvnoType(@MvnoType String mvnoType) {
+ public Builder setMvnoType(@MvnoType int mvnoType) {
this.mMvnoType = mvnoType;
return this;
}
+ /**
+ * Builds {@link ApnSetting} from this builder.
+ *
+ * @return {@code null} if {@link #setApnName(String)} or {@link #setEntryName(String)}
+ * is empty, or {@link #setApnTypeBitmask(int)} doesn't contain a valid bit,
+ * {@link ApnSetting} built from this builder otherwise.
+ */
public ApnSetting build() {
+ if ((mApnTypeBitmask & ApnTypes.ALL) == 0 || TextUtils.isEmpty(mApnName)
+ || TextUtils.isEmpty(mEntryName)) {
+ return null;
+ }
return new ApnSetting(this);
}
}
diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java
index 1637c55c0adf..dff1c6fe35f6 100644
--- a/telephony/java/android/telephony/euicc/EuiccManager.java
+++ b/telephony/java/android/telephony/euicc/EuiccManager.java
@@ -15,11 +15,12 @@
*/
package android.telephony.euicc;
+import android.Manifest;
import android.annotation.IntDef;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
-import android.annotation.TestApi;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
@@ -73,6 +74,7 @@ public class EuiccManager {
*/
@SystemApi
@SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public static final String ACTION_OTA_STATUS_CHANGED =
"android.telephony.euicc.action.OTA_STATUS_CHANGED";
@@ -301,6 +303,7 @@ public class EuiccManager {
* @hide
*/
@SystemApi
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public int getOtaStatus() {
if (!isEnabled()) {
return EUICC_OTA_STATUS_UNAVAILABLE;
@@ -325,6 +328,7 @@ public class EuiccManager {
* @param switchAfterDownload if true, the profile will be activated upon successful download.
* @param callbackIntent a PendingIntent to launch when the operation completes.
*/
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public void downloadSubscription(DownloadableSubscription subscription,
boolean switchAfterDownload, PendingIntent callbackIntent) {
if (!isEnabled()) {
@@ -387,6 +391,7 @@ public class EuiccManager {
* @hide
*/
@SystemApi
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public void continueOperation(Intent resolutionIntent, Bundle resolutionExtras) {
if (!isEnabled()) {
PendingIntent callbackIntent =
@@ -422,6 +427,7 @@ public class EuiccManager {
* @hide
*/
@SystemApi
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public void getDownloadableSubscriptionMetadata(
DownloadableSubscription subscription, PendingIntent callbackIntent) {
if (!isEnabled()) {
@@ -452,6 +458,7 @@ public class EuiccManager {
* @hide
*/
@SystemApi
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public void getDefaultDownloadableSubscriptionList(PendingIntent callbackIntent) {
if (!isEnabled()) {
sendUnavailableError(callbackIntent);
@@ -496,6 +503,7 @@ public class EuiccManager {
* @param subscriptionId the ID of the subscription to delete.
* @param callbackIntent a PendingIntent to launch when the operation completes.
*/
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public void deleteSubscription(int subscriptionId, PendingIntent callbackIntent) {
if (!isEnabled()) {
sendUnavailableError(callbackIntent);
@@ -523,6 +531,7 @@ public class EuiccManager {
* current profile without activating another profile to replace it.
* @param callbackIntent a PendingIntent to launch when the operation completes.
*/
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public void switchToSubscription(int subscriptionId, PendingIntent callbackIntent) {
if (!isEnabled()) {
sendUnavailableError(callbackIntent);
@@ -548,6 +557,7 @@ public class EuiccManager {
* @param callbackIntent a PendingIntent to launch when the operation completes.
* @hide
*/
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public void updateSubscriptionNickname(
int subscriptionId, String nickname, PendingIntent callbackIntent) {
if (!isEnabled()) {
@@ -566,12 +576,13 @@ public class EuiccManager {
* Erase all subscriptions and reset the eUICC.
*
* <p>Requires that the calling app has the
- * {@link android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission. This is for
- * internal system use only.
+ * {@code android.Manifest.permission#WRITE_EMBEDDED_SUBSCRIPTIONS} permission.
*
* @param callbackIntent a PendingIntent to launch when the operation completes.
* @hide
*/
+ @SystemApi
+ @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
public void eraseSubscriptions(PendingIntent callbackIntent) {
if (!isEnabled()) {
sendUnavailableError(callbackIntent);
diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
index c073d1ab03d6..aaf1a1cf8f20 100644
--- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java
+++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
@@ -139,34 +139,44 @@ public class MmTelFeature extends ImsFeature {
@Override
public int queryCapabilityStatus() throws RemoteException {
- return MmTelFeature.this.queryCapabilityStatus().mCapabilities;
+ synchronized (mLock) {
+ return MmTelFeature.this.queryCapabilityStatus().mCapabilities;
+ }
}
@Override
public void addCapabilityCallback(IImsCapabilityCallback c) {
+ // no need to lock, structure already handles multithreading.
MmTelFeature.this.addCapabilityCallback(c);
}
@Override
public void removeCapabilityCallback(IImsCapabilityCallback c) {
+ // no need to lock, structure already handles multithreading.
MmTelFeature.this.removeCapabilityCallback(c);
}
@Override
public void changeCapabilitiesConfiguration(CapabilityChangeRequest request,
IImsCapabilityCallback c) throws RemoteException {
- MmTelFeature.this.requestChangeEnabledCapabilities(request, c);
+ synchronized (mLock) {
+ MmTelFeature.this.requestChangeEnabledCapabilities(request, c);
+ }
}
@Override
public void queryCapabilityConfiguration(int capability, int radioTech,
IImsCapabilityCallback c) {
- queryCapabilityConfigurationInternal(capability, radioTech, c);
+ synchronized (mLock) {
+ queryCapabilityConfigurationInternal(capability, radioTech, c);
+ }
}
@Override
public void setSmsListener(IImsSmsListener l) throws RemoteException {
- MmTelFeature.this.setSmsListener(l);
+ synchronized (mLock) {
+ MmTelFeature.this.setSmsListener(l);
+ }
}
@Override
diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
index 14c5f4bebebb..964a31304db5 100644
--- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
+++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java
@@ -470,6 +470,9 @@ public class SmsMessage extends SmsMessageBase {
int bearerDataLength;
SmsEnvelope env = new SmsEnvelope();
CdmaSmsAddress addr = new CdmaSmsAddress();
+ // We currently do not parse subaddress in PDU, but it is required when determining
+ // fingerprint (see getIncomingSmsFingerprint()).
+ CdmaSmsSubaddress subaddr = new CdmaSmsSubaddress();
try {
env.messageType = dis.readInt();
@@ -520,6 +523,7 @@ public class SmsMessage extends SmsMessageBase {
// link the filled objects to this SMS
mOriginatingAddress = addr;
env.origAddress = addr;
+ env.origSubaddress = subaddr;
mEnvelope = env;
mPdu = pdu;
@@ -1009,8 +1013,11 @@ public class SmsMessage extends SmsMessageBase {
output.write(mEnvelope.teleService);
output.write(mEnvelope.origAddress.origBytes, 0, mEnvelope.origAddress.origBytes.length);
output.write(mEnvelope.bearerData, 0, mEnvelope.bearerData.length);
- output.write(mEnvelope.origSubaddress.origBytes, 0,
- mEnvelope.origSubaddress.origBytes.length);
+ // subaddress is not set when parsing some MT SMS.
+ if (mEnvelope.origSubaddress != null && mEnvelope.origSubaddress.origBytes != null) {
+ output.write(mEnvelope.origSubaddress.origBytes, 0,
+ mEnvelope.origSubaddress.origBytes.length);
+ }
return output.toByteArray();
}
diff --git a/test-mock/api/android-test-mock-current.txt b/test-mock/api/android-test-mock-current.txt
index 07acfef7ce6c..f3b253c0f460 100644
--- a/test-mock/api/android-test-mock-current.txt
+++ b/test-mock/api/android-test-mock-current.txt
@@ -278,6 +278,7 @@ package android.test.mock {
method public android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
method public android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
method public android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
+ method public android.content.pm.ResolveInfo resolveServiceAsUser(android.content.Intent, int, int);
method public void setApplicationCategoryHint(java.lang.String, int);
method public void setApplicationEnabledSetting(java.lang.String, int, int);
method public void setComponentEnabledSetting(android.content.ComponentName, int, int);
diff --git a/test-mock/src/android/test/mock/MockPackageManager.java b/test-mock/src/android/test/mock/MockPackageManager.java
index 1af7c3a479b6..c2aca6b4c185 100644
--- a/test-mock/src/android/test/mock/MockPackageManager.java
+++ b/test-mock/src/android/test/mock/MockPackageManager.java
@@ -18,6 +18,7 @@ package android.test.mock;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.PackageInstallObserver;
import android.content.ComponentName;
import android.content.Intent;
@@ -53,6 +54,7 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Handler;
+import android.os.PersistableBundle;
import android.os.UserHandle;
import android.os.storage.VolumeInfo;
@@ -464,6 +466,11 @@ public class MockPackageManager extends PackageManager {
}
@Override
+ public ResolveInfo resolveServiceAsUser(Intent intent, int flags, int userId) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
throw new UnsupportedOperationException();
}
@@ -945,7 +952,8 @@ public class MockPackageManager extends PackageManager {
/** @hide */
@Override
- public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean hidden, int userId) {
+ public String[] setPackagesSuspended(String[] packageNames, boolean hidden,
+ PersistableBundle appExtras, PersistableBundle launcherExtras, String dialogMessage) {
throw new UnsupportedOperationException();
}
diff --git a/tests/BandwidthTests/src/com/android/tests/bandwidthenforcement/BandwidthEnforcementTestService.java b/tests/BandwidthTests/src/com/android/tests/bandwidthenforcement/BandwidthEnforcementTestService.java
index a2427f514e17..35f1e585931b 100644
--- a/tests/BandwidthTests/src/com/android/tests/bandwidthenforcement/BandwidthEnforcementTestService.java
+++ b/tests/BandwidthTests/src/com/android/tests/bandwidthenforcement/BandwidthEnforcementTestService.java
@@ -16,7 +16,10 @@
package com.android.tests.bandwidthenforcement;
import android.app.IntentService;
+import android.content.Context;
import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.Network;
import android.net.SntpClient;
import android.os.Environment;
import android.util.Log;
@@ -55,7 +58,7 @@ public class BandwidthEnforcementTestService extends IntentService {
String outputFile = intent.getStringExtra(OUTPUT_FILE);
dumpResult("testUrlConnection", testUrlConnection(), outputFile);
dumpResult("testUrlConnectionv6", testUrlConnectionv6(), outputFile);
- dumpResult("testSntp", testSntp(), outputFile);
+ dumpResult("testSntp", testSntp(getApplicationContext()), outputFile);
dumpResult("testDns", testDns(), outputFile);
}
@@ -138,9 +141,12 @@ public class BandwidthEnforcementTestService extends IntentService {
* Tests to connect via sntp.
* @return true if it was able to connect, false otherwise.
*/
- public static boolean testSntp() {
+ public static boolean testSntp(Context context) {
final SntpClient client = new SntpClient();
- if (client.requestTime("0.pool.ntp.org", 10000)) {
+ final ConnectivityManager mCM = context.getSystemService(ConnectivityManager.class);
+ final Network network = mCM.getActiveNetwork();
+
+ if (client.requestTime("0.pool.ntp.org", 10000, network)) {
return true;
}
return false;
diff --git a/tests/UsageStatsTest/AndroidManifest.xml b/tests/UsageStatsTest/AndroidManifest.xml
index 66af45424fba..4b1c1bd69920 100644
--- a/tests/UsageStatsTest/AndroidManifest.xml
+++ b/tests/UsageStatsTest/AndroidManifest.xml
@@ -10,6 +10,7 @@
>
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
+ <uses-permission android:name="android.permission.OBSERVE_APP_USAGE" />
<application android:label="Usage Access Test">
<activity android:name=".UsageStatsActivity"
diff --git a/tests/net/java/android/net/IpSecManagerTest.java b/tests/net/java/android/net/IpSecManagerTest.java
index cc3366fbc832..0ca20dee427f 100644
--- a/tests/net/java/android/net/IpSecManagerTest.java
+++ b/tests/net/java/android/net/IpSecManagerTest.java
@@ -50,13 +50,18 @@ public class IpSecManagerTest {
private static final int TEST_UDP_ENCAP_PORT = 34567;
private static final int DROID_SPI = 0xD1201D;
+ private static final int DUMMY_RESOURCE_ID = 0x1234;
private static final InetAddress GOOGLE_DNS_4;
+ private static final String VTI_INTF_NAME = "ipsec_test";
+ private static final InetAddress VTI_LOCAL_ADDRESS;
+ private static final LinkAddress VTI_INNER_ADDRESS = new LinkAddress("10.0.1.1/24");
static {
try {
// Google Public DNS Addresses;
GOOGLE_DNS_4 = InetAddress.getByName("8.8.8.8");
+ VTI_LOCAL_ADDRESS = InetAddress.getByName("8.8.4.4");
} catch (UnknownHostException e) {
throw new RuntimeException("Could not resolve DNS Addresses", e);
}
@@ -77,9 +82,8 @@ public class IpSecManagerTest {
*/
@Test
public void testAllocSpi() throws Exception {
- int resourceId = 1;
IpSecSpiResponse spiResp =
- new IpSecSpiResponse(IpSecManager.Status.OK, resourceId, DROID_SPI);
+ new IpSecSpiResponse(IpSecManager.Status.OK, DUMMY_RESOURCE_ID, DROID_SPI);
when(mMockIpSecService.allocateSecurityParameterIndex(
eq(GOOGLE_DNS_4.getHostAddress()),
eq(DROID_SPI),
@@ -92,14 +96,13 @@ public class IpSecManagerTest {
droidSpi.close();
- verify(mMockIpSecService).releaseSecurityParameterIndex(resourceId);
+ verify(mMockIpSecService).releaseSecurityParameterIndex(DUMMY_RESOURCE_ID);
}
@Test
public void testAllocRandomSpi() throws Exception {
- int resourceId = 1;
IpSecSpiResponse spiResp =
- new IpSecSpiResponse(IpSecManager.Status.OK, resourceId, DROID_SPI);
+ new IpSecSpiResponse(IpSecManager.Status.OK, DUMMY_RESOURCE_ID, DROID_SPI);
when(mMockIpSecService.allocateSecurityParameterIndex(
eq(GOOGLE_DNS_4.getHostAddress()),
eq(IpSecManager.INVALID_SECURITY_PARAMETER_INDEX),
@@ -113,7 +116,7 @@ public class IpSecManagerTest {
randomSpi.close();
- verify(mMockIpSecService).releaseSecurityParameterIndex(resourceId);
+ verify(mMockIpSecService).releaseSecurityParameterIndex(DUMMY_RESOURCE_ID);
}
/*
@@ -165,11 +168,10 @@ public class IpSecManagerTest {
@Test
public void testOpenEncapsulationSocket() throws Exception {
- int resourceId = 1;
IpSecUdpEncapResponse udpEncapResp =
new IpSecUdpEncapResponse(
IpSecManager.Status.OK,
- resourceId,
+ DUMMY_RESOURCE_ID,
TEST_UDP_ENCAP_PORT,
Os.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP));
when(mMockIpSecService.openUdpEncapsulationSocket(eq(TEST_UDP_ENCAP_PORT), anyObject()))
@@ -182,16 +184,15 @@ public class IpSecManagerTest {
encapSocket.close();
- verify(mMockIpSecService).closeUdpEncapsulationSocket(resourceId);
+ verify(mMockIpSecService).closeUdpEncapsulationSocket(DUMMY_RESOURCE_ID);
}
@Test
public void testOpenEncapsulationSocketOnRandomPort() throws Exception {
- int resourceId = 1;
IpSecUdpEncapResponse udpEncapResp =
new IpSecUdpEncapResponse(
IpSecManager.Status.OK,
- resourceId,
+ DUMMY_RESOURCE_ID,
TEST_UDP_ENCAP_PORT,
Os.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP));
@@ -206,7 +207,7 @@ public class IpSecManagerTest {
encapSocket.close();
- verify(mMockIpSecService).closeUdpEncapsulationSocket(resourceId);
+ verify(mMockIpSecService).closeUdpEncapsulationSocket(DUMMY_RESOURCE_ID);
}
@Test
@@ -219,4 +220,45 @@ public class IpSecManagerTest {
}
// TODO: add test when applicable transform builder interface is available
-}
+
+ private IpSecManager.IpSecTunnelInterface createAndValidateVti(int resourceId, String intfName)
+ throws Exception {
+ IpSecTunnelInterfaceResponse dummyResponse =
+ new IpSecTunnelInterfaceResponse(IpSecManager.Status.OK, resourceId, intfName);
+ when(mMockIpSecService.createTunnelInterface(
+ eq(VTI_LOCAL_ADDRESS.getHostAddress()), eq(GOOGLE_DNS_4.getHostAddress()),
+ anyObject(), anyObject()))
+ .thenReturn(dummyResponse);
+
+ IpSecManager.IpSecTunnelInterface tunnelIntf = mIpSecManager.createIpSecTunnelInterface(
+ VTI_LOCAL_ADDRESS, GOOGLE_DNS_4, mock(Network.class));
+
+ assertNotNull(tunnelIntf);
+ return tunnelIntf;
+ }
+
+ @Test
+ public void testCreateVti() throws Exception {
+ IpSecManager.IpSecTunnelInterface tunnelIntf =
+ createAndValidateVti(DUMMY_RESOURCE_ID, VTI_INTF_NAME);
+
+ assertEquals(VTI_INTF_NAME, tunnelIntf.getInterfaceName());
+
+ tunnelIntf.close();
+ verify(mMockIpSecService).deleteTunnelInterface(eq(DUMMY_RESOURCE_ID));
+ }
+
+ @Test
+ public void testAddRemoveAddressesFromVti() throws Exception {
+ IpSecManager.IpSecTunnelInterface tunnelIntf =
+ createAndValidateVti(DUMMY_RESOURCE_ID, VTI_INTF_NAME);
+
+ tunnelIntf.addAddress(VTI_INNER_ADDRESS);
+ verify(mMockIpSecService)
+ .addAddressToTunnelInterface(eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS));
+
+ tunnelIntf.removeAddress(VTI_INNER_ADDRESS);
+ verify(mMockIpSecService)
+ .addAddressToTunnelInterface(eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS));
+ }
+} \ No newline at end of file
diff --git a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
index 3e1ff6dd5f32..410f754fb5ed 100644
--- a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
+++ b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
@@ -17,11 +17,13 @@
package com.android.server;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -32,6 +34,9 @@ import android.net.IpSecConfig;
import android.net.IpSecManager;
import android.net.IpSecSpiResponse;
import android.net.IpSecTransformResponse;
+import android.net.IpSecTunnelInterfaceResponse;
+import android.net.LinkAddress;
+import android.net.Network;
import android.net.NetworkUtils;
import android.os.Binder;
import android.os.ParcelFileDescriptor;
@@ -56,10 +61,15 @@ public class IpSecServiceParameterizedTest {
private final String mDestinationAddr;
private final String mSourceAddr;
+ private final LinkAddress mLocalInnerAddress;
@Parameterized.Parameters
public static Collection ipSecConfigs() {
- return Arrays.asList(new Object[][] {{"1.2.3.4", "8.8.4.4"}, {"2601::2", "2601::10"}});
+ return Arrays.asList(
+ new Object[][] {
+ {"1.2.3.4", "8.8.4.4", "10.0.1.1/24"},
+ {"2601::2", "2601::10", "2001:db8::1/64"}
+ });
}
private static final byte[] AEAD_KEY = {
@@ -86,6 +96,7 @@ public class IpSecServiceParameterizedTest {
INetd mMockNetd;
IpSecService.IpSecServiceConfiguration mMockIpSecSrvConfig;
IpSecService mIpSecService;
+ Network fakeNetwork = new Network(0xAB);
private static final IpSecAlgorithm AUTH_ALGO =
new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, AUTH_KEY, AUTH_KEY.length * 4);
@@ -94,9 +105,11 @@ public class IpSecServiceParameterizedTest {
private static final IpSecAlgorithm AEAD_ALGO =
new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 128);
- public IpSecServiceParameterizedTest(String sourceAddr, String destAddr) {
+ public IpSecServiceParameterizedTest(
+ String sourceAddr, String destAddr, String localInnerAddr) {
mSourceAddr = sourceAddr;
mDestinationAddr = destAddr;
+ mLocalInnerAddress = new LinkAddress(localInnerAddr);
}
@Before
@@ -308,6 +321,30 @@ public class IpSecServiceParameterizedTest {
}
@Test
+ public void testReleaseOwnedSpi() throws Exception {
+ IpSecConfig ipSecConfig = new IpSecConfig();
+ addDefaultSpisAndRemoteAddrToIpSecConfig(ipSecConfig);
+ addAuthAndCryptToIpSecConfig(ipSecConfig);
+
+ IpSecTransformResponse createTransformResp =
+ mIpSecService.createTransform(ipSecConfig, new Binder());
+ IpSecService.UserRecord userRecord =
+ mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
+ assertEquals(1, userRecord.mSpiQuotaTracker.mCurrent);
+ mIpSecService.releaseSecurityParameterIndex(ipSecConfig.getSpiResourceId());
+ verify(mMockNetd, times(0))
+ .ipSecDeleteSecurityAssociation(
+ eq(createTransformResp.resourceId),
+ anyString(),
+ anyString(),
+ eq(TEST_SPI),
+ anyInt(),
+ anyInt());
+ // quota is not released until the SPI is released by the Transform
+ assertEquals(1, userRecord.mSpiQuotaTracker.mCurrent);
+ }
+
+ @Test
public void testDeleteTransform() throws Exception {
IpSecConfig ipSecConfig = new IpSecConfig();
addDefaultSpisAndRemoteAddrToIpSecConfig(ipSecConfig);
@@ -317,7 +354,7 @@ public class IpSecServiceParameterizedTest {
mIpSecService.createTransform(ipSecConfig, new Binder());
mIpSecService.deleteTransform(createTransformResp.resourceId);
- verify(mMockNetd)
+ verify(mMockNetd, times(1))
.ipSecDeleteSecurityAssociation(
eq(createTransformResp.resourceId),
anyString(),
@@ -330,6 +367,21 @@ public class IpSecServiceParameterizedTest {
IpSecService.UserRecord userRecord =
mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
assertEquals(0, userRecord.mTransformQuotaTracker.mCurrent);
+ assertEquals(1, userRecord.mSpiQuotaTracker.mCurrent);
+
+ mIpSecService.releaseSecurityParameterIndex(ipSecConfig.getSpiResourceId());
+ // Verify that ipSecDeleteSa was not called when the SPI was released because the
+ // ownedByTransform property should prevent it; (note, the called count is cumulative).
+ verify(mMockNetd, times(1))
+ .ipSecDeleteSecurityAssociation(
+ anyInt(),
+ anyString(),
+ anyString(),
+ anyInt(),
+ anyInt(),
+ anyInt());
+ assertEquals(0, userRecord.mSpiQuotaTracker.mCurrent);
+
try {
userRecord.mTransformRecords.getRefcountedResourceOrThrow(
createTransformResp.resourceId);
@@ -406,4 +458,103 @@ public class IpSecServiceParameterizedTest {
verify(mMockNetd).ipSecRemoveTransportModeTransform(pfd.getFileDescriptor());
}
+
+ private IpSecTunnelInterfaceResponse createAndValidateTunnel(
+ String localAddr, String remoteAddr) {
+ IpSecTunnelInterfaceResponse createTunnelResp =
+ mIpSecService.createTunnelInterface(
+ mSourceAddr, mDestinationAddr, fakeNetwork, new Binder());
+
+ assertNotNull(createTunnelResp);
+ assertEquals(IpSecManager.Status.OK, createTunnelResp.status);
+ return createTunnelResp;
+ }
+
+ @Test
+ public void testCreateTunnelInterface() throws Exception {
+ IpSecTunnelInterfaceResponse createTunnelResp =
+ createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+
+ // Check that we have stored the tracking object, and retrieve it
+ IpSecService.UserRecord userRecord =
+ mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
+ IpSecService.RefcountedResource refcountedRecord =
+ userRecord.mTunnelInterfaceRecords.getRefcountedResourceOrThrow(
+ createTunnelResp.resourceId);
+
+ assertEquals(1, userRecord.mTunnelQuotaTracker.mCurrent);
+ verify(mMockNetd)
+ .addVirtualTunnelInterface(
+ eq(createTunnelResp.interfaceName),
+ eq(mSourceAddr),
+ eq(mDestinationAddr),
+ anyInt(),
+ anyInt());
+ }
+
+ @Test
+ public void testDeleteTunnelInterface() throws Exception {
+ IpSecTunnelInterfaceResponse createTunnelResp =
+ createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+
+ IpSecService.UserRecord userRecord =
+ mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
+
+ mIpSecService.deleteTunnelInterface(createTunnelResp.resourceId);
+
+ // Verify quota and RefcountedResource objects cleaned up
+ assertEquals(0, userRecord.mTunnelQuotaTracker.mCurrent);
+ verify(mMockNetd).removeVirtualTunnelInterface(eq(createTunnelResp.interfaceName));
+ try {
+ userRecord.mTunnelInterfaceRecords.getRefcountedResourceOrThrow(
+ createTunnelResp.resourceId);
+ fail("Expected IllegalArgumentException on attempt to access deleted resource");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ @Test
+ public void testTunnelInterfaceBinderDeath() throws Exception {
+ IpSecTunnelInterfaceResponse createTunnelResp =
+ createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+
+ IpSecService.UserRecord userRecord =
+ mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
+ IpSecService.RefcountedResource refcountedRecord =
+ userRecord.mTunnelInterfaceRecords.getRefcountedResourceOrThrow(
+ createTunnelResp.resourceId);
+
+ refcountedRecord.binderDied();
+
+ // Verify quota and RefcountedResource objects cleaned up
+ assertEquals(0, userRecord.mTunnelQuotaTracker.mCurrent);
+ verify(mMockNetd).removeVirtualTunnelInterface(eq(createTunnelResp.interfaceName));
+ try {
+ userRecord.mTunnelInterfaceRecords.getRefcountedResourceOrThrow(
+ createTunnelResp.resourceId);
+ fail("Expected IllegalArgumentException on attempt to access deleted resource");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ @Test
+ public void testAddRemoveAddressFromTunnelInterface() throws Exception {
+ IpSecTunnelInterfaceResponse createTunnelResp =
+ createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+
+ mIpSecService.addAddressToTunnelInterface(createTunnelResp.resourceId, mLocalInnerAddress);
+ verify(mMockNetd)
+ .interfaceAddAddress(
+ eq(createTunnelResp.interfaceName),
+ eq(mLocalInnerAddress.getAddress().getHostAddress()),
+ eq(mLocalInnerAddress.getPrefixLength()));
+
+ mIpSecService.removeAddressFromTunnelInterface(
+ createTunnelResp.resourceId, mLocalInnerAddress);
+ verify(mMockNetd)
+ .interfaceDelAddress(
+ eq(createTunnelResp.interfaceName),
+ eq(mLocalInnerAddress.getAddress().getHostAddress()),
+ eq(mLocalInnerAddress.getPrefixLength()));
+ }
}
diff --git a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
new file mode 100644
index 000000000000..4a83d1ba4f85
--- /dev/null
+++ b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.connectivity;
+
+import static android.Manifest.permission.CHANGE_NETWORK_STATE;
+import static android.Manifest.permission.CHANGE_WIFI_STATE;
+import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
+import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
+import static android.Manifest.permission.NETWORK_STACK;
+import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
+import static android.content.pm.PackageManager.GET_PERMISSIONS;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+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.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PermissionMonitorTest {
+ private static final int MOCK_UID = 10001;
+ private static final String[] MOCK_PACKAGE_NAMES = new String[] { "com.foo.bar" };
+
+ @Mock private Context mContext;
+ @Mock private PackageManager mPackageManager;
+
+ private PermissionMonitor mPermissionMonitor;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ when(mPackageManager.getPackagesForUid(MOCK_UID)).thenReturn(MOCK_PACKAGE_NAMES);
+ mPermissionMonitor = new PermissionMonitor(mContext, null);
+ }
+
+ private void expectPermission(String[] permissions, boolean preinstalled) throws Exception {
+ final PackageInfo packageInfo = packageInfoWithPermissions(permissions, preinstalled);
+ when(mPackageManager.getPackageInfo(MOCK_PACKAGE_NAMES[0], GET_PERMISSIONS))
+ .thenReturn(packageInfo);
+ }
+
+ private PackageInfo packageInfoWithPermissions(String[] permissions, boolean preinstalled) {
+ final PackageInfo packageInfo = new PackageInfo();
+ packageInfo.requestedPermissions = permissions;
+ packageInfo.applicationInfo = new ApplicationInfo();
+ packageInfo.applicationInfo.flags = preinstalled ? FLAG_SYSTEM : 0;
+ return packageInfo;
+ }
+
+ @Test
+ public void testHasPermission() {
+ PackageInfo app = packageInfoWithPermissions(new String[] {}, false);
+ assertFalse(mPermissionMonitor.hasPermission(app, CHANGE_NETWORK_STATE));
+ assertFalse(mPermissionMonitor.hasPermission(app, NETWORK_STACK));
+ assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
+ assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_INTERNAL));
+
+ app = packageInfoWithPermissions(new String[] {
+ CHANGE_NETWORK_STATE, NETWORK_STACK
+ }, false);
+ assertTrue(mPermissionMonitor.hasPermission(app, CHANGE_NETWORK_STATE));
+ assertTrue(mPermissionMonitor.hasPermission(app, NETWORK_STACK));
+ assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
+ assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_INTERNAL));
+
+ app = packageInfoWithPermissions(new String[] {
+ CONNECTIVITY_USE_RESTRICTED_NETWORKS, CONNECTIVITY_INTERNAL
+ }, false);
+ assertFalse(mPermissionMonitor.hasPermission(app, CHANGE_NETWORK_STATE));
+ assertFalse(mPermissionMonitor.hasPermission(app, NETWORK_STACK));
+ assertTrue(mPermissionMonitor.hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
+ assertTrue(mPermissionMonitor.hasPermission(app, CONNECTIVITY_INTERNAL));
+ }
+
+ @Test
+ public void testIsPreinstalledSystemApp() {
+ PackageInfo app = packageInfoWithPermissions(new String[] {}, false);
+ assertFalse(mPermissionMonitor.isPreinstalledSystemApp(app));
+
+ app = packageInfoWithPermissions(new String[] {}, true);
+ assertTrue(mPermissionMonitor.isPreinstalledSystemApp(app));
+ }
+
+ @Test
+ public void testHasUseBackgroundNetworksPermission() throws Exception {
+ expectPermission(new String[] { CHANGE_NETWORK_STATE }, false);
+ assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
+
+ expectPermission(new String[] { NETWORK_STACK, CONNECTIVITY_INTERNAL }, false);
+ assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
+
+ // TODO : make this false when b/31479477 is fixed
+ expectPermission(new String[] {}, true);
+ assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
+ expectPermission(new String[] { CHANGE_WIFI_STATE }, true);
+ assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
+
+ expectPermission(new String[] { NETWORK_STACK, CONNECTIVITY_INTERNAL }, true);
+ assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
+
+ expectPermission(new String[] {}, false);
+ assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
+
+ expectPermission(new String[] { CHANGE_WIFI_STATE }, false);
+ assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
+ }
+}
diff --git a/tests/testables/tests/Android.mk b/tests/testables/tests/Android.mk
index 3b0221c3ff03..79469e3aa032 100644
--- a/tests/testables/tests/Android.mk
+++ b/tests/testables/tests/Android.mk
@@ -41,5 +41,7 @@ LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base android.test.mock
LOCAL_CERTIFICATE := platform
+LOCAL_COMPATIBILITY_SUITE := device-tests
+
include $(BUILD_PACKAGE)